[
  {
    "path": ".deepsource.toml",
    "content": "version = 1\n\n[[analyzers]]\nname = \"javascript\"\n\n  [analyzers.meta]\n  plugins = [\"react\"]\n\n[[transformers]]\nname = \"prettier\""
  },
  {
    "path": ".dockerignore",
    "content": "Dockerfile\n.dockerignore\nnode_modules\nnpm-debug.log\n*.md\n.git\n.github\nLICENSE\ndocs/\n*.sqlite\n*.env\n.env\n.next/standalone/.env"
  },
  {
    "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: homarr\nko_fi: ajnart\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\notechie: # Replace with a single Otechie username\nlfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry\ncustom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug.yml",
    "content": "name: 🐛 Bug Report\ndescription: Report something that's broken, or not working like intented!\ntitle: '<title>'\nlabels: ['🐛 Bug']\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        > [!WARNING]  \n        > If you want to report a bug for 1.0, please open it on the new [repository](https://github.com/homarr-labs/homarr/issues/new/choose).\n  - type: dropdown\n    id: environment\n    attributes:\n      label: Environment\n      description: How have you deployed Homarr?\n      options:\n        - Docker\n        - NodeJS\n        - Cloud Service (Static)\n    validations:\n      required: true\n  - type: input\n    id: version\n    attributes:\n      label: Version\n      description: What version of Homarr are you running?\n      placeholder: 0.1.0\n    validations:\n      required: false\n  - type: textarea\n    id: repro\n    attributes:\n      label: Describe the problem\n      description: Please describe the problem exactly, how to reproduce it, actual results, and expected results.\n    validations:\n      required: true\n  - type: textarea\n    id: logs\n    attributes:\n      label: Logs\n      description: Provide your Homarr logs so we can investigate what's going on\n    validations:\n      required: false\n  - type: textarea\n    id: context\n    attributes:\n      label: Context\n      description: Screenshots? More info?\n    validations:\n      required: false\n  - type: checkboxes\n    id: idiot-check\n    attributes:\n      label: Please tick the boxes\n      description: Before submitting, please ensure that\n      options:\n        - label: I confirm that I attached the proper logs\n          required: true\n        - label: I've read the [docs](https://github.com/ajnart/homarr#readme)\n          required: true\n        - label: I've checked for [duplicate issues](https://github.com/ajnart/homarr/issues)\n          required: true\n        - label: I've tried to debug myself\n          required: true\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature-request.yml",
    "content": "name: ✨ Feature Request\ndescription: Request a feature to help improve Homarr!\ntitle: '<title>'\nlabels: ['✨ Feature']\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        > [!WARNING]  \n        > If you want to request a feature for 1.0, please open it on the new [repository](https://github.com/homarr-labs/homarr/issues/new/choose).\n  - type: textarea\n    id: feature\n    attributes:\n      label: Description \n      description: Describe the feature you would like to see. Tell us how you imagine it and try to provide as much useful information as possible. **PLEASE** use images/screenshots, include details about X & Y when requesting changes like X & Y service does, make your description atleast 300 characters. Having an unclear issue with too little detail will result in your issue being marked as invalid and closed.\n      placeholder: An outline of the feature you would like to see implemented, include as much detail as possible!\n    validations:\n      required: true\n  - type: dropdown\n    id: priority\n    attributes:\n      label: Priority\n      description: How urgent is the development of this feature?\n      options:\n        - Low (Nice-to-have)\n        - Medium (Would be very useful)\n        - High (App breaking feature)\n    validations:\n      required: true\n  - type: checkboxes\n    id: idiot-check\n    attributes:\n      label: Please tick the boxes\n      description: Before submitting, please ensure that\n      options:\n        - label: You are **NOT** using a version superior to v1. if that is the case, please fill this issue on the new repository. \n          required: true\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/idea.yml",
    "content": "name: 🤔 Idea\ndescription: Tell us your idea! We may implement it.\ntitle: '<title>'\nlabels: ['🤔 Idea']\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        > [!WARNING]  \n        > If you have an idea for 1.0, please open it on the new [repository](https://github.com/homarr-labs/homarr/issues/new/choose).\n  - type: textarea\n    id: feature\n    attributes:\n      label: Description \n      description: Tell us your idea! Please add as much details as possible.\n      placeholder: Maybe move ... to ...! Maybe add the version of Homarr somewhere...! Etc.\n    validations:\n      required: true\n  - type: checkboxes\n    id: idiot-check\n    attributes:\n      label: Please tick the boxes\n      description: Before submitting, please ensure that\n      options:\n        - label: You've read the [docs](https://github.com/ajnart/homarr#readme)\n          required: true\n        - label: You've checked for [duplicate issues](https://github.com/ajnart/homarr/issues)\n          required: true\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/module.yml",
    "content": "name: 🏗️ Module request\ndescription: Request for a module to be added / an integration with you favourite service !\ntitle: '<title>'\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        > [!WARNING]  \n        > If you want to request a new integration for 1.0, please open it on the new [repository](https://github.com/homarr-labs/homarr/issues/new/choose).\n  - type: textarea\n    id: name\n    attributes:\n      label: Name the integration\n      description: Please describe the name of the Module/Integration you want to see and info that could help us with adding it. For example screenshots/mockups for inspiration. API links or already existing JavaScript/TypeScript integration of the API\n    validations:\n      required: true\n  - type: checkboxes\n    id: idiot-check\n    attributes:\n      label: Please tick the boxes\n      description: Before submitting, please ensure that\n      options:\n        - label: You've read the [docs](https://github.com/ajnart/homarr#readme)\n          required: true\n        - label: You've checked for [duplicate issues](https://github.com/ajnart/homarr/issues)\n          required: true\n        - label: You're not just putting an idea out there and actually give usefull information about how to implement your module idea\n          required: true\n"
  },
  {
    "path": ".github/pull_request_template.md",
    "content": "*Thank you for contributing to Homarr! So that your Pull Request can be handled effectively, please populate the following fields (delete sections that are not applicable)*\n\n### Category\n> One of: Bugfix / Feature / Code style update / Refactoring Only / Build related changes /  Documentation / Other (Please specify!)\n\n### Overview\n> Briefly outline your new changes...\n\n### Issue Number _(if applicable)_\n> Related issue: #00\n\n### New Vars _(if applicable)_\n> If you've added any new build scripts, environmental variables, config file options, dependency please outline here.\n\n### Screenshot _(if applicable)_\n> If you've introduced any significant UI changes, please include a screenshot.\n"
  },
  {
    "path": ".github/release-note.md",
    "content": "## 🦞 Homarr [v0.0.0](https://github.com/ajnart/homarr/compare/v0.0.0...v0.0.0) (2022-01-01)\n\n<!-- Small release message -->\n\n<!-- Bigger announcement marked in bold -->\n\n### Upgrade Steps\n*Upgrading without a mounted config? Make sure to download your config from the settings first! You can add it back later by drag and dropping it into your browser.*\n* `docker pull ghcr.io/ajnart/homarr:latest`\n* `docker stop [container_id]`\n* `docker rm [container_id]`\n* `docker run --name homarr -p 7575:7575 -v /data/docker/homarr:/app/data/configs -d ghcr.io/ajnart/homarr:latest` \n   * *(or use our [docker_compose.yml](https://github.com/ajnart/homarr#-installation))*\n\n### Breaking Changes\n\n### New Features\n\n### Bug Fixes\n\n### UI Changes\n\n### GitHub Changes\n\n### Other Changes\n\n_**Special thanks to our contributors: @ajnart, @c00ldude1oo, @walkxcode, and of course all people using our project.**_\n"
  },
  {
    "path": ".github/renovate.json",
    "content": "{\n\t\"$schema\": \"https://docs.renovatebot.com/renovate-schema.json\",\n\t\"extends\": [\n\t\t\"config:base\"\n\t],\n\t\"commitMessagePrefix\": \"⬆️\",\n\t\"dependencyDashboard\": true,\n\t\"prCreation\": \"approval\",\n\t\"lockFileMaintenance\": {\n\t\t\"automerge\": false\n\t},\n\t\"minor\": {\n\t\t\"automerge\": false\n\t},\n\t\"patch\": {\n\t\t\"automerge\": false\n\t},\n\t\"pin\": {\n\t\t\"automerge\": false\n\t}\n}"
  },
  {
    "path": ".github/workflows/docker.yml",
    "content": "name: Master CI\n# This workflow uses actions that are not certified by GitHub.\n# They are provided by a third-party and are governed by\n# separate terms of service, privacy policy, and support\n# documentation.\non:\n  push:\n    branches: [master]\n    tags:\n      - v*\n    \n  workflow_dispatch:\n\nenv:\n  # Use docker.io for Docker Hub if empty\n  REGISTRY: ghcr.io\n  # github.repository as <account>/<repo>\n  IMAGE_NAME: ${{ github.repository }}\n  TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}\n  TURBO_TEAM: ${{ secrets.TURBO_TEAM }}\n\n\njobs:\n  # Push image to GitHub Packages.\n  # See also https://docs.docker.com/docker-hub/builds/\n  yarn_install_and_build:\n    runs-on: ubuntu-latest\n    permissions:\n      packages: write\n      contents: read\n    steps:\n\n      - name: Setup\n        uses: actions/setup-node@v3\n\n      - name: Checkout\n        uses: actions/checkout@v3\n\n      - name: Get yarn cache directory path\n        id: yarn-cache-dir-path\n        run: echo \"::set-output name=dir::$(yarn config get cacheFolder)\"\n      \n      - uses: actions/cache@v3\n        id: yarn-cache\n        with:\n          path: ${{ steps.yarn-cache-dir-path.outputs.dir }}\n          key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}\n          restore-keys: |\n            ${{ runner.os }}-yarn-\n\n      - name: Restore NextJS cache\n        uses: actions/cache@v3\n        with:\n          # See here for caching with `yarn` https://github.com/actions/cache/blob/main/examples.md#node---yarn or you can leverage caching with actions/setup-node https://github.com/actions/setup-node\n          path: |\n            ${{ github.workspace }}/.next/cache\n          # Generate a new cache whenever packages or source files change.\n          key: ${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json') }}-${{ hashFiles('**.[jt]s', '**.[jt]sx') }}\n          # If source files changed but packages didn't, rebuild from a prior cache.\n          restore-keys: |\n            ${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json') }}-\n\n      - run: yarn install\n\n      - run: yarn turbo build\n\n      - name: Docker meta\n        id: meta\n        uses: docker/metadata-action@v4\n        with:\n          # list of Docker images to use as base name for tags\n          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}\n          # generate Docker tags based on the following events/attributes\n          tags: |\n            type=raw,value=latest\n            type=pep440,pattern={{version}}\n\n      - name: Set up QEMU\n        uses: docker/setup-qemu-action@v2\n\n      - name: Set up Docker Buildx\n        uses: docker/setup-buildx-action@v2\n\n      - name: Login to GHCR\n        uses: docker/login-action@v2\n        with:\n          registry: ghcr.io\n          username: ${{ github.repository_owner }}\n          password: ${{ secrets.GITHUB_TOKEN }}\n\n      - name: Build and push\n        uses: docker/build-push-action@v4\n        with:\n          platforms: linux/amd64,linux/arm64,linux/arm/v7\n          context: .\n          push: true\n          tags: ${{ steps.meta.outputs.tags }}\n          labels: ${{ steps.meta.outputs.labels }}\n          cache-from: type=gha\n          cache-to: type=gha,mode=max\n          network: host\n"
  },
  {
    "path": ".github/workflows/docker_dev.yml",
    "content": "name: Development CI\n\non:\n  push:\n    branches: [dev]\n    paths-ignore:\n      - '.github/**'\n      - '**.md'\n  pull_request:\n    paths-ignore:\n      - '.github/**'\n      - '**.md'\n  workflow_dispatch:\n    inputs:\n      tag:\n        required: true\n        description: 'Tag to deploy to'\n\ndefaults:\n  run:\n    working-directory: ./\n\nenv:\n  # Use docker.io for Docker Hub if empty\n  REGISTRY: ghcr.io\n  # github.repository as <account>/<repo>\n  IMAGE_NAME: ${{ github.repository }}\n  TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}\n  TURBO_TEAM: ${{ secrets.TURBO_TEAM }}\n \npermissions:\n  contents: read # for checkout repository\n  actions: read # for fetching base branch bundle stats\n  pull-requests: write # for comments\n\njobs:\n  # Push image to GitHub Packages.\n  # See also https://docs.docker.com/docker-hub/builds/\n  yarn_install_and_build_dev:\n    runs-on: ubuntu-latest\n    permissions:\n      packages: write\n      contents: read\n      pull-requests: write\n    steps:\n\n      - name: Setup\n        uses: actions/setup-node@v3\n\n      - name: Checkout\n        uses: actions/checkout@v3\n\n      - name: Get yarn cache directory path\n        id: yarn-cache-dir-path\n        run: echo \"::set-output name=dir::$(yarn config get cacheFolder)\"\n      \n      - uses: actions/cache@v3\n        id: yarn-cache\n        with:\n          path: ${{ steps.yarn-cache-dir-path.outputs.dir }}\n          key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}\n          restore-keys: |\n            ${{ runner.os }}-yarn-\n\n      - name: Restore next build\n        uses: actions/cache@v3\n        id: restore-build-cache\n        env:\n          cache-name: cache-next-build\n        with:\n          path: .next/cache\n          key: ${{ runner.os }}-build-${{ env.cache-name }}\n\n      - run: yarn install\n\n      - run: yarn turbo build\n\n      - run: yarn test:coverage\n\n      - name: Report coverage\n        if: always()\n        uses: davelosert/vitest-coverage-report-action@v2\n\n      - name: Docker meta\n        if: github.event_name != 'pull_request'\n        id: meta\n        uses: docker/metadata-action@v4\n        with:\n          # list of Docker images to use as base name for tags\n          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}\n          # generate Docker tags based on the following events/attributes\n          tags: |\n            type=ref,event=pr\n            type=raw,value=${{ github.event.inputs.tag }},enable=${{ github.event.inputs.tag != '' }}\n            tpye=raw,value=dev,priority=1,enable=${{ github.event.inputs.tag == '' }}\n\n      - name: Set up QEMU\n        uses: docker/setup-qemu-action@v2\n\n      - name: Set up Docker Buildx\n        uses: docker/setup-buildx-action@v2\n\n      - name: Login to GHCR\n        if: github.event_name != 'pull_request'\n        uses: docker/login-action@v2\n        with:\n          registry: ghcr.io\n          username: ${{ github.repository_owner }}\n          password: ${{ secrets.GITHUB_TOKEN }}\n\n      - name: Build and push\n        if: github.event_name != 'pull_request'\n        uses: docker/build-push-action@v4\n        with:\n          platforms: linux/amd64,linux/arm64\n          context: .\n          push: ${{ github.event_name != 'pull_request' }}\n          tags: ${{ steps.meta.outputs.tags }}\n          labels: ${{ steps.meta.outputs.labels }}\n          cache-from: type=gha\n          cache-to: type=gha,mode=max\n          network: host\n"
  },
  {
    "path": ".github/workflows/greetings.yml",
    "content": "name: Greetings\n\non: [pull_request_target, issues]\n\njobs:\n  greeting:\n    runs-on: ubuntu-latest\n    permissions:\n      issues: write\n      pull-requests: write\n    steps:\n    - uses: actions/first-interaction@v1\n      with:\n        repo-token: ${{ secrets.GITHUB_TOKEN }}\n        issue-message: \"Hi 👋. Thank you for submitting your first issue to Homarr. Please ensure that you've opened this issue on the correct repository. Homarr v1 has been moved to github.com/homarr-labs/homarr \"\n        pr-message: \"Hi 👋. Thank you for making your first contribution to Homarr. Please ensure that you've completed all the points in the TODO checklist. We'll review your changes shortly.\"\n"
  },
  {
    "path": ".github/workflows/stale.yml",
    "content": "# This workflow warns and then closes issues and PRs that have had no activity for a specified amount of time.\n#\n# You can adjust the behavior by modifying this file.\n# For more information, see:\n# https://github.com/actions/stale\nname: Mark stale issues and pull requests\n\non:\n  schedule:\n  - cron: '18 17 * * *'\n\njobs:\n  stale:\n\n    runs-on: ubuntu-latest\n    permissions:\n      issues: write\n      pull-requests: write\n\n    steps:\n    - uses: actions/stale@v5\n      with:\n        repo-token: ${{ secrets.GITHUB_TOKEN }}\n        stale-issue-message: \"Hello 👋, this issue has been open for 60 days without activity. We mark issues to help prioritise and close dead issues. Can you confirm that this issue is still relevant on the latest version? I'll remove the stale label as soon as there is further activity on this issue. Thank you 🙏\"\n        stale-pr-message: 'Hello 👋, this PR has gone stale. Please reply to mark it as active.'\n        stale-issue-label: 'Stale'\n        stale-pr-label: 'Stale'\n        days-before-close: -1\n"
  },
  {
    "path": ".gitignore",
    "content": "# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n\n# dependencies\n/node_modules\n/.pnp\n.pnp.js\n/cli/node_modules/\n\n# testing\n/coverage\n\n# next.js\n/.next/\n/out/\n\n# production\n/build\n\n# misc\n.DS_Store\n*.pem\n\n# debug\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n# local env files\n.env\n.env.local\n.env.development.local\n.env.test.local\n.env.production.local\n\n# vercel\n.vercel\n.turbo\n*.tsbuildinfo\n\n# storybook\nstorybook-static\ndata/configs\n\n# https://yarnpkg.com/getting-started/qa#which-files-should-be-gitignored\n# Yarn v2\n.pnp.*\n.yarn/*\n!.yarn/patches\n!.yarn/plugins\n!.yarn/releases\n!.yarn/sdks\n!.yarn/versions\n/cli/.yarn/\n\n#envfiles\n.env\n\n#Languages other than 'en'\npublic/locales/*\n!public/locales/en\n\n#database\nsqlite.db\ndatabase/*.sqlite\nWILL_BE_OVERWRITTEN.sqlite\n\n# IDE\n.idea/*"
  },
  {
    "path": ".vscode/launch.json",
    "content": "{\n\t\"version\": \"0.2.0\",\n\t\"configurations\": [\n\t\t{\n\t\t\t\"name\": \"Next.js: debug server-side\",\n\t\t\t\"type\": \"node-terminal\",\n\t\t\t\"request\": \"launch\",\n\t\t\t\"command\": \"yarn dev\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"Next.js: debug client-side\",\n\t\t\t\"type\": \"chrome\",\n\t\t\t\"request\": \"launch\",\n\t\t\t\"url\": \"http://localhost:3000\"\n\t\t},\n\t\t{\n\t\t\t\"name\": \"Next.js: debug full stack\",\n\t\t\t\"type\": \"node-terminal\",\n\t\t\t\"request\": \"launch\",\n\t\t\t\"command\": \"yarn dev\",\n\t\t\t\"serverReadyAction\": {\n\t\t\t\t\"pattern\": \"started server on .+, url: (https?://.+)\",\n\t\t\t\t\"uriFormat\": \"%s\",\n\t\t\t\t\"action\": \"debugWithChrome\"\n\t\t\t}\n\t\t}\n\t]\n}"
  },
  {
    "path": ".vscode/settings.json",
    "content": "{\n\t\"i18n-ally.localesPaths\": \"public/locales\",\n\t\"i18n-ally.enabledFrameworks\": [\n\t\t\"react-i18next\"\n\t],\n\t\"i18n-ally.namespace\": true,\n\t\"i18n-ally.pathMatcher\": \"{locale}/{namespaces}.json\",\n\t\"i18n-ally.keystyle\": \"nested\",\n\t\"i18n-ally.keysInUse\": [\n\t\t\"modules.**\",\n\t\t\"layout.manage.navigation.**\",\n\t],\n\t\"editor.codeActionsOnSave\": {\n\t\t\"source.organizeImports\": \"explicit\"\n\t},\n\t\"typescript.tsdk\": \"node_modules/typescript/lib\",\n\t\"explorer.fileNesting.patterns\": {\n\t\t\"package.json\": \"pnpm-lock.yaml, yarn.lock, package-lock.json\",\n\t\t\"*.tsx\": \"${capture}.module.css\"\n\t},\n}"
  },
  {
    "path": ".yarn/releases/yarn-3.6.0.cjs",
    "content": "#!/usr/bin/env node\n/* eslint-disable */\n//prettier-ignore\n(()=>{var xge=Object.create;var lS=Object.defineProperty;var Pge=Object.getOwnPropertyDescriptor;var Dge=Object.getOwnPropertyNames;var kge=Object.getPrototypeOf,Rge=Object.prototype.hasOwnProperty;var J=(r=>typeof require<\"u\"?require:typeof Proxy<\"u\"?new Proxy(r,{get:(e,t)=>(typeof require<\"u\"?require:e)[t]}):r)(function(r){if(typeof require<\"u\")return require.apply(this,arguments);throw new Error('Dynamic require of \"'+r+'\" is not supported')});var Fge=(r,e)=>()=>(r&&(e=r(r=0)),e);var w=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),ut=(r,e)=>{for(var t in e)lS(r,t,{get:e[t],enumerable:!0})},Nge=(r,e,t,i)=>{if(e&&typeof e==\"object\"||typeof e==\"function\")for(let n of Dge(e))!Rge.call(r,n)&&n!==t&&lS(r,n,{get:()=>e[n],enumerable:!(i=Pge(e,n))||i.enumerable});return r};var Pe=(r,e,t)=>(t=r!=null?xge(kge(r)):{},Nge(e||!r||!r.__esModule?lS(t,\"default\",{value:r,enumerable:!0}):t,r));var vK=w((J7e,SK)=>{SK.exports=bK;bK.sync=tfe;var BK=J(\"fs\");function efe(r,e){var t=e.pathExt!==void 0?e.pathExt:process.env.PATHEXT;if(!t||(t=t.split(\";\"),t.indexOf(\"\")!==-1))return!0;for(var i=0;i<t.length;i++){var n=t[i].toLowerCase();if(n&&r.substr(-n.length).toLowerCase()===n)return!0}return!1}function QK(r,e,t){return!r.isSymbolicLink()&&!r.isFile()?!1:efe(e,t)}function bK(r,e,t){BK.stat(r,function(i,n){t(i,i?!1:QK(n,r,e))})}function tfe(r,e){return QK(BK.statSync(r),r,e)}});var RK=w((W7e,kK)=>{kK.exports=PK;PK.sync=rfe;var xK=J(\"fs\");function PK(r,e,t){xK.stat(r,function(i,n){t(i,i?!1:DK(n,e))})}function rfe(r,e){return DK(xK.statSync(r),e)}function DK(r,e){return r.isFile()&&ife(r,e)}function ife(r,e){var t=r.mode,i=r.uid,n=r.gid,s=e.uid!==void 0?e.uid:process.getuid&&process.getuid(),o=e.gid!==void 0?e.gid:process.getgid&&process.getgid(),a=parseInt(\"100\",8),l=parseInt(\"010\",8),c=parseInt(\"001\",8),u=a|l,g=t&c||t&l&&n===o||t&a&&i===s||t&u&&s===0;return g}});var NK=w((V7e,FK)=>{var z7e=J(\"fs\"),lI;process.platform===\"win32\"||global.TESTING_WINDOWS?lI=vK():lI=RK();FK.exports=SS;SS.sync=nfe;function SS(r,e,t){if(typeof e==\"function\"&&(t=e,e={}),!t){if(typeof Promise!=\"function\")throw new TypeError(\"callback not provided\");return new Promise(function(i,n){SS(r,e||{},function(s,o){s?n(s):i(o)})})}lI(r,e||{},function(i,n){i&&(i.code===\"EACCES\"||e&&e.ignoreErrors)&&(i=null,n=!1),t(i,n)})}function nfe(r,e){try{return lI.sync(r,e||{})}catch(t){if(e&&e.ignoreErrors||t.code===\"EACCES\")return!1;throw t}}});var HK=w((X7e,UK)=>{var Dg=process.platform===\"win32\"||process.env.OSTYPE===\"cygwin\"||process.env.OSTYPE===\"msys\",TK=J(\"path\"),sfe=Dg?\";\":\":\",LK=NK(),OK=r=>Object.assign(new Error(`not found: ${r}`),{code:\"ENOENT\"}),MK=(r,e)=>{let t=e.colon||sfe,i=r.match(/\\//)||Dg&&r.match(/\\\\/)?[\"\"]:[...Dg?[process.cwd()]:[],...(e.path||process.env.PATH||\"\").split(t)],n=Dg?e.pathExt||process.env.PATHEXT||\".EXE;.CMD;.BAT;.COM\":\"\",s=Dg?n.split(t):[\"\"];return Dg&&r.indexOf(\".\")!==-1&&s[0]!==\"\"&&s.unshift(\"\"),{pathEnv:i,pathExt:s,pathExtExe:n}},KK=(r,e,t)=>{typeof e==\"function\"&&(t=e,e={}),e||(e={});let{pathEnv:i,pathExt:n,pathExtExe:s}=MK(r,e),o=[],a=c=>new Promise((u,g)=>{if(c===i.length)return e.all&&o.length?u(o):g(OK(r));let f=i[c],h=/^\".*\"$/.test(f)?f.slice(1,-1):f,p=TK.join(h,r),C=!h&&/^\\.[\\\\\\/]/.test(r)?r.slice(0,2)+p:p;u(l(C,c,0))}),l=(c,u,g)=>new Promise((f,h)=>{if(g===n.length)return f(a(u+1));let p=n[g];LK(c+p,{pathExt:s},(C,y)=>{if(!C&&y)if(e.all)o.push(c+p);else return f(c+p);return f(l(c,u,g+1))})});return t?a(0).then(c=>t(null,c),t):a(0)},ofe=(r,e)=>{e=e||{};let{pathEnv:t,pathExt:i,pathExtExe:n}=MK(r,e),s=[];for(let o=0;o<t.length;o++){let a=t[o],l=/^\".*\"$/.test(a)?a.slice(1,-1):a,c=TK.join(l,r),u=!l&&/^\\.[\\\\\\/]/.test(r)?r.slice(0,2)+c:c;for(let g=0;g<i.length;g++){let f=u+i[g];try{if(LK.sync(f,{pathExt:n}))if(e.all)s.push(f);else return f}catch{}}}if(e.all&&s.length)return s;if(e.nothrow)return null;throw OK(r)};UK.exports=KK;KK.sync=ofe});var YK=w((Z7e,vS)=>{\"use strict\";var GK=(r={})=>{let e=r.env||process.env;return(r.platform||process.platform)!==\"win32\"?\"PATH\":Object.keys(e).reverse().find(i=>i.toUpperCase()===\"PATH\")||\"Path\"};vS.exports=GK;vS.exports.default=GK});var WK=w((_7e,JK)=>{\"use strict\";var jK=J(\"path\"),afe=HK(),Afe=YK();function qK(r,e){let t=r.options.env||process.env,i=process.cwd(),n=r.options.cwd!=null,s=n&&process.chdir!==void 0&&!process.chdir.disabled;if(s)try{process.chdir(r.options.cwd)}catch{}let o;try{o=afe.sync(r.command,{path:t[Afe({env:t})],pathExt:e?jK.delimiter:void 0})}catch{}finally{s&&process.chdir(i)}return o&&(o=jK.resolve(n?r.options.cwd:\"\",o)),o}function lfe(r){return qK(r)||qK(r,!0)}JK.exports=lfe});var zK=w(($7e,PS)=>{\"use strict\";var xS=/([()\\][%!^\"`<>&|;, *?])/g;function cfe(r){return r=r.replace(xS,\"^$1\"),r}function ufe(r,e){return r=`${r}`,r=r.replace(/(\\\\*)\"/g,'$1$1\\\\\"'),r=r.replace(/(\\\\*)$/,\"$1$1\"),r=`\"${r}\"`,r=r.replace(xS,\"^$1\"),e&&(r=r.replace(xS,\"^$1\")),r}PS.exports.command=cfe;PS.exports.argument=ufe});var XK=w((eZe,VK)=>{\"use strict\";VK.exports=/^#!(.*)/});var _K=w((tZe,ZK)=>{\"use strict\";var gfe=XK();ZK.exports=(r=\"\")=>{let e=r.match(gfe);if(!e)return null;let[t,i]=e[0].replace(/#! ?/,\"\").split(\" \"),n=t.split(\"/\").pop();return n===\"env\"?i:i?`${n} ${i}`:n}});var eU=w((rZe,$K)=>{\"use strict\";var DS=J(\"fs\"),ffe=_K();function hfe(r){let t=Buffer.alloc(150),i;try{i=DS.openSync(r,\"r\"),DS.readSync(i,t,0,150,0),DS.closeSync(i)}catch{}return ffe(t.toString())}$K.exports=hfe});var nU=w((iZe,iU)=>{\"use strict\";var pfe=J(\"path\"),tU=WK(),rU=zK(),dfe=eU(),Cfe=process.platform===\"win32\",mfe=/\\.(?:com|exe)$/i,Efe=/node_modules[\\\\/].bin[\\\\/][^\\\\/]+\\.cmd$/i;function Ife(r){r.file=tU(r);let e=r.file&&dfe(r.file);return e?(r.args.unshift(r.file),r.command=e,tU(r)):r.file}function yfe(r){if(!Cfe)return r;let e=Ife(r),t=!mfe.test(e);if(r.options.forceShell||t){let i=Efe.test(e);r.command=pfe.normalize(r.command),r.command=rU.command(r.command),r.args=r.args.map(s=>rU.argument(s,i));let n=[r.command].concat(r.args).join(\" \");r.args=[\"/d\",\"/s\",\"/c\",`\"${n}\"`],r.command=process.env.comspec||\"cmd.exe\",r.options.windowsVerbatimArguments=!0}return r}function wfe(r,e,t){e&&!Array.isArray(e)&&(t=e,e=null),e=e?e.slice(0):[],t=Object.assign({},t);let i={command:r,args:e,options:t,file:void 0,original:{command:r,args:e}};return t.shell?i:yfe(i)}iU.exports=wfe});var aU=w((nZe,oU)=>{\"use strict\";var kS=process.platform===\"win32\";function RS(r,e){return Object.assign(new Error(`${e} ${r.command} ENOENT`),{code:\"ENOENT\",errno:\"ENOENT\",syscall:`${e} ${r.command}`,path:r.command,spawnargs:r.args})}function Bfe(r,e){if(!kS)return;let t=r.emit;r.emit=function(i,n){if(i===\"exit\"){let s=sU(n,e,\"spawn\");if(s)return t.call(r,\"error\",s)}return t.apply(r,arguments)}}function sU(r,e){return kS&&r===1&&!e.file?RS(e.original,\"spawn\"):null}function Qfe(r,e){return kS&&r===1&&!e.file?RS(e.original,\"spawnSync\"):null}oU.exports={hookChildProcess:Bfe,verifyENOENT:sU,verifyENOENTSync:Qfe,notFoundError:RS}});var TS=w((sZe,kg)=>{\"use strict\";var AU=J(\"child_process\"),FS=nU(),NS=aU();function lU(r,e,t){let i=FS(r,e,t),n=AU.spawn(i.command,i.args,i.options);return NS.hookChildProcess(n,i),n}function bfe(r,e,t){let i=FS(r,e,t),n=AU.spawnSync(i.command,i.args,i.options);return n.error=n.error||NS.verifyENOENTSync(n.status,i),n}kg.exports=lU;kg.exports.spawn=lU;kg.exports.sync=bfe;kg.exports._parse=FS;kg.exports._enoent=NS});var uU=w((oZe,cU)=>{\"use strict\";function Sfe(r,e){function t(){this.constructor=r}t.prototype=e.prototype,r.prototype=new t}function Zl(r,e,t,i){this.message=r,this.expected=e,this.found=t,this.location=i,this.name=\"SyntaxError\",typeof Error.captureStackTrace==\"function\"&&Error.captureStackTrace(this,Zl)}Sfe(Zl,Error);Zl.buildMessage=function(r,e){var t={literal:function(c){return'\"'+n(c.text)+'\"'},class:function(c){var u=\"\",g;for(g=0;g<c.parts.length;g++)u+=c.parts[g]instanceof Array?s(c.parts[g][0])+\"-\"+s(c.parts[g][1]):s(c.parts[g]);return\"[\"+(c.inverted?\"^\":\"\")+u+\"]\"},any:function(c){return\"any character\"},end:function(c){return\"end of input\"},other:function(c){return c.description}};function i(c){return c.charCodeAt(0).toString(16).toUpperCase()}function n(c){return c.replace(/\\\\/g,\"\\\\\\\\\").replace(/\"/g,'\\\\\"').replace(/\\0/g,\"\\\\0\").replace(/\\t/g,\"\\\\t\").replace(/\\n/g,\"\\\\n\").replace(/\\r/g,\"\\\\r\").replace(/[\\x00-\\x0F]/g,function(u){return\"\\\\x0\"+i(u)}).replace(/[\\x10-\\x1F\\x7F-\\x9F]/g,function(u){return\"\\\\x\"+i(u)})}function s(c){return c.replace(/\\\\/g,\"\\\\\\\\\").replace(/\\]/g,\"\\\\]\").replace(/\\^/g,\"\\\\^\").replace(/-/g,\"\\\\-\").replace(/\\0/g,\"\\\\0\").replace(/\\t/g,\"\\\\t\").replace(/\\n/g,\"\\\\n\").replace(/\\r/g,\"\\\\r\").replace(/[\\x00-\\x0F]/g,function(u){return\"\\\\x0\"+i(u)}).replace(/[\\x10-\\x1F\\x7F-\\x9F]/g,function(u){return\"\\\\x\"+i(u)})}function o(c){return t[c.type](c)}function a(c){var u=new Array(c.length),g,f;for(g=0;g<c.length;g++)u[g]=o(c[g]);if(u.sort(),u.length>0){for(g=1,f=1;g<u.length;g++)u[g-1]!==u[g]&&(u[f]=u[g],f++);u.length=f}switch(u.length){case 1:return u[0];case 2:return u[0]+\" or \"+u[1];default:return u.slice(0,-1).join(\", \")+\", or \"+u[u.length-1]}}function l(c){return c?'\"'+n(c)+'\"':\"end of input\"}return\"Expected \"+a(r)+\" but \"+l(e)+\" found.\"};function vfe(r,e){e=e!==void 0?e:{};var t={},i={Start:vA},n=vA,s=function(m){return m||[]},o=function(m,b,N){return[{command:m,type:b}].concat(N||[])},a=function(m,b){return[{command:m,type:b||\";\"}]},l=function(m){return m},c=\";\",u=me(\";\",!1),g=\"&\",f=me(\"&\",!1),h=function(m,b){return b?{chain:m,then:b}:{chain:m}},p=function(m,b){return{type:m,line:b}},C=\"&&\",y=me(\"&&\",!1),B=\"||\",v=me(\"||\",!1),D=function(m,b){return b?{...m,then:b}:m},T=function(m,b){return{type:m,chain:b}},H=\"|&\",j=me(\"|&\",!1),$=\"|\",V=me(\"|\",!1),W=\"=\",_=me(\"=\",!1),A=function(m,b){return{name:m,args:[b]}},Ae=function(m){return{name:m,args:[]}},ge=\"(\",re=me(\"(\",!1),O=\")\",F=me(\")\",!1),ue=function(m,b){return{type:\"subshell\",subshell:m,args:b}},pe=\"{\",ke=me(\"{\",!1),Fe=\"}\",Ne=me(\"}\",!1),oe=function(m,b){return{type:\"group\",group:m,args:b}},le=function(m,b){return{type:\"command\",args:b,envs:m}},Be=function(m){return{type:\"envs\",envs:m}},fe=function(m){return m},ae=function(m){return m},qe=/^[0-9]/,ne=Je([[\"0\",\"9\"]],!1,!1),Y=function(m,b,N){return{type:\"redirection\",subtype:b,fd:m!==null?parseInt(m):null,args:[N]}},he=\">>\",ie=me(\">>\",!1),de=\">&\",_e=me(\">&\",!1),Pt=\">\",It=me(\">\",!1),Or=\"<<<\",ii=me(\"<<<\",!1),gi=\"<&\",hr=me(\"<&\",!1),fi=\"<\",ni=me(\"<\",!1),Ks=function(m){return{type:\"argument\",segments:[].concat(...m)}},pr=function(m){return m},Ii=\"$'\",rs=me(\"$'\",!1),fa=\"'\",CA=me(\"'\",!1),cg=function(m){return[{type:\"text\",text:m}]},is='\"\"',mA=me('\"\"',!1),ha=function(){return{type:\"text\",text:\"\"}},wp='\"',EA=me('\"',!1),IA=function(m){return m},wr=function(m){return{type:\"arithmetic\",arithmetic:m,quoted:!0}},Tl=function(m){return{type:\"shell\",shell:m,quoted:!0}},ug=function(m){return{type:\"variable\",...m,quoted:!0}},Io=function(m){return{type:\"text\",text:m}},gg=function(m){return{type:\"arithmetic\",arithmetic:m,quoted:!1}},Bp=function(m){return{type:\"shell\",shell:m,quoted:!1}},Qp=function(m){return{type:\"variable\",...m,quoted:!1}},vr=function(m){return{type:\"glob\",pattern:m}},se=/^[^']/,yo=Je([\"'\"],!0,!1),Fn=function(m){return m.join(\"\")},fg=/^[^$\"]/,Qt=Je([\"$\",'\"'],!0,!1),Ll=`\\\\\n`,Nn=me(`\\\\\n`,!1),ns=function(){return\"\"},ss=\"\\\\\",gt=me(\"\\\\\",!1),wo=/^[\\\\$\"`]/,At=Je([\"\\\\\",\"$\",'\"',\"`\"],!1,!1),ln=function(m){return m},S=\"\\\\a\",Lt=me(\"\\\\a\",!1),hg=function(){return\"a\"},Ol=\"\\\\b\",bp=me(\"\\\\b\",!1),Sp=function(){return\"\\b\"},vp=/^[Ee]/,xp=Je([\"E\",\"e\"],!1,!1),Pp=function(){return\"\\x1B\"},G=\"\\\\f\",yt=me(\"\\\\f\",!1),yA=function(){return\"\\f\"},zi=\"\\\\n\",Ml=me(\"\\\\n\",!1),Xe=function(){return`\n`},pa=\"\\\\r\",pg=me(\"\\\\r\",!1),OE=function(){return\"\\r\"},Dp=\"\\\\t\",ME=me(\"\\\\t\",!1),ar=function(){return\"\t\"},Tn=\"\\\\v\",Kl=me(\"\\\\v\",!1),kp=function(){return\"\\v\"},Us=/^[\\\\'\"?]/,da=Je([\"\\\\\",\"'\",'\"',\"?\"],!1,!1),cn=function(m){return String.fromCharCode(parseInt(m,16))},Le=\"\\\\x\",dg=me(\"\\\\x\",!1),Ul=\"\\\\u\",Hs=me(\"\\\\u\",!1),Hl=\"\\\\U\",wA=me(\"\\\\U\",!1),Cg=function(m){return String.fromCodePoint(parseInt(m,16))},mg=/^[0-7]/,Ca=Je([[\"0\",\"7\"]],!1,!1),ma=/^[0-9a-fA-f]/,rt=Je([[\"0\",\"9\"],[\"a\",\"f\"],[\"A\",\"f\"]],!1,!1),Bo=nt(),BA=\"-\",Gl=me(\"-\",!1),Gs=\"+\",Yl=me(\"+\",!1),KE=\".\",Rp=me(\".\",!1),Eg=function(m,b,N){return{type:\"number\",value:(m===\"-\"?-1:1)*parseFloat(b.join(\"\")+\".\"+N.join(\"\"))}},Fp=function(m,b){return{type:\"number\",value:(m===\"-\"?-1:1)*parseInt(b.join(\"\"))}},UE=function(m){return{type:\"variable\",...m}},jl=function(m){return{type:\"variable\",name:m}},HE=function(m){return m},Ig=\"*\",QA=me(\"*\",!1),Rr=\"/\",GE=me(\"/\",!1),Ys=function(m,b,N){return{type:b===\"*\"?\"multiplication\":\"division\",right:N}},js=function(m,b){return b.reduce((N,U)=>({left:N,...U}),m)},yg=function(m,b,N){return{type:b===\"+\"?\"addition\":\"subtraction\",right:N}},bA=\"$((\",R=me(\"$((\",!1),q=\"))\",Ce=me(\"))\",!1),Ke=function(m){return m},Re=\"$(\",ze=me(\"$(\",!1),dt=function(m){return m},Ft=\"${\",Ln=me(\"${\",!1),Jb=\":-\",P1=me(\":-\",!1),D1=function(m,b){return{name:m,defaultValue:b}},Wb=\":-}\",k1=me(\":-}\",!1),R1=function(m){return{name:m,defaultValue:[]}},zb=\":+\",F1=me(\":+\",!1),N1=function(m,b){return{name:m,alternativeValue:b}},Vb=\":+}\",T1=me(\":+}\",!1),L1=function(m){return{name:m,alternativeValue:[]}},Xb=function(m){return{name:m}},O1=\"$\",M1=me(\"$\",!1),K1=function(m){return e.isGlobPattern(m)},U1=function(m){return m},Zb=/^[a-zA-Z0-9_]/,_b=Je([[\"a\",\"z\"],[\"A\",\"Z\"],[\"0\",\"9\"],\"_\"],!1,!1),$b=function(){return L()},eS=/^[$@*?#a-zA-Z0-9_\\-]/,tS=Je([\"$\",\"@\",\"*\",\"?\",\"#\",[\"a\",\"z\"],[\"A\",\"Z\"],[\"0\",\"9\"],\"_\",\"-\"],!1,!1),H1=/^[(){}<>$|&; \\t\"']/,wg=Je([\"(\",\")\",\"{\",\"}\",\"<\",\">\",\"$\",\"|\",\"&\",\";\",\" \",\"\t\",'\"',\"'\"],!1,!1),rS=/^[<>&; \\t\"']/,iS=Je([\"<\",\">\",\"&\",\";\",\" \",\"\t\",'\"',\"'\"],!1,!1),YE=/^[ \\t]/,jE=Je([\" \",\"\t\"],!1,!1),Q=0,Me=0,SA=[{line:1,column:1}],d=0,E=[],I=0,k;if(\"startRule\"in e){if(!(e.startRule in i))throw new Error(`Can't start parsing from rule \"`+e.startRule+'\".');n=i[e.startRule]}function L(){return r.substring(Me,Q)}function Z(){return Et(Me,Q)}function te(m,b){throw b=b!==void 0?b:Et(Me,Q),Ri([lt(m)],r.substring(Me,Q),b)}function we(m,b){throw b=b!==void 0?b:Et(Me,Q),On(m,b)}function me(m,b){return{type:\"literal\",text:m,ignoreCase:b}}function Je(m,b,N){return{type:\"class\",parts:m,inverted:b,ignoreCase:N}}function nt(){return{type:\"any\"}}function wt(){return{type:\"end\"}}function lt(m){return{type:\"other\",description:m}}function it(m){var b=SA[m],N;if(b)return b;for(N=m-1;!SA[N];)N--;for(b=SA[N],b={line:b.line,column:b.column};N<m;)r.charCodeAt(N)===10?(b.line++,b.column=1):b.column++,N++;return SA[m]=b,b}function Et(m,b){var N=it(m),U=it(b);return{start:{offset:m,line:N.line,column:N.column},end:{offset:b,line:U.line,column:U.column}}}function Qe(m){Q<d||(Q>d&&(d=Q,E=[]),E.push(m))}function On(m,b){return new Zl(m,null,null,b)}function Ri(m,b,N){return new Zl(Zl.buildMessage(m,b),m,b,N)}function vA(){var m,b;return m=Q,b=Mr(),b===t&&(b=null),b!==t&&(Me=m,b=s(b)),m=b,m}function Mr(){var m,b,N,U,ce;if(m=Q,b=Kr(),b!==t){for(N=[],U=He();U!==t;)N.push(U),U=He();N!==t?(U=Ea(),U!==t?(ce=os(),ce===t&&(ce=null),ce!==t?(Me=m,b=o(b,U,ce),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t)}else Q=m,m=t;if(m===t)if(m=Q,b=Kr(),b!==t){for(N=[],U=He();U!==t;)N.push(U),U=He();N!==t?(U=Ea(),U===t&&(U=null),U!==t?(Me=m,b=a(b,U),m=b):(Q=m,m=t)):(Q=m,m=t)}else Q=m,m=t;return m}function os(){var m,b,N,U,ce;for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t)if(N=Mr(),N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();U!==t?(Me=m,b=l(N),m=b):(Q=m,m=t)}else Q=m,m=t;else Q=m,m=t;return m}function Ea(){var m;return r.charCodeAt(Q)===59?(m=c,Q++):(m=t,I===0&&Qe(u)),m===t&&(r.charCodeAt(Q)===38?(m=g,Q++):(m=t,I===0&&Qe(f))),m}function Kr(){var m,b,N;return m=Q,b=G1(),b!==t?(N=uge(),N===t&&(N=null),N!==t?(Me=m,b=h(b,N),m=b):(Q=m,m=t)):(Q=m,m=t),m}function uge(){var m,b,N,U,ce,Se,ht;for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t)if(N=gge(),N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();if(U!==t)if(ce=Kr(),ce!==t){for(Se=[],ht=He();ht!==t;)Se.push(ht),ht=He();Se!==t?(Me=m,b=p(N,ce),m=b):(Q=m,m=t)}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t;else Q=m,m=t;return m}function gge(){var m;return r.substr(Q,2)===C?(m=C,Q+=2):(m=t,I===0&&Qe(y)),m===t&&(r.substr(Q,2)===B?(m=B,Q+=2):(m=t,I===0&&Qe(v))),m}function G1(){var m,b,N;return m=Q,b=pge(),b!==t?(N=fge(),N===t&&(N=null),N!==t?(Me=m,b=D(b,N),m=b):(Q=m,m=t)):(Q=m,m=t),m}function fge(){var m,b,N,U,ce,Se,ht;for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t)if(N=hge(),N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();if(U!==t)if(ce=G1(),ce!==t){for(Se=[],ht=He();ht!==t;)Se.push(ht),ht=He();Se!==t?(Me=m,b=T(N,ce),m=b):(Q=m,m=t)}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t;else Q=m,m=t;return m}function hge(){var m;return r.substr(Q,2)===H?(m=H,Q+=2):(m=t,I===0&&Qe(j)),m===t&&(r.charCodeAt(Q)===124?(m=$,Q++):(m=t,I===0&&Qe(V))),m}function qE(){var m,b,N,U,ce,Se;if(m=Q,b=eK(),b!==t)if(r.charCodeAt(Q)===61?(N=W,Q++):(N=t,I===0&&Qe(_)),N!==t)if(U=q1(),U!==t){for(ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();ce!==t?(Me=m,b=A(b,U),m=b):(Q=m,m=t)}else Q=m,m=t;else Q=m,m=t;else Q=m,m=t;if(m===t)if(m=Q,b=eK(),b!==t)if(r.charCodeAt(Q)===61?(N=W,Q++):(N=t,I===0&&Qe(_)),N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();U!==t?(Me=m,b=Ae(b),m=b):(Q=m,m=t)}else Q=m,m=t;else Q=m,m=t;return m}function pge(){var m,b,N,U,ce,Se,ht,Bt,Jr,hi,as;for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t)if(r.charCodeAt(Q)===40?(N=ge,Q++):(N=t,I===0&&Qe(re)),N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();if(U!==t)if(ce=Mr(),ce!==t){for(Se=[],ht=He();ht!==t;)Se.push(ht),ht=He();if(Se!==t)if(r.charCodeAt(Q)===41?(ht=O,Q++):(ht=t,I===0&&Qe(F)),ht!==t){for(Bt=[],Jr=He();Jr!==t;)Bt.push(Jr),Jr=He();if(Bt!==t){for(Jr=[],hi=Np();hi!==t;)Jr.push(hi),hi=Np();if(Jr!==t){for(hi=[],as=He();as!==t;)hi.push(as),as=He();hi!==t?(Me=m,b=ue(ce,Jr),m=b):(Q=m,m=t)}else Q=m,m=t}else Q=m,m=t}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t;else Q=m,m=t;if(m===t){for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t)if(r.charCodeAt(Q)===123?(N=pe,Q++):(N=t,I===0&&Qe(ke)),N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();if(U!==t)if(ce=Mr(),ce!==t){for(Se=[],ht=He();ht!==t;)Se.push(ht),ht=He();if(Se!==t)if(r.charCodeAt(Q)===125?(ht=Fe,Q++):(ht=t,I===0&&Qe(Ne)),ht!==t){for(Bt=[],Jr=He();Jr!==t;)Bt.push(Jr),Jr=He();if(Bt!==t){for(Jr=[],hi=Np();hi!==t;)Jr.push(hi),hi=Np();if(Jr!==t){for(hi=[],as=He();as!==t;)hi.push(as),as=He();hi!==t?(Me=m,b=oe(ce,Jr),m=b):(Q=m,m=t)}else Q=m,m=t}else Q=m,m=t}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t;else Q=m,m=t;if(m===t){for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t){for(N=[],U=qE();U!==t;)N.push(U),U=qE();if(N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();if(U!==t){if(ce=[],Se=j1(),Se!==t)for(;Se!==t;)ce.push(Se),Se=j1();else ce=t;if(ce!==t){for(Se=[],ht=He();ht!==t;)Se.push(ht),ht=He();Se!==t?(Me=m,b=le(N,ce),m=b):(Q=m,m=t)}else Q=m,m=t}else Q=m,m=t}else Q=m,m=t}else Q=m,m=t;if(m===t){for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t){if(N=[],U=qE(),U!==t)for(;U!==t;)N.push(U),U=qE();else N=t;if(N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();U!==t?(Me=m,b=Be(N),m=b):(Q=m,m=t)}else Q=m,m=t}else Q=m,m=t}}}return m}function Y1(){var m,b,N,U,ce;for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t){if(N=[],U=JE(),U!==t)for(;U!==t;)N.push(U),U=JE();else N=t;if(N!==t){for(U=[],ce=He();ce!==t;)U.push(ce),ce=He();U!==t?(Me=m,b=fe(N),m=b):(Q=m,m=t)}else Q=m,m=t}else Q=m,m=t;return m}function j1(){var m,b,N;for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();if(b!==t?(N=Np(),N!==t?(Me=m,b=ae(N),m=b):(Q=m,m=t)):(Q=m,m=t),m===t){for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();b!==t?(N=JE(),N!==t?(Me=m,b=ae(N),m=b):(Q=m,m=t)):(Q=m,m=t)}return m}function Np(){var m,b,N,U,ce;for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();return b!==t?(qe.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(ne)),N===t&&(N=null),N!==t?(U=dge(),U!==t?(ce=JE(),ce!==t?(Me=m,b=Y(N,U,ce),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m}function dge(){var m;return r.substr(Q,2)===he?(m=he,Q+=2):(m=t,I===0&&Qe(ie)),m===t&&(r.substr(Q,2)===de?(m=de,Q+=2):(m=t,I===0&&Qe(_e)),m===t&&(r.charCodeAt(Q)===62?(m=Pt,Q++):(m=t,I===0&&Qe(It)),m===t&&(r.substr(Q,3)===Or?(m=Or,Q+=3):(m=t,I===0&&Qe(ii)),m===t&&(r.substr(Q,2)===gi?(m=gi,Q+=2):(m=t,I===0&&Qe(hr)),m===t&&(r.charCodeAt(Q)===60?(m=fi,Q++):(m=t,I===0&&Qe(ni))))))),m}function JE(){var m,b,N;for(m=Q,b=[],N=He();N!==t;)b.push(N),N=He();return b!==t?(N=q1(),N!==t?(Me=m,b=ae(N),m=b):(Q=m,m=t)):(Q=m,m=t),m}function q1(){var m,b,N;if(m=Q,b=[],N=J1(),N!==t)for(;N!==t;)b.push(N),N=J1();else b=t;return b!==t&&(Me=m,b=Ks(b)),m=b,m}function J1(){var m,b;return m=Q,b=Cge(),b!==t&&(Me=m,b=pr(b)),m=b,m===t&&(m=Q,b=mge(),b!==t&&(Me=m,b=pr(b)),m=b,m===t&&(m=Q,b=Ege(),b!==t&&(Me=m,b=pr(b)),m=b,m===t&&(m=Q,b=Ige(),b!==t&&(Me=m,b=pr(b)),m=b))),m}function Cge(){var m,b,N,U;return m=Q,r.substr(Q,2)===Ii?(b=Ii,Q+=2):(b=t,I===0&&Qe(rs)),b!==t?(N=Bge(),N!==t?(r.charCodeAt(Q)===39?(U=fa,Q++):(U=t,I===0&&Qe(CA)),U!==t?(Me=m,b=cg(N),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m}function mge(){var m,b,N,U;return m=Q,r.charCodeAt(Q)===39?(b=fa,Q++):(b=t,I===0&&Qe(CA)),b!==t?(N=yge(),N!==t?(r.charCodeAt(Q)===39?(U=fa,Q++):(U=t,I===0&&Qe(CA)),U!==t?(Me=m,b=cg(N),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m}function Ege(){var m,b,N,U;if(m=Q,r.substr(Q,2)===is?(b=is,Q+=2):(b=t,I===0&&Qe(mA)),b!==t&&(Me=m,b=ha()),m=b,m===t)if(m=Q,r.charCodeAt(Q)===34?(b=wp,Q++):(b=t,I===0&&Qe(EA)),b!==t){for(N=[],U=W1();U!==t;)N.push(U),U=W1();N!==t?(r.charCodeAt(Q)===34?(U=wp,Q++):(U=t,I===0&&Qe(EA)),U!==t?(Me=m,b=IA(N),m=b):(Q=m,m=t)):(Q=m,m=t)}else Q=m,m=t;return m}function Ige(){var m,b,N;if(m=Q,b=[],N=z1(),N!==t)for(;N!==t;)b.push(N),N=z1();else b=t;return b!==t&&(Me=m,b=IA(b)),m=b,m}function W1(){var m,b;return m=Q,b=_1(),b!==t&&(Me=m,b=wr(b)),m=b,m===t&&(m=Q,b=$1(),b!==t&&(Me=m,b=Tl(b)),m=b,m===t&&(m=Q,b=aS(),b!==t&&(Me=m,b=ug(b)),m=b,m===t&&(m=Q,b=wge(),b!==t&&(Me=m,b=Io(b)),m=b))),m}function z1(){var m,b;return m=Q,b=_1(),b!==t&&(Me=m,b=gg(b)),m=b,m===t&&(m=Q,b=$1(),b!==t&&(Me=m,b=Bp(b)),m=b,m===t&&(m=Q,b=aS(),b!==t&&(Me=m,b=Qp(b)),m=b,m===t&&(m=Q,b=Sge(),b!==t&&(Me=m,b=vr(b)),m=b,m===t&&(m=Q,b=bge(),b!==t&&(Me=m,b=Io(b)),m=b)))),m}function yge(){var m,b,N;for(m=Q,b=[],se.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(yo));N!==t;)b.push(N),se.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(yo));return b!==t&&(Me=m,b=Fn(b)),m=b,m}function wge(){var m,b,N;if(m=Q,b=[],N=V1(),N===t&&(fg.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(Qt))),N!==t)for(;N!==t;)b.push(N),N=V1(),N===t&&(fg.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(Qt)));else b=t;return b!==t&&(Me=m,b=Fn(b)),m=b,m}function V1(){var m,b,N;return m=Q,r.substr(Q,2)===Ll?(b=Ll,Q+=2):(b=t,I===0&&Qe(Nn)),b!==t&&(Me=m,b=ns()),m=b,m===t&&(m=Q,r.charCodeAt(Q)===92?(b=ss,Q++):(b=t,I===0&&Qe(gt)),b!==t?(wo.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(At)),N!==t?(Me=m,b=ln(N),m=b):(Q=m,m=t)):(Q=m,m=t)),m}function Bge(){var m,b,N;for(m=Q,b=[],N=X1(),N===t&&(se.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(yo)));N!==t;)b.push(N),N=X1(),N===t&&(se.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(yo)));return b!==t&&(Me=m,b=Fn(b)),m=b,m}function X1(){var m,b,N;return m=Q,r.substr(Q,2)===S?(b=S,Q+=2):(b=t,I===0&&Qe(Lt)),b!==t&&(Me=m,b=hg()),m=b,m===t&&(m=Q,r.substr(Q,2)===Ol?(b=Ol,Q+=2):(b=t,I===0&&Qe(bp)),b!==t&&(Me=m,b=Sp()),m=b,m===t&&(m=Q,r.charCodeAt(Q)===92?(b=ss,Q++):(b=t,I===0&&Qe(gt)),b!==t?(vp.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(xp)),N!==t?(Me=m,b=Pp(),m=b):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.substr(Q,2)===G?(b=G,Q+=2):(b=t,I===0&&Qe(yt)),b!==t&&(Me=m,b=yA()),m=b,m===t&&(m=Q,r.substr(Q,2)===zi?(b=zi,Q+=2):(b=t,I===0&&Qe(Ml)),b!==t&&(Me=m,b=Xe()),m=b,m===t&&(m=Q,r.substr(Q,2)===pa?(b=pa,Q+=2):(b=t,I===0&&Qe(pg)),b!==t&&(Me=m,b=OE()),m=b,m===t&&(m=Q,r.substr(Q,2)===Dp?(b=Dp,Q+=2):(b=t,I===0&&Qe(ME)),b!==t&&(Me=m,b=ar()),m=b,m===t&&(m=Q,r.substr(Q,2)===Tn?(b=Tn,Q+=2):(b=t,I===0&&Qe(Kl)),b!==t&&(Me=m,b=kp()),m=b,m===t&&(m=Q,r.charCodeAt(Q)===92?(b=ss,Q++):(b=t,I===0&&Qe(gt)),b!==t?(Us.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(da)),N!==t?(Me=m,b=ln(N),m=b):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Qge()))))))))),m}function Qge(){var m,b,N,U,ce,Se,ht,Bt,Jr,hi,as,AS;return m=Q,r.charCodeAt(Q)===92?(b=ss,Q++):(b=t,I===0&&Qe(gt)),b!==t?(N=nS(),N!==t?(Me=m,b=cn(N),m=b):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.substr(Q,2)===Le?(b=Le,Q+=2):(b=t,I===0&&Qe(dg)),b!==t?(N=Q,U=Q,ce=nS(),ce!==t?(Se=Mn(),Se!==t?(ce=[ce,Se],U=ce):(Q=U,U=t)):(Q=U,U=t),U===t&&(U=nS()),U!==t?N=r.substring(N,Q):N=U,N!==t?(Me=m,b=cn(N),m=b):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.substr(Q,2)===Ul?(b=Ul,Q+=2):(b=t,I===0&&Qe(Hs)),b!==t?(N=Q,U=Q,ce=Mn(),ce!==t?(Se=Mn(),Se!==t?(ht=Mn(),ht!==t?(Bt=Mn(),Bt!==t?(ce=[ce,Se,ht,Bt],U=ce):(Q=U,U=t)):(Q=U,U=t)):(Q=U,U=t)):(Q=U,U=t),U!==t?N=r.substring(N,Q):N=U,N!==t?(Me=m,b=cn(N),m=b):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.substr(Q,2)===Hl?(b=Hl,Q+=2):(b=t,I===0&&Qe(wA)),b!==t?(N=Q,U=Q,ce=Mn(),ce!==t?(Se=Mn(),Se!==t?(ht=Mn(),ht!==t?(Bt=Mn(),Bt!==t?(Jr=Mn(),Jr!==t?(hi=Mn(),hi!==t?(as=Mn(),as!==t?(AS=Mn(),AS!==t?(ce=[ce,Se,ht,Bt,Jr,hi,as,AS],U=ce):(Q=U,U=t)):(Q=U,U=t)):(Q=U,U=t)):(Q=U,U=t)):(Q=U,U=t)):(Q=U,U=t)):(Q=U,U=t)):(Q=U,U=t),U!==t?N=r.substring(N,Q):N=U,N!==t?(Me=m,b=Cg(N),m=b):(Q=m,m=t)):(Q=m,m=t)))),m}function nS(){var m;return mg.test(r.charAt(Q))?(m=r.charAt(Q),Q++):(m=t,I===0&&Qe(Ca)),m}function Mn(){var m;return ma.test(r.charAt(Q))?(m=r.charAt(Q),Q++):(m=t,I===0&&Qe(rt)),m}function bge(){var m,b,N,U,ce;if(m=Q,b=[],N=Q,r.charCodeAt(Q)===92?(U=ss,Q++):(U=t,I===0&&Qe(gt)),U!==t?(r.length>Q?(ce=r.charAt(Q),Q++):(ce=t,I===0&&Qe(Bo)),ce!==t?(Me=N,U=ln(ce),N=U):(Q=N,N=t)):(Q=N,N=t),N===t&&(N=Q,U=Q,I++,ce=tK(),I--,ce===t?U=void 0:(Q=U,U=t),U!==t?(r.length>Q?(ce=r.charAt(Q),Q++):(ce=t,I===0&&Qe(Bo)),ce!==t?(Me=N,U=ln(ce),N=U):(Q=N,N=t)):(Q=N,N=t)),N!==t)for(;N!==t;)b.push(N),N=Q,r.charCodeAt(Q)===92?(U=ss,Q++):(U=t,I===0&&Qe(gt)),U!==t?(r.length>Q?(ce=r.charAt(Q),Q++):(ce=t,I===0&&Qe(Bo)),ce!==t?(Me=N,U=ln(ce),N=U):(Q=N,N=t)):(Q=N,N=t),N===t&&(N=Q,U=Q,I++,ce=tK(),I--,ce===t?U=void 0:(Q=U,U=t),U!==t?(r.length>Q?(ce=r.charAt(Q),Q++):(ce=t,I===0&&Qe(Bo)),ce!==t?(Me=N,U=ln(ce),N=U):(Q=N,N=t)):(Q=N,N=t));else b=t;return b!==t&&(Me=m,b=Fn(b)),m=b,m}function sS(){var m,b,N,U,ce,Se;if(m=Q,r.charCodeAt(Q)===45?(b=BA,Q++):(b=t,I===0&&Qe(Gl)),b===t&&(r.charCodeAt(Q)===43?(b=Gs,Q++):(b=t,I===0&&Qe(Yl))),b===t&&(b=null),b!==t){if(N=[],qe.test(r.charAt(Q))?(U=r.charAt(Q),Q++):(U=t,I===0&&Qe(ne)),U!==t)for(;U!==t;)N.push(U),qe.test(r.charAt(Q))?(U=r.charAt(Q),Q++):(U=t,I===0&&Qe(ne));else N=t;if(N!==t)if(r.charCodeAt(Q)===46?(U=KE,Q++):(U=t,I===0&&Qe(Rp)),U!==t){if(ce=[],qe.test(r.charAt(Q))?(Se=r.charAt(Q),Q++):(Se=t,I===0&&Qe(ne)),Se!==t)for(;Se!==t;)ce.push(Se),qe.test(r.charAt(Q))?(Se=r.charAt(Q),Q++):(Se=t,I===0&&Qe(ne));else ce=t;ce!==t?(Me=m,b=Eg(b,N,ce),m=b):(Q=m,m=t)}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t;if(m===t){if(m=Q,r.charCodeAt(Q)===45?(b=BA,Q++):(b=t,I===0&&Qe(Gl)),b===t&&(r.charCodeAt(Q)===43?(b=Gs,Q++):(b=t,I===0&&Qe(Yl))),b===t&&(b=null),b!==t){if(N=[],qe.test(r.charAt(Q))?(U=r.charAt(Q),Q++):(U=t,I===0&&Qe(ne)),U!==t)for(;U!==t;)N.push(U),qe.test(r.charAt(Q))?(U=r.charAt(Q),Q++):(U=t,I===0&&Qe(ne));else N=t;N!==t?(Me=m,b=Fp(b,N),m=b):(Q=m,m=t)}else Q=m,m=t;if(m===t&&(m=Q,b=aS(),b!==t&&(Me=m,b=UE(b)),m=b,m===t&&(m=Q,b=ql(),b!==t&&(Me=m,b=jl(b)),m=b,m===t)))if(m=Q,r.charCodeAt(Q)===40?(b=ge,Q++):(b=t,I===0&&Qe(re)),b!==t){for(N=[],U=He();U!==t;)N.push(U),U=He();if(N!==t)if(U=Z1(),U!==t){for(ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();ce!==t?(r.charCodeAt(Q)===41?(Se=O,Q++):(Se=t,I===0&&Qe(F)),Se!==t?(Me=m,b=HE(U),m=b):(Q=m,m=t)):(Q=m,m=t)}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t}return m}function oS(){var m,b,N,U,ce,Se,ht,Bt;if(m=Q,b=sS(),b!==t){for(N=[],U=Q,ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();if(ce!==t)if(r.charCodeAt(Q)===42?(Se=Ig,Q++):(Se=t,I===0&&Qe(QA)),Se===t&&(r.charCodeAt(Q)===47?(Se=Rr,Q++):(Se=t,I===0&&Qe(GE))),Se!==t){for(ht=[],Bt=He();Bt!==t;)ht.push(Bt),Bt=He();ht!==t?(Bt=sS(),Bt!==t?(Me=U,ce=Ys(b,Se,Bt),U=ce):(Q=U,U=t)):(Q=U,U=t)}else Q=U,U=t;else Q=U,U=t;for(;U!==t;){for(N.push(U),U=Q,ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();if(ce!==t)if(r.charCodeAt(Q)===42?(Se=Ig,Q++):(Se=t,I===0&&Qe(QA)),Se===t&&(r.charCodeAt(Q)===47?(Se=Rr,Q++):(Se=t,I===0&&Qe(GE))),Se!==t){for(ht=[],Bt=He();Bt!==t;)ht.push(Bt),Bt=He();ht!==t?(Bt=sS(),Bt!==t?(Me=U,ce=Ys(b,Se,Bt),U=ce):(Q=U,U=t)):(Q=U,U=t)}else Q=U,U=t;else Q=U,U=t}N!==t?(Me=m,b=js(b,N),m=b):(Q=m,m=t)}else Q=m,m=t;return m}function Z1(){var m,b,N,U,ce,Se,ht,Bt;if(m=Q,b=oS(),b!==t){for(N=[],U=Q,ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();if(ce!==t)if(r.charCodeAt(Q)===43?(Se=Gs,Q++):(Se=t,I===0&&Qe(Yl)),Se===t&&(r.charCodeAt(Q)===45?(Se=BA,Q++):(Se=t,I===0&&Qe(Gl))),Se!==t){for(ht=[],Bt=He();Bt!==t;)ht.push(Bt),Bt=He();ht!==t?(Bt=oS(),Bt!==t?(Me=U,ce=yg(b,Se,Bt),U=ce):(Q=U,U=t)):(Q=U,U=t)}else Q=U,U=t;else Q=U,U=t;for(;U!==t;){for(N.push(U),U=Q,ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();if(ce!==t)if(r.charCodeAt(Q)===43?(Se=Gs,Q++):(Se=t,I===0&&Qe(Yl)),Se===t&&(r.charCodeAt(Q)===45?(Se=BA,Q++):(Se=t,I===0&&Qe(Gl))),Se!==t){for(ht=[],Bt=He();Bt!==t;)ht.push(Bt),Bt=He();ht!==t?(Bt=oS(),Bt!==t?(Me=U,ce=yg(b,Se,Bt),U=ce):(Q=U,U=t)):(Q=U,U=t)}else Q=U,U=t;else Q=U,U=t}N!==t?(Me=m,b=js(b,N),m=b):(Q=m,m=t)}else Q=m,m=t;return m}function _1(){var m,b,N,U,ce,Se;if(m=Q,r.substr(Q,3)===bA?(b=bA,Q+=3):(b=t,I===0&&Qe(R)),b!==t){for(N=[],U=He();U!==t;)N.push(U),U=He();if(N!==t)if(U=Z1(),U!==t){for(ce=[],Se=He();Se!==t;)ce.push(Se),Se=He();ce!==t?(r.substr(Q,2)===q?(Se=q,Q+=2):(Se=t,I===0&&Qe(Ce)),Se!==t?(Me=m,b=Ke(U),m=b):(Q=m,m=t)):(Q=m,m=t)}else Q=m,m=t;else Q=m,m=t}else Q=m,m=t;return m}function $1(){var m,b,N,U;return m=Q,r.substr(Q,2)===Re?(b=Re,Q+=2):(b=t,I===0&&Qe(ze)),b!==t?(N=Mr(),N!==t?(r.charCodeAt(Q)===41?(U=O,Q++):(U=t,I===0&&Qe(F)),U!==t?(Me=m,b=dt(N),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m}function aS(){var m,b,N,U,ce,Se;return m=Q,r.substr(Q,2)===Ft?(b=Ft,Q+=2):(b=t,I===0&&Qe(Ln)),b!==t?(N=ql(),N!==t?(r.substr(Q,2)===Jb?(U=Jb,Q+=2):(U=t,I===0&&Qe(P1)),U!==t?(ce=Y1(),ce!==t?(r.charCodeAt(Q)===125?(Se=Fe,Q++):(Se=t,I===0&&Qe(Ne)),Se!==t?(Me=m,b=D1(N,ce),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.substr(Q,2)===Ft?(b=Ft,Q+=2):(b=t,I===0&&Qe(Ln)),b!==t?(N=ql(),N!==t?(r.substr(Q,3)===Wb?(U=Wb,Q+=3):(U=t,I===0&&Qe(k1)),U!==t?(Me=m,b=R1(N),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.substr(Q,2)===Ft?(b=Ft,Q+=2):(b=t,I===0&&Qe(Ln)),b!==t?(N=ql(),N!==t?(r.substr(Q,2)===zb?(U=zb,Q+=2):(U=t,I===0&&Qe(F1)),U!==t?(ce=Y1(),ce!==t?(r.charCodeAt(Q)===125?(Se=Fe,Q++):(Se=t,I===0&&Qe(Ne)),Se!==t?(Me=m,b=N1(N,ce),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.substr(Q,2)===Ft?(b=Ft,Q+=2):(b=t,I===0&&Qe(Ln)),b!==t?(N=ql(),N!==t?(r.substr(Q,3)===Vb?(U=Vb,Q+=3):(U=t,I===0&&Qe(T1)),U!==t?(Me=m,b=L1(N),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.substr(Q,2)===Ft?(b=Ft,Q+=2):(b=t,I===0&&Qe(Ln)),b!==t?(N=ql(),N!==t?(r.charCodeAt(Q)===125?(U=Fe,Q++):(U=t,I===0&&Qe(Ne)),U!==t?(Me=m,b=Xb(N),m=b):(Q=m,m=t)):(Q=m,m=t)):(Q=m,m=t),m===t&&(m=Q,r.charCodeAt(Q)===36?(b=O1,Q++):(b=t,I===0&&Qe(M1)),b!==t?(N=ql(),N!==t?(Me=m,b=Xb(N),m=b):(Q=m,m=t)):(Q=m,m=t)))))),m}function Sge(){var m,b,N;return m=Q,b=vge(),b!==t?(Me=Q,N=K1(b),N?N=void 0:N=t,N!==t?(Me=m,b=U1(b),m=b):(Q=m,m=t)):(Q=m,m=t),m}function vge(){var m,b,N,U,ce;if(m=Q,b=[],N=Q,U=Q,I++,ce=rK(),I--,ce===t?U=void 0:(Q=U,U=t),U!==t?(r.length>Q?(ce=r.charAt(Q),Q++):(ce=t,I===0&&Qe(Bo)),ce!==t?(Me=N,U=ln(ce),N=U):(Q=N,N=t)):(Q=N,N=t),N!==t)for(;N!==t;)b.push(N),N=Q,U=Q,I++,ce=rK(),I--,ce===t?U=void 0:(Q=U,U=t),U!==t?(r.length>Q?(ce=r.charAt(Q),Q++):(ce=t,I===0&&Qe(Bo)),ce!==t?(Me=N,U=ln(ce),N=U):(Q=N,N=t)):(Q=N,N=t);else b=t;return b!==t&&(Me=m,b=Fn(b)),m=b,m}function eK(){var m,b,N;if(m=Q,b=[],Zb.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(_b)),N!==t)for(;N!==t;)b.push(N),Zb.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(_b));else b=t;return b!==t&&(Me=m,b=$b()),m=b,m}function ql(){var m,b,N;if(m=Q,b=[],eS.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(tS)),N!==t)for(;N!==t;)b.push(N),eS.test(r.charAt(Q))?(N=r.charAt(Q),Q++):(N=t,I===0&&Qe(tS));else b=t;return b!==t&&(Me=m,b=$b()),m=b,m}function tK(){var m;return H1.test(r.charAt(Q))?(m=r.charAt(Q),Q++):(m=t,I===0&&Qe(wg)),m}function rK(){var m;return rS.test(r.charAt(Q))?(m=r.charAt(Q),Q++):(m=t,I===0&&Qe(iS)),m}function He(){var m,b;if(m=[],YE.test(r.charAt(Q))?(b=r.charAt(Q),Q++):(b=t,I===0&&Qe(jE)),b!==t)for(;b!==t;)m.push(b),YE.test(r.charAt(Q))?(b=r.charAt(Q),Q++):(b=t,I===0&&Qe(jE));else m=t;return m}if(k=n(),k!==t&&Q===r.length)return k;throw k!==t&&Q<r.length&&Qe(wt()),Ri(E,d<r.length?r.charAt(d):null,d<r.length?Et(d,d+1):Et(d,d))}cU.exports={SyntaxError:Zl,parse:vfe}});var hU=w((IZe,fU)=>{\"use strict\";function xfe(r,e){function t(){this.constructor=r}t.prototype=e.prototype,r.prototype=new t}function $l(r,e,t,i){this.message=r,this.expected=e,this.found=t,this.location=i,this.name=\"SyntaxError\",typeof Error.captureStackTrace==\"function\"&&Error.captureStackTrace(this,$l)}xfe($l,Error);$l.buildMessage=function(r,e){var t={literal:function(c){return'\"'+n(c.text)+'\"'},class:function(c){var u=\"\",g;for(g=0;g<c.parts.length;g++)u+=c.parts[g]instanceof Array?s(c.parts[g][0])+\"-\"+s(c.parts[g][1]):s(c.parts[g]);return\"[\"+(c.inverted?\"^\":\"\")+u+\"]\"},any:function(c){return\"any character\"},end:function(c){return\"end of input\"},other:function(c){return c.description}};function i(c){return c.charCodeAt(0).toString(16).toUpperCase()}function n(c){return c.replace(/\\\\/g,\"\\\\\\\\\").replace(/\"/g,'\\\\\"').replace(/\\0/g,\"\\\\0\").replace(/\\t/g,\"\\\\t\").replace(/\\n/g,\"\\\\n\").replace(/\\r/g,\"\\\\r\").replace(/[\\x00-\\x0F]/g,function(u){return\"\\\\x0\"+i(u)}).replace(/[\\x10-\\x1F\\x7F-\\x9F]/g,function(u){return\"\\\\x\"+i(u)})}function s(c){return c.replace(/\\\\/g,\"\\\\\\\\\").replace(/\\]/g,\"\\\\]\").replace(/\\^/g,\"\\\\^\").replace(/-/g,\"\\\\-\").replace(/\\0/g,\"\\\\0\").replace(/\\t/g,\"\\\\t\").replace(/\\n/g,\"\\\\n\").replace(/\\r/g,\"\\\\r\").replace(/[\\x00-\\x0F]/g,function(u){return\"\\\\x0\"+i(u)}).replace(/[\\x10-\\x1F\\x7F-\\x9F]/g,function(u){return\"\\\\x\"+i(u)})}function o(c){return t[c.type](c)}function a(c){var u=new Array(c.length),g,f;for(g=0;g<c.length;g++)u[g]=o(c[g]);if(u.sort(),u.length>0){for(g=1,f=1;g<u.length;g++)u[g-1]!==u[g]&&(u[f]=u[g],f++);u.length=f}switch(u.length){case 1:return u[0];case 2:return u[0]+\" or \"+u[1];default:return u.slice(0,-1).join(\", \")+\", or \"+u[u.length-1]}}function l(c){return c?'\"'+n(c)+'\"':\"end of input\"}return\"Expected \"+a(r)+\" but \"+l(e)+\" found.\"};function Pfe(r,e){e=e!==void 0?e:{};var t={},i={resolution:le},n=le,s=\"/\",o=ge(\"/\",!1),a=function(ne,Y){return{from:ne,descriptor:Y}},l=function(ne){return{descriptor:ne}},c=\"@\",u=ge(\"@\",!1),g=function(ne,Y){return{fullName:ne,description:Y}},f=function(ne){return{fullName:ne}},h=function(){return W()},p=/^[^\\/@]/,C=re([\"/\",\"@\"],!0,!1),y=/^[^\\/]/,B=re([\"/\"],!0,!1),v=0,D=0,T=[{line:1,column:1}],H=0,j=[],$=0,V;if(\"startRule\"in e){if(!(e.startRule in i))throw new Error(`Can't start parsing from rule \"`+e.startRule+'\".');n=i[e.startRule]}function W(){return r.substring(D,v)}function _(){return ke(D,v)}function A(ne,Y){throw Y=Y!==void 0?Y:ke(D,v),oe([ue(ne)],r.substring(D,v),Y)}function Ae(ne,Y){throw Y=Y!==void 0?Y:ke(D,v),Ne(ne,Y)}function ge(ne,Y){return{type:\"literal\",text:ne,ignoreCase:Y}}function re(ne,Y,he){return{type:\"class\",parts:ne,inverted:Y,ignoreCase:he}}function O(){return{type:\"any\"}}function F(){return{type:\"end\"}}function ue(ne){return{type:\"other\",description:ne}}function pe(ne){var Y=T[ne],he;if(Y)return Y;for(he=ne-1;!T[he];)he--;for(Y=T[he],Y={line:Y.line,column:Y.column};he<ne;)r.charCodeAt(he)===10?(Y.line++,Y.column=1):Y.column++,he++;return T[ne]=Y,Y}function ke(ne,Y){var he=pe(ne),ie=pe(Y);return{start:{offset:ne,line:he.line,column:he.column},end:{offset:Y,line:ie.line,column:ie.column}}}function Fe(ne){v<H||(v>H&&(H=v,j=[]),j.push(ne))}function Ne(ne,Y){return new $l(ne,null,null,Y)}function oe(ne,Y,he){return new $l($l.buildMessage(ne,Y),ne,Y,he)}function le(){var ne,Y,he,ie;return ne=v,Y=Be(),Y!==t?(r.charCodeAt(v)===47?(he=s,v++):(he=t,$===0&&Fe(o)),he!==t?(ie=Be(),ie!==t?(D=ne,Y=a(Y,ie),ne=Y):(v=ne,ne=t)):(v=ne,ne=t)):(v=ne,ne=t),ne===t&&(ne=v,Y=Be(),Y!==t&&(D=ne,Y=l(Y)),ne=Y),ne}function Be(){var ne,Y,he,ie;return ne=v,Y=fe(),Y!==t?(r.charCodeAt(v)===64?(he=c,v++):(he=t,$===0&&Fe(u)),he!==t?(ie=qe(),ie!==t?(D=ne,Y=g(Y,ie),ne=Y):(v=ne,ne=t)):(v=ne,ne=t)):(v=ne,ne=t),ne===t&&(ne=v,Y=fe(),Y!==t&&(D=ne,Y=f(Y)),ne=Y),ne}function fe(){var ne,Y,he,ie,de;return ne=v,r.charCodeAt(v)===64?(Y=c,v++):(Y=t,$===0&&Fe(u)),Y!==t?(he=ae(),he!==t?(r.charCodeAt(v)===47?(ie=s,v++):(ie=t,$===0&&Fe(o)),ie!==t?(de=ae(),de!==t?(D=ne,Y=h(),ne=Y):(v=ne,ne=t)):(v=ne,ne=t)):(v=ne,ne=t)):(v=ne,ne=t),ne===t&&(ne=v,Y=ae(),Y!==t&&(D=ne,Y=h()),ne=Y),ne}function ae(){var ne,Y,he;if(ne=v,Y=[],p.test(r.charAt(v))?(he=r.charAt(v),v++):(he=t,$===0&&Fe(C)),he!==t)for(;he!==t;)Y.push(he),p.test(r.charAt(v))?(he=r.charAt(v),v++):(he=t,$===0&&Fe(C));else Y=t;return Y!==t&&(D=ne,Y=h()),ne=Y,ne}function qe(){var ne,Y,he;if(ne=v,Y=[],y.test(r.charAt(v))?(he=r.charAt(v),v++):(he=t,$===0&&Fe(B)),he!==t)for(;he!==t;)Y.push(he),y.test(r.charAt(v))?(he=r.charAt(v),v++):(he=t,$===0&&Fe(B));else Y=t;return Y!==t&&(D=ne,Y=h()),ne=Y,ne}if(V=n(),V!==t&&v===r.length)return V;throw V!==t&&v<r.length&&Fe(F()),oe(j,H<r.length?r.charAt(H):null,H<r.length?ke(H,H+1):ke(H,H))}fU.exports={SyntaxError:$l,parse:Pfe}});var tc=w((wZe,ec)=>{\"use strict\";function dU(r){return typeof r>\"u\"||r===null}function Dfe(r){return typeof r==\"object\"&&r!==null}function kfe(r){return Array.isArray(r)?r:dU(r)?[]:[r]}function Rfe(r,e){var t,i,n,s;if(e)for(s=Object.keys(e),t=0,i=s.length;t<i;t+=1)n=s[t],r[n]=e[n];return r}function Ffe(r,e){var t=\"\",i;for(i=0;i<e;i+=1)t+=r;return t}function Nfe(r){return r===0&&Number.NEGATIVE_INFINITY===1/r}ec.exports.isNothing=dU;ec.exports.isObject=Dfe;ec.exports.toArray=kfe;ec.exports.repeat=Ffe;ec.exports.isNegativeZero=Nfe;ec.exports.extend=Rfe});var Ng=w((BZe,CU)=>{\"use strict\";function Vp(r,e){Error.call(this),this.name=\"YAMLException\",this.reason=r,this.mark=e,this.message=(this.reason||\"(unknown reason)\")+(this.mark?\" \"+this.mark.toString():\"\"),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack||\"\"}Vp.prototype=Object.create(Error.prototype);Vp.prototype.constructor=Vp;Vp.prototype.toString=function(e){var t=this.name+\": \";return t+=this.reason||\"(unknown reason)\",!e&&this.mark&&(t+=\" \"+this.mark.toString()),t};CU.exports=Vp});var IU=w((QZe,EU)=>{\"use strict\";var mU=tc();function HS(r,e,t,i,n){this.name=r,this.buffer=e,this.position=t,this.line=i,this.column=n}HS.prototype.getSnippet=function(e,t){var i,n,s,o,a;if(!this.buffer)return null;for(e=e||4,t=t||75,i=\"\",n=this.position;n>0&&`\\0\\r\n\\x85\\u2028\\u2029`.indexOf(this.buffer.charAt(n-1))===-1;)if(n-=1,this.position-n>t/2-1){i=\" ... \",n+=5;break}for(s=\"\",o=this.position;o<this.buffer.length&&`\\0\\r\n\\x85\\u2028\\u2029`.indexOf(this.buffer.charAt(o))===-1;)if(o+=1,o-this.position>t/2-1){s=\" ... \",o-=5;break}return a=this.buffer.slice(n,o),mU.repeat(\" \",e)+i+a+s+`\n`+mU.repeat(\" \",e+this.position-n+i.length)+\"^\"};HS.prototype.toString=function(e){var t,i=\"\";return this.name&&(i+='in \"'+this.name+'\" '),i+=\"at line \"+(this.line+1)+\", column \"+(this.column+1),e||(t=this.getSnippet(),t&&(i+=`:\n`+t)),i};EU.exports=HS});var si=w((bZe,wU)=>{\"use strict\";var yU=Ng(),Tfe=[\"kind\",\"resolve\",\"construct\",\"instanceOf\",\"predicate\",\"represent\",\"defaultStyle\",\"styleAliases\"],Lfe=[\"scalar\",\"sequence\",\"mapping\"];function Ofe(r){var e={};return r!==null&&Object.keys(r).forEach(function(t){r[t].forEach(function(i){e[String(i)]=t})}),e}function Mfe(r,e){if(e=e||{},Object.keys(e).forEach(function(t){if(Tfe.indexOf(t)===-1)throw new yU('Unknown option \"'+t+'\" is met in definition of \"'+r+'\" YAML type.')}),this.tag=r,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(t){return t},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.defaultStyle=e.defaultStyle||null,this.styleAliases=Ofe(e.styleAliases||null),Lfe.indexOf(this.kind)===-1)throw new yU('Unknown kind \"'+this.kind+'\" is specified for \"'+r+'\" YAML type.')}wU.exports=Mfe});var rc=w((SZe,QU)=>{\"use strict\";var BU=tc(),dI=Ng(),Kfe=si();function GS(r,e,t){var i=[];return r.include.forEach(function(n){t=GS(n,e,t)}),r[e].forEach(function(n){t.forEach(function(s,o){s.tag===n.tag&&s.kind===n.kind&&i.push(o)}),t.push(n)}),t.filter(function(n,s){return i.indexOf(s)===-1})}function Ufe(){var r={scalar:{},sequence:{},mapping:{},fallback:{}},e,t;function i(n){r[n.kind][n.tag]=r.fallback[n.tag]=n}for(e=0,t=arguments.length;e<t;e+=1)arguments[e].forEach(i);return r}function Tg(r){this.include=r.include||[],this.implicit=r.implicit||[],this.explicit=r.explicit||[],this.implicit.forEach(function(e){if(e.loadKind&&e.loadKind!==\"scalar\")throw new dI(\"There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.\")}),this.compiledImplicit=GS(this,\"implicit\",[]),this.compiledExplicit=GS(this,\"explicit\",[]),this.compiledTypeMap=Ufe(this.compiledImplicit,this.compiledExplicit)}Tg.DEFAULT=null;Tg.create=function(){var e,t;switch(arguments.length){case 1:e=Tg.DEFAULT,t=arguments[0];break;case 2:e=arguments[0],t=arguments[1];break;default:throw new dI(\"Wrong number of arguments for Schema.create function\")}if(e=BU.toArray(e),t=BU.toArray(t),!e.every(function(i){return i instanceof Tg}))throw new dI(\"Specified list of super schemas (or a single Schema object) contains a non-Schema object.\");if(!t.every(function(i){return i instanceof Kfe}))throw new dI(\"Specified list of YAML types (or a single Type object) contains a non-Type object.\");return new Tg({include:e,explicit:t})};QU.exports=Tg});var SU=w((vZe,bU)=>{\"use strict\";var Hfe=si();bU.exports=new Hfe(\"tag:yaml.org,2002:str\",{kind:\"scalar\",construct:function(r){return r!==null?r:\"\"}})});var xU=w((xZe,vU)=>{\"use strict\";var Gfe=si();vU.exports=new Gfe(\"tag:yaml.org,2002:seq\",{kind:\"sequence\",construct:function(r){return r!==null?r:[]}})});var DU=w((PZe,PU)=>{\"use strict\";var Yfe=si();PU.exports=new Yfe(\"tag:yaml.org,2002:map\",{kind:\"mapping\",construct:function(r){return r!==null?r:{}}})});var CI=w((DZe,kU)=>{\"use strict\";var jfe=rc();kU.exports=new jfe({explicit:[SU(),xU(),DU()]})});var FU=w((kZe,RU)=>{\"use strict\";var qfe=si();function Jfe(r){if(r===null)return!0;var e=r.length;return e===1&&r===\"~\"||e===4&&(r===\"null\"||r===\"Null\"||r===\"NULL\")}function Wfe(){return null}function zfe(r){return r===null}RU.exports=new qfe(\"tag:yaml.org,2002:null\",{kind:\"scalar\",resolve:Jfe,construct:Wfe,predicate:zfe,represent:{canonical:function(){return\"~\"},lowercase:function(){return\"null\"},uppercase:function(){return\"NULL\"},camelcase:function(){return\"Null\"}},defaultStyle:\"lowercase\"})});var TU=w((RZe,NU)=>{\"use strict\";var Vfe=si();function Xfe(r){if(r===null)return!1;var e=r.length;return e===4&&(r===\"true\"||r===\"True\"||r===\"TRUE\")||e===5&&(r===\"false\"||r===\"False\"||r===\"FALSE\")}function Zfe(r){return r===\"true\"||r===\"True\"||r===\"TRUE\"}function _fe(r){return Object.prototype.toString.call(r)===\"[object Boolean]\"}NU.exports=new Vfe(\"tag:yaml.org,2002:bool\",{kind:\"scalar\",resolve:Xfe,construct:Zfe,predicate:_fe,represent:{lowercase:function(r){return r?\"true\":\"false\"},uppercase:function(r){return r?\"TRUE\":\"FALSE\"},camelcase:function(r){return r?\"True\":\"False\"}},defaultStyle:\"lowercase\"})});var OU=w((FZe,LU)=>{\"use strict\";var $fe=tc(),ehe=si();function the(r){return 48<=r&&r<=57||65<=r&&r<=70||97<=r&&r<=102}function rhe(r){return 48<=r&&r<=55}function ihe(r){return 48<=r&&r<=57}function nhe(r){if(r===null)return!1;var e=r.length,t=0,i=!1,n;if(!e)return!1;if(n=r[t],(n===\"-\"||n===\"+\")&&(n=r[++t]),n===\"0\"){if(t+1===e)return!0;if(n=r[++t],n===\"b\"){for(t++;t<e;t++)if(n=r[t],n!==\"_\"){if(n!==\"0\"&&n!==\"1\")return!1;i=!0}return i&&n!==\"_\"}if(n===\"x\"){for(t++;t<e;t++)if(n=r[t],n!==\"_\"){if(!the(r.charCodeAt(t)))return!1;i=!0}return i&&n!==\"_\"}for(;t<e;t++)if(n=r[t],n!==\"_\"){if(!rhe(r.charCodeAt(t)))return!1;i=!0}return i&&n!==\"_\"}if(n===\"_\")return!1;for(;t<e;t++)if(n=r[t],n!==\"_\"){if(n===\":\")break;if(!ihe(r.charCodeAt(t)))return!1;i=!0}return!i||n===\"_\"?!1:n!==\":\"?!0:/^(:[0-5]?[0-9])+$/.test(r.slice(t))}function she(r){var e=r,t=1,i,n,s=[];return e.indexOf(\"_\")!==-1&&(e=e.replace(/_/g,\"\")),i=e[0],(i===\"-\"||i===\"+\")&&(i===\"-\"&&(t=-1),e=e.slice(1),i=e[0]),e===\"0\"?0:i===\"0\"?e[1]===\"b\"?t*parseInt(e.slice(2),2):e[1]===\"x\"?t*parseInt(e,16):t*parseInt(e,8):e.indexOf(\":\")!==-1?(e.split(\":\").forEach(function(o){s.unshift(parseInt(o,10))}),e=0,n=1,s.forEach(function(o){e+=o*n,n*=60}),t*e):t*parseInt(e,10)}function ohe(r){return Object.prototype.toString.call(r)===\"[object Number]\"&&r%1===0&&!$fe.isNegativeZero(r)}LU.exports=new ehe(\"tag:yaml.org,2002:int\",{kind:\"scalar\",resolve:nhe,construct:she,predicate:ohe,represent:{binary:function(r){return r>=0?\"0b\"+r.toString(2):\"-0b\"+r.toString(2).slice(1)},octal:function(r){return r>=0?\"0\"+r.toString(8):\"-0\"+r.toString(8).slice(1)},decimal:function(r){return r.toString(10)},hexadecimal:function(r){return r>=0?\"0x\"+r.toString(16).toUpperCase():\"-0x\"+r.toString(16).toUpperCase().slice(1)}},defaultStyle:\"decimal\",styleAliases:{binary:[2,\"bin\"],octal:[8,\"oct\"],decimal:[10,\"dec\"],hexadecimal:[16,\"hex\"]}})});var UU=w((NZe,KU)=>{\"use strict\";var MU=tc(),ahe=si(),Ahe=new RegExp(\"^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\\\.[0-9_]*|[-+]?\\\\.(?:inf|Inf|INF)|\\\\.(?:nan|NaN|NAN))$\");function lhe(r){return!(r===null||!Ahe.test(r)||r[r.length-1]===\"_\")}function che(r){var e,t,i,n;return e=r.replace(/_/g,\"\").toLowerCase(),t=e[0]===\"-\"?-1:1,n=[],\"+-\".indexOf(e[0])>=0&&(e=e.slice(1)),e===\".inf\"?t===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:e===\".nan\"?NaN:e.indexOf(\":\")>=0?(e.split(\":\").forEach(function(s){n.unshift(parseFloat(s,10))}),e=0,i=1,n.forEach(function(s){e+=s*i,i*=60}),t*e):t*parseFloat(e,10)}var uhe=/^[-+]?[0-9]+e/;function ghe(r,e){var t;if(isNaN(r))switch(e){case\"lowercase\":return\".nan\";case\"uppercase\":return\".NAN\";case\"camelcase\":return\".NaN\"}else if(Number.POSITIVE_INFINITY===r)switch(e){case\"lowercase\":return\".inf\";case\"uppercase\":return\".INF\";case\"camelcase\":return\".Inf\"}else if(Number.NEGATIVE_INFINITY===r)switch(e){case\"lowercase\":return\"-.inf\";case\"uppercase\":return\"-.INF\";case\"camelcase\":return\"-.Inf\"}else if(MU.isNegativeZero(r))return\"-0.0\";return t=r.toString(10),uhe.test(t)?t.replace(\"e\",\".e\"):t}function fhe(r){return Object.prototype.toString.call(r)===\"[object Number]\"&&(r%1!==0||MU.isNegativeZero(r))}KU.exports=new ahe(\"tag:yaml.org,2002:float\",{kind:\"scalar\",resolve:lhe,construct:che,predicate:fhe,represent:ghe,defaultStyle:\"lowercase\"})});var YS=w((TZe,HU)=>{\"use strict\";var hhe=rc();HU.exports=new hhe({include:[CI()],implicit:[FU(),TU(),OU(),UU()]})});var jS=w((LZe,GU)=>{\"use strict\";var phe=rc();GU.exports=new phe({include:[YS()]})});var JU=w((OZe,qU)=>{\"use strict\";var dhe=si(),YU=new RegExp(\"^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$\"),jU=new RegExp(\"^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\\\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\\\.([0-9]*))?(?:[ \\\\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$\");function Che(r){return r===null?!1:YU.exec(r)!==null||jU.exec(r)!==null}function mhe(r){var e,t,i,n,s,o,a,l=0,c=null,u,g,f;if(e=YU.exec(r),e===null&&(e=jU.exec(r)),e===null)throw new Error(\"Date resolve error\");if(t=+e[1],i=+e[2]-1,n=+e[3],!e[4])return new Date(Date.UTC(t,i,n));if(s=+e[4],o=+e[5],a=+e[6],e[7]){for(l=e[7].slice(0,3);l.length<3;)l+=\"0\";l=+l}return e[9]&&(u=+e[10],g=+(e[11]||0),c=(u*60+g)*6e4,e[9]===\"-\"&&(c=-c)),f=new Date(Date.UTC(t,i,n,s,o,a,l)),c&&f.setTime(f.getTime()-c),f}function Ehe(r){return r.toISOString()}qU.exports=new dhe(\"tag:yaml.org,2002:timestamp\",{kind:\"scalar\",resolve:Che,construct:mhe,instanceOf:Date,represent:Ehe})});var zU=w((MZe,WU)=>{\"use strict\";var Ihe=si();function yhe(r){return r===\"<<\"||r===null}WU.exports=new Ihe(\"tag:yaml.org,2002:merge\",{kind:\"scalar\",resolve:yhe})});var ZU=w((KZe,XU)=>{\"use strict\";var ic;try{VU=J,ic=VU(\"buffer\").Buffer}catch{}var VU,whe=si(),qS=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\\r`;function Bhe(r){if(r===null)return!1;var e,t,i=0,n=r.length,s=qS;for(t=0;t<n;t++)if(e=s.indexOf(r.charAt(t)),!(e>64)){if(e<0)return!1;i+=6}return i%8===0}function Qhe(r){var e,t,i=r.replace(/[\\r\\n=]/g,\"\"),n=i.length,s=qS,o=0,a=[];for(e=0;e<n;e++)e%4===0&&e&&(a.push(o>>16&255),a.push(o>>8&255),a.push(o&255)),o=o<<6|s.indexOf(i.charAt(e));return t=n%4*6,t===0?(a.push(o>>16&255),a.push(o>>8&255),a.push(o&255)):t===18?(a.push(o>>10&255),a.push(o>>2&255)):t===12&&a.push(o>>4&255),ic?ic.from?ic.from(a):new ic(a):a}function bhe(r){var e=\"\",t=0,i,n,s=r.length,o=qS;for(i=0;i<s;i++)i%3===0&&i&&(e+=o[t>>18&63],e+=o[t>>12&63],e+=o[t>>6&63],e+=o[t&63]),t=(t<<8)+r[i];return n=s%3,n===0?(e+=o[t>>18&63],e+=o[t>>12&63],e+=o[t>>6&63],e+=o[t&63]):n===2?(e+=o[t>>10&63],e+=o[t>>4&63],e+=o[t<<2&63],e+=o[64]):n===1&&(e+=o[t>>2&63],e+=o[t<<4&63],e+=o[64],e+=o[64]),e}function She(r){return ic&&ic.isBuffer(r)}XU.exports=new whe(\"tag:yaml.org,2002:binary\",{kind:\"scalar\",resolve:Bhe,construct:Qhe,predicate:She,represent:bhe})});var $U=w((HZe,_U)=>{\"use strict\";var vhe=si(),xhe=Object.prototype.hasOwnProperty,Phe=Object.prototype.toString;function Dhe(r){if(r===null)return!0;var e=[],t,i,n,s,o,a=r;for(t=0,i=a.length;t<i;t+=1){if(n=a[t],o=!1,Phe.call(n)!==\"[object Object]\")return!1;for(s in n)if(xhe.call(n,s))if(!o)o=!0;else return!1;if(!o)return!1;if(e.indexOf(s)===-1)e.push(s);else return!1}return!0}function khe(r){return r!==null?r:[]}_U.exports=new vhe(\"tag:yaml.org,2002:omap\",{kind:\"sequence\",resolve:Dhe,construct:khe})});var t2=w((GZe,e2)=>{\"use strict\";var Rhe=si(),Fhe=Object.prototype.toString;function Nhe(r){if(r===null)return!0;var e,t,i,n,s,o=r;for(s=new Array(o.length),e=0,t=o.length;e<t;e+=1){if(i=o[e],Fhe.call(i)!==\"[object Object]\"||(n=Object.keys(i),n.length!==1))return!1;s[e]=[n[0],i[n[0]]]}return!0}function The(r){if(r===null)return[];var e,t,i,n,s,o=r;for(s=new Array(o.length),e=0,t=o.length;e<t;e+=1)i=o[e],n=Object.keys(i),s[e]=[n[0],i[n[0]]];return s}e2.exports=new Rhe(\"tag:yaml.org,2002:pairs\",{kind:\"sequence\",resolve:Nhe,construct:The})});var i2=w((YZe,r2)=>{\"use strict\";var Lhe=si(),Ohe=Object.prototype.hasOwnProperty;function Mhe(r){if(r===null)return!0;var e,t=r;for(e in t)if(Ohe.call(t,e)&&t[e]!==null)return!1;return!0}function Khe(r){return r!==null?r:{}}r2.exports=new Lhe(\"tag:yaml.org,2002:set\",{kind:\"mapping\",resolve:Mhe,construct:Khe})});var Lg=w((jZe,n2)=>{\"use strict\";var Uhe=rc();n2.exports=new Uhe({include:[jS()],implicit:[JU(),zU()],explicit:[ZU(),$U(),t2(),i2()]})});var o2=w((qZe,s2)=>{\"use strict\";var Hhe=si();function Ghe(){return!0}function Yhe(){}function jhe(){return\"\"}function qhe(r){return typeof r>\"u\"}s2.exports=new Hhe(\"tag:yaml.org,2002:js/undefined\",{kind:\"scalar\",resolve:Ghe,construct:Yhe,predicate:qhe,represent:jhe})});var A2=w((JZe,a2)=>{\"use strict\";var Jhe=si();function Whe(r){if(r===null||r.length===0)return!1;var e=r,t=/\\/([gim]*)$/.exec(r),i=\"\";return!(e[0]===\"/\"&&(t&&(i=t[1]),i.length>3||e[e.length-i.length-1]!==\"/\"))}function zhe(r){var e=r,t=/\\/([gim]*)$/.exec(r),i=\"\";return e[0]===\"/\"&&(t&&(i=t[1]),e=e.slice(1,e.length-i.length-1)),new RegExp(e,i)}function Vhe(r){var e=\"/\"+r.source+\"/\";return r.global&&(e+=\"g\"),r.multiline&&(e+=\"m\"),r.ignoreCase&&(e+=\"i\"),e}function Xhe(r){return Object.prototype.toString.call(r)===\"[object RegExp]\"}a2.exports=new Jhe(\"tag:yaml.org,2002:js/regexp\",{kind:\"scalar\",resolve:Whe,construct:zhe,predicate:Xhe,represent:Vhe})});var u2=w((WZe,c2)=>{\"use strict\";var mI;try{l2=J,mI=l2(\"esprima\")}catch{typeof window<\"u\"&&(mI=window.esprima)}var l2,Zhe=si();function _he(r){if(r===null)return!1;try{var e=\"(\"+r+\")\",t=mI.parse(e,{range:!0});return!(t.type!==\"Program\"||t.body.length!==1||t.body[0].type!==\"ExpressionStatement\"||t.body[0].expression.type!==\"ArrowFunctionExpression\"&&t.body[0].expression.type!==\"FunctionExpression\")}catch{return!1}}function $he(r){var e=\"(\"+r+\")\",t=mI.parse(e,{range:!0}),i=[],n;if(t.type!==\"Program\"||t.body.length!==1||t.body[0].type!==\"ExpressionStatement\"||t.body[0].expression.type!==\"ArrowFunctionExpression\"&&t.body[0].expression.type!==\"FunctionExpression\")throw new Error(\"Failed to resolve function\");return t.body[0].expression.params.forEach(function(s){i.push(s.name)}),n=t.body[0].expression.body.range,t.body[0].expression.body.type===\"BlockStatement\"?new Function(i,e.slice(n[0]+1,n[1]-1)):new Function(i,\"return \"+e.slice(n[0],n[1]))}function epe(r){return r.toString()}function tpe(r){return Object.prototype.toString.call(r)===\"[object Function]\"}c2.exports=new Zhe(\"tag:yaml.org,2002:js/function\",{kind:\"scalar\",resolve:_he,construct:$he,predicate:tpe,represent:epe})});var Xp=w((VZe,f2)=>{\"use strict\";var g2=rc();f2.exports=g2.DEFAULT=new g2({include:[Lg()],explicit:[o2(),A2(),u2()]})});var R2=w((XZe,Zp)=>{\"use strict\";var Ba=tc(),I2=Ng(),rpe=IU(),y2=Lg(),ipe=Xp(),RA=Object.prototype.hasOwnProperty,EI=1,w2=2,B2=3,II=4,JS=1,npe=2,h2=3,spe=/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F-\\x84\\x86-\\x9F\\uFFFE\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/,ope=/[\\x85\\u2028\\u2029]/,ape=/[,\\[\\]\\{\\}]/,Q2=/^(?:!|!!|![a-z\\-]+!)$/i,b2=/^(?:!|[^,\\[\\]\\{\\}])(?:%[0-9a-f]{2}|[0-9a-z\\-#;\\/\\?:@&=\\+\\$,_\\.!~\\*'\\(\\)\\[\\]])*$/i;function p2(r){return Object.prototype.toString.call(r)}function vo(r){return r===10||r===13}function sc(r){return r===9||r===32}function fn(r){return r===9||r===32||r===10||r===13}function Og(r){return r===44||r===91||r===93||r===123||r===125}function Ape(r){var e;return 48<=r&&r<=57?r-48:(e=r|32,97<=e&&e<=102?e-97+10:-1)}function lpe(r){return r===120?2:r===117?4:r===85?8:0}function cpe(r){return 48<=r&&r<=57?r-48:-1}function d2(r){return r===48?\"\\0\":r===97?\"\\x07\":r===98?\"\\b\":r===116||r===9?\"\t\":r===110?`\n`:r===118?\"\\v\":r===102?\"\\f\":r===114?\"\\r\":r===101?\"\\x1B\":r===32?\" \":r===34?'\"':r===47?\"/\":r===92?\"\\\\\":r===78?\"\\x85\":r===95?\"\\xA0\":r===76?\"\\u2028\":r===80?\"\\u2029\":\"\"}function upe(r){return r<=65535?String.fromCharCode(r):String.fromCharCode((r-65536>>10)+55296,(r-65536&1023)+56320)}var S2=new Array(256),v2=new Array(256);for(nc=0;nc<256;nc++)S2[nc]=d2(nc)?1:0,v2[nc]=d2(nc);var nc;function gpe(r,e){this.input=r,this.filename=e.filename||null,this.schema=e.schema||ipe,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.json=e.json||!1,this.listener=e.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=r.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function x2(r,e){return new I2(e,new rpe(r.filename,r.input,r.position,r.line,r.position-r.lineStart))}function ft(r,e){throw x2(r,e)}function yI(r,e){r.onWarning&&r.onWarning.call(null,x2(r,e))}var C2={YAML:function(e,t,i){var n,s,o;e.version!==null&&ft(e,\"duplication of %YAML directive\"),i.length!==1&&ft(e,\"YAML directive accepts exactly one argument\"),n=/^([0-9]+)\\.([0-9]+)$/.exec(i[0]),n===null&&ft(e,\"ill-formed argument of the YAML directive\"),s=parseInt(n[1],10),o=parseInt(n[2],10),s!==1&&ft(e,\"unacceptable YAML version of the document\"),e.version=i[0],e.checkLineBreaks=o<2,o!==1&&o!==2&&yI(e,\"unsupported YAML version of the document\")},TAG:function(e,t,i){var n,s;i.length!==2&&ft(e,\"TAG directive accepts exactly two arguments\"),n=i[0],s=i[1],Q2.test(n)||ft(e,\"ill-formed tag handle (first argument) of the TAG directive\"),RA.call(e.tagMap,n)&&ft(e,'there is a previously declared suffix for \"'+n+'\" tag handle'),b2.test(s)||ft(e,\"ill-formed tag prefix (second argument) of the TAG directive\"),e.tagMap[n]=s}};function kA(r,e,t,i){var n,s,o,a;if(e<t){if(a=r.input.slice(e,t),i)for(n=0,s=a.length;n<s;n+=1)o=a.charCodeAt(n),o===9||32<=o&&o<=1114111||ft(r,\"expected valid JSON character\");else spe.test(a)&&ft(r,\"the stream contains non-printable characters\");r.result+=a}}function m2(r,e,t,i){var n,s,o,a;for(Ba.isObject(t)||ft(r,\"cannot merge mappings; the provided source object is unacceptable\"),n=Object.keys(t),o=0,a=n.length;o<a;o+=1)s=n[o],RA.call(e,s)||(e[s]=t[s],i[s]=!0)}function Mg(r,e,t,i,n,s,o,a){var l,c;if(Array.isArray(n))for(n=Array.prototype.slice.call(n),l=0,c=n.length;l<c;l+=1)Array.isArray(n[l])&&ft(r,\"nested arrays are not supported inside keys\"),typeof n==\"object\"&&p2(n[l])===\"[object Object]\"&&(n[l]=\"[object Object]\");if(typeof n==\"object\"&&p2(n)===\"[object Object]\"&&(n=\"[object Object]\"),n=String(n),e===null&&(e={}),i===\"tag:yaml.org,2002:merge\")if(Array.isArray(s))for(l=0,c=s.length;l<c;l+=1)m2(r,e,s[l],t);else m2(r,e,s,t);else!r.json&&!RA.call(t,n)&&RA.call(e,n)&&(r.line=o||r.line,r.position=a||r.position,ft(r,\"duplicated mapping key\")),e[n]=s,delete t[n];return e}function WS(r){var e;e=r.input.charCodeAt(r.position),e===10?r.position++:e===13?(r.position++,r.input.charCodeAt(r.position)===10&&r.position++):ft(r,\"a line break is expected\"),r.line+=1,r.lineStart=r.position}function zr(r,e,t){for(var i=0,n=r.input.charCodeAt(r.position);n!==0;){for(;sc(n);)n=r.input.charCodeAt(++r.position);if(e&&n===35)do n=r.input.charCodeAt(++r.position);while(n!==10&&n!==13&&n!==0);if(vo(n))for(WS(r),n=r.input.charCodeAt(r.position),i++,r.lineIndent=0;n===32;)r.lineIndent++,n=r.input.charCodeAt(++r.position);else break}return t!==-1&&i!==0&&r.lineIndent<t&&yI(r,\"deficient indentation\"),i}function wI(r){var e=r.position,t;return t=r.input.charCodeAt(e),!!((t===45||t===46)&&t===r.input.charCodeAt(e+1)&&t===r.input.charCodeAt(e+2)&&(e+=3,t=r.input.charCodeAt(e),t===0||fn(t)))}function zS(r,e){e===1?r.result+=\" \":e>1&&(r.result+=Ba.repeat(`\n`,e-1))}function fpe(r,e,t){var i,n,s,o,a,l,c,u,g=r.kind,f=r.result,h;if(h=r.input.charCodeAt(r.position),fn(h)||Og(h)||h===35||h===38||h===42||h===33||h===124||h===62||h===39||h===34||h===37||h===64||h===96||(h===63||h===45)&&(n=r.input.charCodeAt(r.position+1),fn(n)||t&&Og(n)))return!1;for(r.kind=\"scalar\",r.result=\"\",s=o=r.position,a=!1;h!==0;){if(h===58){if(n=r.input.charCodeAt(r.position+1),fn(n)||t&&Og(n))break}else if(h===35){if(i=r.input.charCodeAt(r.position-1),fn(i))break}else{if(r.position===r.lineStart&&wI(r)||t&&Og(h))break;if(vo(h))if(l=r.line,c=r.lineStart,u=r.lineIndent,zr(r,!1,-1),r.lineIndent>=e){a=!0,h=r.input.charCodeAt(r.position);continue}else{r.position=o,r.line=l,r.lineStart=c,r.lineIndent=u;break}}a&&(kA(r,s,o,!1),zS(r,r.line-l),s=o=r.position,a=!1),sc(h)||(o=r.position+1),h=r.input.charCodeAt(++r.position)}return kA(r,s,o,!1),r.result?!0:(r.kind=g,r.result=f,!1)}function hpe(r,e){var t,i,n;if(t=r.input.charCodeAt(r.position),t!==39)return!1;for(r.kind=\"scalar\",r.result=\"\",r.position++,i=n=r.position;(t=r.input.charCodeAt(r.position))!==0;)if(t===39)if(kA(r,i,r.position,!0),t=r.input.charCodeAt(++r.position),t===39)i=r.position,r.position++,n=r.position;else return!0;else vo(t)?(kA(r,i,n,!0),zS(r,zr(r,!1,e)),i=n=r.position):r.position===r.lineStart&&wI(r)?ft(r,\"unexpected end of the document within a single quoted scalar\"):(r.position++,n=r.position);ft(r,\"unexpected end of the stream within a single quoted scalar\")}function ppe(r,e){var t,i,n,s,o,a;if(a=r.input.charCodeAt(r.position),a!==34)return!1;for(r.kind=\"scalar\",r.result=\"\",r.position++,t=i=r.position;(a=r.input.charCodeAt(r.position))!==0;){if(a===34)return kA(r,t,r.position,!0),r.position++,!0;if(a===92){if(kA(r,t,r.position,!0),a=r.input.charCodeAt(++r.position),vo(a))zr(r,!1,e);else if(a<256&&S2[a])r.result+=v2[a],r.position++;else if((o=lpe(a))>0){for(n=o,s=0;n>0;n--)a=r.input.charCodeAt(++r.position),(o=Ape(a))>=0?s=(s<<4)+o:ft(r,\"expected hexadecimal character\");r.result+=upe(s),r.position++}else ft(r,\"unknown escape sequence\");t=i=r.position}else vo(a)?(kA(r,t,i,!0),zS(r,zr(r,!1,e)),t=i=r.position):r.position===r.lineStart&&wI(r)?ft(r,\"unexpected end of the document within a double quoted scalar\"):(r.position++,i=r.position)}ft(r,\"unexpected end of the stream within a double quoted scalar\")}function dpe(r,e){var t=!0,i,n=r.tag,s,o=r.anchor,a,l,c,u,g,f={},h,p,C,y;if(y=r.input.charCodeAt(r.position),y===91)l=93,g=!1,s=[];else if(y===123)l=125,g=!0,s={};else return!1;for(r.anchor!==null&&(r.anchorMap[r.anchor]=s),y=r.input.charCodeAt(++r.position);y!==0;){if(zr(r,!0,e),y=r.input.charCodeAt(r.position),y===l)return r.position++,r.tag=n,r.anchor=o,r.kind=g?\"mapping\":\"sequence\",r.result=s,!0;t||ft(r,\"missed comma between flow collection entries\"),p=h=C=null,c=u=!1,y===63&&(a=r.input.charCodeAt(r.position+1),fn(a)&&(c=u=!0,r.position++,zr(r,!0,e))),i=r.line,Kg(r,e,EI,!1,!0),p=r.tag,h=r.result,zr(r,!0,e),y=r.input.charCodeAt(r.position),(u||r.line===i)&&y===58&&(c=!0,y=r.input.charCodeAt(++r.position),zr(r,!0,e),Kg(r,e,EI,!1,!0),C=r.result),g?Mg(r,s,f,p,h,C):c?s.push(Mg(r,null,f,p,h,C)):s.push(h),zr(r,!0,e),y=r.input.charCodeAt(r.position),y===44?(t=!0,y=r.input.charCodeAt(++r.position)):t=!1}ft(r,\"unexpected end of the stream within a flow collection\")}function Cpe(r,e){var t,i,n=JS,s=!1,o=!1,a=e,l=0,c=!1,u,g;if(g=r.input.charCodeAt(r.position),g===124)i=!1;else if(g===62)i=!0;else return!1;for(r.kind=\"scalar\",r.result=\"\";g!==0;)if(g=r.input.charCodeAt(++r.position),g===43||g===45)JS===n?n=g===43?h2:npe:ft(r,\"repeat of a chomping mode identifier\");else if((u=cpe(g))>=0)u===0?ft(r,\"bad explicit indentation width of a block scalar; it cannot be less than one\"):o?ft(r,\"repeat of an indentation width identifier\"):(a=e+u-1,o=!0);else break;if(sc(g)){do g=r.input.charCodeAt(++r.position);while(sc(g));if(g===35)do g=r.input.charCodeAt(++r.position);while(!vo(g)&&g!==0)}for(;g!==0;){for(WS(r),r.lineIndent=0,g=r.input.charCodeAt(r.position);(!o||r.lineIndent<a)&&g===32;)r.lineIndent++,g=r.input.charCodeAt(++r.position);if(!o&&r.lineIndent>a&&(a=r.lineIndent),vo(g)){l++;continue}if(r.lineIndent<a){n===h2?r.result+=Ba.repeat(`\n`,s?1+l:l):n===JS&&s&&(r.result+=`\n`);break}for(i?sc(g)?(c=!0,r.result+=Ba.repeat(`\n`,s?1+l:l)):c?(c=!1,r.result+=Ba.repeat(`\n`,l+1)):l===0?s&&(r.result+=\" \"):r.result+=Ba.repeat(`\n`,l):r.result+=Ba.repeat(`\n`,s?1+l:l),s=!0,o=!0,l=0,t=r.position;!vo(g)&&g!==0;)g=r.input.charCodeAt(++r.position);kA(r,t,r.position,!1)}return!0}function E2(r,e){var t,i=r.tag,n=r.anchor,s=[],o,a=!1,l;for(r.anchor!==null&&(r.anchorMap[r.anchor]=s),l=r.input.charCodeAt(r.position);l!==0&&!(l!==45||(o=r.input.charCodeAt(r.position+1),!fn(o)));){if(a=!0,r.position++,zr(r,!0,-1)&&r.lineIndent<=e){s.push(null),l=r.input.charCodeAt(r.position);continue}if(t=r.line,Kg(r,e,B2,!1,!0),s.push(r.result),zr(r,!0,-1),l=r.input.charCodeAt(r.position),(r.line===t||r.lineIndent>e)&&l!==0)ft(r,\"bad indentation of a sequence entry\");else if(r.lineIndent<e)break}return a?(r.tag=i,r.anchor=n,r.kind=\"sequence\",r.result=s,!0):!1}function mpe(r,e,t){var i,n,s,o,a=r.tag,l=r.anchor,c={},u={},g=null,f=null,h=null,p=!1,C=!1,y;for(r.anchor!==null&&(r.anchorMap[r.anchor]=c),y=r.input.charCodeAt(r.position);y!==0;){if(i=r.input.charCodeAt(r.position+1),s=r.line,o=r.position,(y===63||y===58)&&fn(i))y===63?(p&&(Mg(r,c,u,g,f,null),g=f=h=null),C=!0,p=!0,n=!0):p?(p=!1,n=!0):ft(r,\"incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line\"),r.position+=1,y=i;else if(Kg(r,t,w2,!1,!0))if(r.line===s){for(y=r.input.charCodeAt(r.position);sc(y);)y=r.input.charCodeAt(++r.position);if(y===58)y=r.input.charCodeAt(++r.position),fn(y)||ft(r,\"a whitespace character is expected after the key-value separator within a block mapping\"),p&&(Mg(r,c,u,g,f,null),g=f=h=null),C=!0,p=!1,n=!1,g=r.tag,f=r.result;else if(C)ft(r,\"can not read an implicit mapping pair; a colon is missed\");else return r.tag=a,r.anchor=l,!0}else if(C)ft(r,\"can not read a block mapping entry; a multiline key may not be an implicit key\");else return r.tag=a,r.anchor=l,!0;else break;if((r.line===s||r.lineIndent>e)&&(Kg(r,e,II,!0,n)&&(p?f=r.result:h=r.result),p||(Mg(r,c,u,g,f,h,s,o),g=f=h=null),zr(r,!0,-1),y=r.input.charCodeAt(r.position)),r.lineIndent>e&&y!==0)ft(r,\"bad indentation of a mapping entry\");else if(r.lineIndent<e)break}return p&&Mg(r,c,u,g,f,null),C&&(r.tag=a,r.anchor=l,r.kind=\"mapping\",r.result=c),C}function Epe(r){var e,t=!1,i=!1,n,s,o;if(o=r.input.charCodeAt(r.position),o!==33)return!1;if(r.tag!==null&&ft(r,\"duplication of a tag property\"),o=r.input.charCodeAt(++r.position),o===60?(t=!0,o=r.input.charCodeAt(++r.position)):o===33?(i=!0,n=\"!!\",o=r.input.charCodeAt(++r.position)):n=\"!\",e=r.position,t){do o=r.input.charCodeAt(++r.position);while(o!==0&&o!==62);r.position<r.length?(s=r.input.slice(e,r.position),o=r.input.charCodeAt(++r.position)):ft(r,\"unexpected end of the stream within a verbatim tag\")}else{for(;o!==0&&!fn(o);)o===33&&(i?ft(r,\"tag suffix cannot contain exclamation marks\"):(n=r.input.slice(e-1,r.position+1),Q2.test(n)||ft(r,\"named tag handle cannot contain such characters\"),i=!0,e=r.position+1)),o=r.input.charCodeAt(++r.position);s=r.input.slice(e,r.position),ape.test(s)&&ft(r,\"tag suffix cannot contain flow indicator characters\")}return s&&!b2.test(s)&&ft(r,\"tag name cannot contain such characters: \"+s),t?r.tag=s:RA.call(r.tagMap,n)?r.tag=r.tagMap[n]+s:n===\"!\"?r.tag=\"!\"+s:n===\"!!\"?r.tag=\"tag:yaml.org,2002:\"+s:ft(r,'undeclared tag handle \"'+n+'\"'),!0}function Ipe(r){var e,t;if(t=r.input.charCodeAt(r.position),t!==38)return!1;for(r.anchor!==null&&ft(r,\"duplication of an anchor property\"),t=r.input.charCodeAt(++r.position),e=r.position;t!==0&&!fn(t)&&!Og(t);)t=r.input.charCodeAt(++r.position);return r.position===e&&ft(r,\"name of an anchor node must contain at least one character\"),r.anchor=r.input.slice(e,r.position),!0}function ype(r){var e,t,i;if(i=r.input.charCodeAt(r.position),i!==42)return!1;for(i=r.input.charCodeAt(++r.position),e=r.position;i!==0&&!fn(i)&&!Og(i);)i=r.input.charCodeAt(++r.position);return r.position===e&&ft(r,\"name of an alias node must contain at least one character\"),t=r.input.slice(e,r.position),RA.call(r.anchorMap,t)||ft(r,'unidentified alias \"'+t+'\"'),r.result=r.anchorMap[t],zr(r,!0,-1),!0}function Kg(r,e,t,i,n){var s,o,a,l=1,c=!1,u=!1,g,f,h,p,C;if(r.listener!==null&&r.listener(\"open\",r),r.tag=null,r.anchor=null,r.kind=null,r.result=null,s=o=a=II===t||B2===t,i&&zr(r,!0,-1)&&(c=!0,r.lineIndent>e?l=1:r.lineIndent===e?l=0:r.lineIndent<e&&(l=-1)),l===1)for(;Epe(r)||Ipe(r);)zr(r,!0,-1)?(c=!0,a=s,r.lineIndent>e?l=1:r.lineIndent===e?l=0:r.lineIndent<e&&(l=-1)):a=!1;if(a&&(a=c||n),(l===1||II===t)&&(EI===t||w2===t?p=e:p=e+1,C=r.position-r.lineStart,l===1?a&&(E2(r,C)||mpe(r,C,p))||dpe(r,p)?u=!0:(o&&Cpe(r,p)||hpe(r,p)||ppe(r,p)?u=!0:ype(r)?(u=!0,(r.tag!==null||r.anchor!==null)&&ft(r,\"alias node should not have any properties\")):fpe(r,p,EI===t)&&(u=!0,r.tag===null&&(r.tag=\"?\")),r.anchor!==null&&(r.anchorMap[r.anchor]=r.result)):l===0&&(u=a&&E2(r,C))),r.tag!==null&&r.tag!==\"!\")if(r.tag===\"?\"){for(r.result!==null&&r.kind!==\"scalar\"&&ft(r,'unacceptable node kind for !<?> tag; it should be \"scalar\", not \"'+r.kind+'\"'),g=0,f=r.implicitTypes.length;g<f;g+=1)if(h=r.implicitTypes[g],h.resolve(r.result)){r.result=h.construct(r.result),r.tag=h.tag,r.anchor!==null&&(r.anchorMap[r.anchor]=r.result);break}}else RA.call(r.typeMap[r.kind||\"fallback\"],r.tag)?(h=r.typeMap[r.kind||\"fallback\"][r.tag],r.result!==null&&h.kind!==r.kind&&ft(r,\"unacceptable node kind for !<\"+r.tag+'> tag; it should be \"'+h.kind+'\", not \"'+r.kind+'\"'),h.resolve(r.result)?(r.result=h.construct(r.result),r.anchor!==null&&(r.anchorMap[r.anchor]=r.result)):ft(r,\"cannot resolve a node with !<\"+r.tag+\"> explicit tag\")):ft(r,\"unknown tag !<\"+r.tag+\">\");return r.listener!==null&&r.listener(\"close\",r),r.tag!==null||r.anchor!==null||u}function wpe(r){var e=r.position,t,i,n,s=!1,o;for(r.version=null,r.checkLineBreaks=r.legacy,r.tagMap={},r.anchorMap={};(o=r.input.charCodeAt(r.position))!==0&&(zr(r,!0,-1),o=r.input.charCodeAt(r.position),!(r.lineIndent>0||o!==37));){for(s=!0,o=r.input.charCodeAt(++r.position),t=r.position;o!==0&&!fn(o);)o=r.input.charCodeAt(++r.position);for(i=r.input.slice(t,r.position),n=[],i.length<1&&ft(r,\"directive name must not be less than one character in length\");o!==0;){for(;sc(o);)o=r.input.charCodeAt(++r.position);if(o===35){do o=r.input.charCodeAt(++r.position);while(o!==0&&!vo(o));break}if(vo(o))break;for(t=r.position;o!==0&&!fn(o);)o=r.input.charCodeAt(++r.position);n.push(r.input.slice(t,r.position))}o!==0&&WS(r),RA.call(C2,i)?C2[i](r,i,n):yI(r,'unknown document directive \"'+i+'\"')}if(zr(r,!0,-1),r.lineIndent===0&&r.input.charCodeAt(r.position)===45&&r.input.charCodeAt(r.position+1)===45&&r.input.charCodeAt(r.position+2)===45?(r.position+=3,zr(r,!0,-1)):s&&ft(r,\"directives end mark is expected\"),Kg(r,r.lineIndent-1,II,!1,!0),zr(r,!0,-1),r.checkLineBreaks&&ope.test(r.input.slice(e,r.position))&&yI(r,\"non-ASCII line breaks are interpreted as content\"),r.documents.push(r.result),r.position===r.lineStart&&wI(r)){r.input.charCodeAt(r.position)===46&&(r.position+=3,zr(r,!0,-1));return}if(r.position<r.length-1)ft(r,\"end of the stream or a document separator is expected\");else return}function P2(r,e){r=String(r),e=e||{},r.length!==0&&(r.charCodeAt(r.length-1)!==10&&r.charCodeAt(r.length-1)!==13&&(r+=`\n`),r.charCodeAt(0)===65279&&(r=r.slice(1)));var t=new gpe(r,e),i=r.indexOf(\"\\0\");for(i!==-1&&(t.position=i,ft(t,\"null byte is not allowed in input\")),t.input+=\"\\0\";t.input.charCodeAt(t.position)===32;)t.lineIndent+=1,t.position+=1;for(;t.position<t.length-1;)wpe(t);return t.documents}function D2(r,e,t){e!==null&&typeof e==\"object\"&&typeof t>\"u\"&&(t=e,e=null);var i=P2(r,t);if(typeof e!=\"function\")return i;for(var n=0,s=i.length;n<s;n+=1)e(i[n])}function k2(r,e){var t=P2(r,e);if(t.length!==0){if(t.length===1)return t[0];throw new I2(\"expected a single document in the stream, but found more\")}}function Bpe(r,e,t){return typeof e==\"object\"&&e!==null&&typeof t>\"u\"&&(t=e,e=null),D2(r,e,Ba.extend({schema:y2},t))}function Qpe(r,e){return k2(r,Ba.extend({schema:y2},e))}Zp.exports.loadAll=D2;Zp.exports.load=k2;Zp.exports.safeLoadAll=Bpe;Zp.exports.safeLoad=Qpe});var tH=w((ZZe,_S)=>{\"use strict\";var $p=tc(),ed=Ng(),bpe=Xp(),Spe=Lg(),U2=Object.prototype.toString,H2=Object.prototype.hasOwnProperty,vpe=9,_p=10,xpe=13,Ppe=32,Dpe=33,kpe=34,G2=35,Rpe=37,Fpe=38,Npe=39,Tpe=42,Y2=44,Lpe=45,j2=58,Ope=61,Mpe=62,Kpe=63,Upe=64,q2=91,J2=93,Hpe=96,W2=123,Gpe=124,z2=125,Ni={};Ni[0]=\"\\\\0\";Ni[7]=\"\\\\a\";Ni[8]=\"\\\\b\";Ni[9]=\"\\\\t\";Ni[10]=\"\\\\n\";Ni[11]=\"\\\\v\";Ni[12]=\"\\\\f\";Ni[13]=\"\\\\r\";Ni[27]=\"\\\\e\";Ni[34]='\\\\\"';Ni[92]=\"\\\\\\\\\";Ni[133]=\"\\\\N\";Ni[160]=\"\\\\_\";Ni[8232]=\"\\\\L\";Ni[8233]=\"\\\\P\";var Ype=[\"y\",\"Y\",\"yes\",\"Yes\",\"YES\",\"on\",\"On\",\"ON\",\"n\",\"N\",\"no\",\"No\",\"NO\",\"off\",\"Off\",\"OFF\"];function jpe(r,e){var t,i,n,s,o,a,l;if(e===null)return{};for(t={},i=Object.keys(e),n=0,s=i.length;n<s;n+=1)o=i[n],a=String(e[o]),o.slice(0,2)===\"!!\"&&(o=\"tag:yaml.org,2002:\"+o.slice(2)),l=r.compiledTypeMap.fallback[o],l&&H2.call(l.styleAliases,a)&&(a=l.styleAliases[a]),t[o]=a;return t}function F2(r){var e,t,i;if(e=r.toString(16).toUpperCase(),r<=255)t=\"x\",i=2;else if(r<=65535)t=\"u\",i=4;else if(r<=4294967295)t=\"U\",i=8;else throw new ed(\"code point within a string may not be greater than 0xFFFFFFFF\");return\"\\\\\"+t+$p.repeat(\"0\",i-e.length)+e}function qpe(r){this.schema=r.schema||bpe,this.indent=Math.max(1,r.indent||2),this.noArrayIndent=r.noArrayIndent||!1,this.skipInvalid=r.skipInvalid||!1,this.flowLevel=$p.isNothing(r.flowLevel)?-1:r.flowLevel,this.styleMap=jpe(this.schema,r.styles||null),this.sortKeys=r.sortKeys||!1,this.lineWidth=r.lineWidth||80,this.noRefs=r.noRefs||!1,this.noCompatMode=r.noCompatMode||!1,this.condenseFlow=r.condenseFlow||!1,this.implicitTypes=this.schema.compiledImplicit,this.explicitTypes=this.schema.compiledExplicit,this.tag=null,this.result=\"\",this.duplicates=[],this.usedDuplicates=null}function N2(r,e){for(var t=$p.repeat(\" \",e),i=0,n=-1,s=\"\",o,a=r.length;i<a;)n=r.indexOf(`\n`,i),n===-1?(o=r.slice(i),i=a):(o=r.slice(i,n+1),i=n+1),o.length&&o!==`\n`&&(s+=t),s+=o;return s}function VS(r,e){return`\n`+$p.repeat(\" \",r.indent*e)}function Jpe(r,e){var t,i,n;for(t=0,i=r.implicitTypes.length;t<i;t+=1)if(n=r.implicitTypes[t],n.resolve(e))return!0;return!1}function ZS(r){return r===Ppe||r===vpe}function Ug(r){return 32<=r&&r<=126||161<=r&&r<=55295&&r!==8232&&r!==8233||57344<=r&&r<=65533&&r!==65279||65536<=r&&r<=1114111}function Wpe(r){return Ug(r)&&!ZS(r)&&r!==65279&&r!==xpe&&r!==_p}function T2(r,e){return Ug(r)&&r!==65279&&r!==Y2&&r!==q2&&r!==J2&&r!==W2&&r!==z2&&r!==j2&&(r!==G2||e&&Wpe(e))}function zpe(r){return Ug(r)&&r!==65279&&!ZS(r)&&r!==Lpe&&r!==Kpe&&r!==j2&&r!==Y2&&r!==q2&&r!==J2&&r!==W2&&r!==z2&&r!==G2&&r!==Fpe&&r!==Tpe&&r!==Dpe&&r!==Gpe&&r!==Ope&&r!==Mpe&&r!==Npe&&r!==kpe&&r!==Rpe&&r!==Upe&&r!==Hpe}function V2(r){var e=/^\\n* /;return e.test(r)}var X2=1,Z2=2,_2=3,$2=4,BI=5;function Vpe(r,e,t,i,n){var s,o,a,l=!1,c=!1,u=i!==-1,g=-1,f=zpe(r.charCodeAt(0))&&!ZS(r.charCodeAt(r.length-1));if(e)for(s=0;s<r.length;s++){if(o=r.charCodeAt(s),!Ug(o))return BI;a=s>0?r.charCodeAt(s-1):null,f=f&&T2(o,a)}else{for(s=0;s<r.length;s++){if(o=r.charCodeAt(s),o===_p)l=!0,u&&(c=c||s-g-1>i&&r[g+1]!==\" \",g=s);else if(!Ug(o))return BI;a=s>0?r.charCodeAt(s-1):null,f=f&&T2(o,a)}c=c||u&&s-g-1>i&&r[g+1]!==\" \"}return!l&&!c?f&&!n(r)?X2:Z2:t>9&&V2(r)?BI:c?$2:_2}function Xpe(r,e,t,i){r.dump=function(){if(e.length===0)return\"''\";if(!r.noCompatMode&&Ype.indexOf(e)!==-1)return\"'\"+e+\"'\";var n=r.indent*Math.max(1,t),s=r.lineWidth===-1?-1:Math.max(Math.min(r.lineWidth,40),r.lineWidth-n),o=i||r.flowLevel>-1&&t>=r.flowLevel;function a(l){return Jpe(r,l)}switch(Vpe(e,o,r.indent,s,a)){case X2:return e;case Z2:return\"'\"+e.replace(/'/g,\"''\")+\"'\";case _2:return\"|\"+L2(e,r.indent)+O2(N2(e,n));case $2:return\">\"+L2(e,r.indent)+O2(N2(Zpe(e,s),n));case BI:return'\"'+_pe(e,s)+'\"';default:throw new ed(\"impossible error: invalid scalar style\")}}()}function L2(r,e){var t=V2(r)?String(e):\"\",i=r[r.length-1]===`\n`,n=i&&(r[r.length-2]===`\n`||r===`\n`),s=n?\"+\":i?\"\":\"-\";return t+s+`\n`}function O2(r){return r[r.length-1]===`\n`?r.slice(0,-1):r}function Zpe(r,e){for(var t=/(\\n+)([^\\n]*)/g,i=function(){var c=r.indexOf(`\n`);return c=c!==-1?c:r.length,t.lastIndex=c,M2(r.slice(0,c),e)}(),n=r[0]===`\n`||r[0]===\" \",s,o;o=t.exec(r);){var a=o[1],l=o[2];s=l[0]===\" \",i+=a+(!n&&!s&&l!==\"\"?`\n`:\"\")+M2(l,e),n=s}return i}function M2(r,e){if(r===\"\"||r[0]===\" \")return r;for(var t=/ [^ ]/g,i,n=0,s,o=0,a=0,l=\"\";i=t.exec(r);)a=i.index,a-n>e&&(s=o>n?o:a,l+=`\n`+r.slice(n,s),n=s+1),o=a;return l+=`\n`,r.length-n>e&&o>n?l+=r.slice(n,o)+`\n`+r.slice(o+1):l+=r.slice(n),l.slice(1)}function _pe(r){for(var e=\"\",t,i,n,s=0;s<r.length;s++){if(t=r.charCodeAt(s),t>=55296&&t<=56319&&(i=r.charCodeAt(s+1),i>=56320&&i<=57343)){e+=F2((t-55296)*1024+i-56320+65536),s++;continue}n=Ni[t],e+=!n&&Ug(t)?r[s]:n||F2(t)}return e}function $pe(r,e,t){var i=\"\",n=r.tag,s,o;for(s=0,o=t.length;s<o;s+=1)oc(r,e,t[s],!1,!1)&&(s!==0&&(i+=\",\"+(r.condenseFlow?\"\":\" \")),i+=r.dump);r.tag=n,r.dump=\"[\"+i+\"]\"}function ede(r,e,t,i){var n=\"\",s=r.tag,o,a;for(o=0,a=t.length;o<a;o+=1)oc(r,e+1,t[o],!0,!0)&&((!i||o!==0)&&(n+=VS(r,e)),r.dump&&_p===r.dump.charCodeAt(0)?n+=\"-\":n+=\"- \",n+=r.dump);r.tag=s,r.dump=n||\"[]\"}function tde(r,e,t){var i=\"\",n=r.tag,s=Object.keys(t),o,a,l,c,u;for(o=0,a=s.length;o<a;o+=1)u=\"\",o!==0&&(u+=\", \"),r.condenseFlow&&(u+='\"'),l=s[o],c=t[l],oc(r,e,l,!1,!1)&&(r.dump.length>1024&&(u+=\"? \"),u+=r.dump+(r.condenseFlow?'\"':\"\")+\":\"+(r.condenseFlow?\"\":\" \"),oc(r,e,c,!1,!1)&&(u+=r.dump,i+=u));r.tag=n,r.dump=\"{\"+i+\"}\"}function rde(r,e,t,i){var n=\"\",s=r.tag,o=Object.keys(t),a,l,c,u,g,f;if(r.sortKeys===!0)o.sort();else if(typeof r.sortKeys==\"function\")o.sort(r.sortKeys);else if(r.sortKeys)throw new ed(\"sortKeys must be a boolean or a function\");for(a=0,l=o.length;a<l;a+=1)f=\"\",(!i||a!==0)&&(f+=VS(r,e)),c=o[a],u=t[c],oc(r,e+1,c,!0,!0,!0)&&(g=r.tag!==null&&r.tag!==\"?\"||r.dump&&r.dump.length>1024,g&&(r.dump&&_p===r.dump.charCodeAt(0)?f+=\"?\":f+=\"? \"),f+=r.dump,g&&(f+=VS(r,e)),oc(r,e+1,u,!0,g)&&(r.dump&&_p===r.dump.charCodeAt(0)?f+=\":\":f+=\": \",f+=r.dump,n+=f));r.tag=s,r.dump=n||\"{}\"}function K2(r,e,t){var i,n,s,o,a,l;for(n=t?r.explicitTypes:r.implicitTypes,s=0,o=n.length;s<o;s+=1)if(a=n[s],(a.instanceOf||a.predicate)&&(!a.instanceOf||typeof e==\"object\"&&e instanceof a.instanceOf)&&(!a.predicate||a.predicate(e))){if(r.tag=t?a.tag:\"?\",a.represent){if(l=r.styleMap[a.tag]||a.defaultStyle,U2.call(a.represent)===\"[object Function]\")i=a.represent(e,l);else if(H2.call(a.represent,l))i=a.represent[l](e,l);else throw new ed(\"!<\"+a.tag+'> tag resolver accepts not \"'+l+'\" style');r.dump=i}return!0}return!1}function oc(r,e,t,i,n,s){r.tag=null,r.dump=t,K2(r,t,!1)||K2(r,t,!0);var o=U2.call(r.dump);i&&(i=r.flowLevel<0||r.flowLevel>e);var a=o===\"[object Object]\"||o===\"[object Array]\",l,c;if(a&&(l=r.duplicates.indexOf(t),c=l!==-1),(r.tag!==null&&r.tag!==\"?\"||c||r.indent!==2&&e>0)&&(n=!1),c&&r.usedDuplicates[l])r.dump=\"*ref_\"+l;else{if(a&&c&&!r.usedDuplicates[l]&&(r.usedDuplicates[l]=!0),o===\"[object Object]\")i&&Object.keys(r.dump).length!==0?(rde(r,e,r.dump,n),c&&(r.dump=\"&ref_\"+l+r.dump)):(tde(r,e,r.dump),c&&(r.dump=\"&ref_\"+l+\" \"+r.dump));else if(o===\"[object Array]\"){var u=r.noArrayIndent&&e>0?e-1:e;i&&r.dump.length!==0?(ede(r,u,r.dump,n),c&&(r.dump=\"&ref_\"+l+r.dump)):($pe(r,u,r.dump),c&&(r.dump=\"&ref_\"+l+\" \"+r.dump))}else if(o===\"[object String]\")r.tag!==\"?\"&&Xpe(r,r.dump,e,s);else{if(r.skipInvalid)return!1;throw new ed(\"unacceptable kind of an object to dump \"+o)}r.tag!==null&&r.tag!==\"?\"&&(r.dump=\"!<\"+r.tag+\"> \"+r.dump)}return!0}function ide(r,e){var t=[],i=[],n,s;for(XS(r,t,i),n=0,s=i.length;n<s;n+=1)e.duplicates.push(t[i[n]]);e.usedDuplicates=new Array(s)}function XS(r,e,t){var i,n,s;if(r!==null&&typeof r==\"object\")if(n=e.indexOf(r),n!==-1)t.indexOf(n)===-1&&t.push(n);else if(e.push(r),Array.isArray(r))for(n=0,s=r.length;n<s;n+=1)XS(r[n],e,t);else for(i=Object.keys(r),n=0,s=i.length;n<s;n+=1)XS(r[i[n]],e,t)}function eH(r,e){e=e||{};var t=new qpe(e);return t.noRefs||ide(r,t),oc(t,0,r,!0,!0)?t.dump+`\n`:\"\"}function nde(r,e){return eH(r,$p.extend({schema:Spe},e))}_S.exports.dump=eH;_S.exports.safeDump=nde});var iH=w((_Ze,Fr)=>{\"use strict\";var QI=R2(),rH=tH();function bI(r){return function(){throw new Error(\"Function \"+r+\" is deprecated and cannot be used.\")}}Fr.exports.Type=si();Fr.exports.Schema=rc();Fr.exports.FAILSAFE_SCHEMA=CI();Fr.exports.JSON_SCHEMA=YS();Fr.exports.CORE_SCHEMA=jS();Fr.exports.DEFAULT_SAFE_SCHEMA=Lg();Fr.exports.DEFAULT_FULL_SCHEMA=Xp();Fr.exports.load=QI.load;Fr.exports.loadAll=QI.loadAll;Fr.exports.safeLoad=QI.safeLoad;Fr.exports.safeLoadAll=QI.safeLoadAll;Fr.exports.dump=rH.dump;Fr.exports.safeDump=rH.safeDump;Fr.exports.YAMLException=Ng();Fr.exports.MINIMAL_SCHEMA=CI();Fr.exports.SAFE_SCHEMA=Lg();Fr.exports.DEFAULT_SCHEMA=Xp();Fr.exports.scan=bI(\"scan\");Fr.exports.parse=bI(\"parse\");Fr.exports.compose=bI(\"compose\");Fr.exports.addConstructor=bI(\"addConstructor\")});var sH=w(($Ze,nH)=>{\"use strict\";var sde=iH();nH.exports=sde});var aH=w((e_e,oH)=>{\"use strict\";function ode(r,e){function t(){this.constructor=r}t.prototype=e.prototype,r.prototype=new t}function ac(r,e,t,i){this.message=r,this.expected=e,this.found=t,this.location=i,this.name=\"SyntaxError\",typeof Error.captureStackTrace==\"function\"&&Error.captureStackTrace(this,ac)}ode(ac,Error);ac.buildMessage=function(r,e){var t={literal:function(c){return'\"'+n(c.text)+'\"'},class:function(c){var u=\"\",g;for(g=0;g<c.parts.length;g++)u+=c.parts[g]instanceof Array?s(c.parts[g][0])+\"-\"+s(c.parts[g][1]):s(c.parts[g]);return\"[\"+(c.inverted?\"^\":\"\")+u+\"]\"},any:function(c){return\"any character\"},end:function(c){return\"end of input\"},other:function(c){return c.description}};function i(c){return c.charCodeAt(0).toString(16).toUpperCase()}function n(c){return c.replace(/\\\\/g,\"\\\\\\\\\").replace(/\"/g,'\\\\\"').replace(/\\0/g,\"\\\\0\").replace(/\\t/g,\"\\\\t\").replace(/\\n/g,\"\\\\n\").replace(/\\r/g,\"\\\\r\").replace(/[\\x00-\\x0F]/g,function(u){return\"\\\\x0\"+i(u)}).replace(/[\\x10-\\x1F\\x7F-\\x9F]/g,function(u){return\"\\\\x\"+i(u)})}function s(c){return c.replace(/\\\\/g,\"\\\\\\\\\").replace(/\\]/g,\"\\\\]\").replace(/\\^/g,\"\\\\^\").replace(/-/g,\"\\\\-\").replace(/\\0/g,\"\\\\0\").replace(/\\t/g,\"\\\\t\").replace(/\\n/g,\"\\\\n\").replace(/\\r/g,\"\\\\r\").replace(/[\\x00-\\x0F]/g,function(u){return\"\\\\x0\"+i(u)}).replace(/[\\x10-\\x1F\\x7F-\\x9F]/g,function(u){return\"\\\\x\"+i(u)})}function o(c){return t[c.type](c)}function a(c){var u=new Array(c.length),g,f;for(g=0;g<c.length;g++)u[g]=o(c[g]);if(u.sort(),u.length>0){for(g=1,f=1;g<u.length;g++)u[g-1]!==u[g]&&(u[f]=u[g],f++);u.length=f}switch(u.length){case 1:return u[0];case 2:return u[0]+\" or \"+u[1];default:return u.slice(0,-1).join(\", \")+\", or \"+u[u.length-1]}}function l(c){return c?'\"'+n(c)+'\"':\"end of input\"}return\"Expected \"+a(r)+\" but \"+l(e)+\" found.\"};function ade(r,e){e=e!==void 0?e:{};var t={},i={Start:Hs},n=Hs,s=function(R){return[].concat(...R)},o=\"-\",a=ar(\"-\",!1),l=function(R){return R},c=function(R){return Object.assign({},...R)},u=\"#\",g=ar(\"#\",!1),f=Kl(),h=function(){return{}},p=\":\",C=ar(\":\",!1),y=function(R,q){return{[R]:q}},B=\",\",v=ar(\",\",!1),D=function(R,q){return q},T=function(R,q,Ce){return Object.assign({},...[R].concat(q).map(Ke=>({[Ke]:Ce})))},H=function(R){return R},j=function(R){return R},$=Us(\"correct indentation\"),V=\" \",W=ar(\" \",!1),_=function(R){return R.length===bA*yg},A=function(R){return R.length===(bA+1)*yg},Ae=function(){return bA++,!0},ge=function(){return bA--,!0},re=function(){return pg()},O=Us(\"pseudostring\"),F=/^[^\\r\\n\\t ?:,\\][{}#&*!|>'\"%@`\\-]/,ue=Tn([\"\\r\",`\n`,\"\t\",\" \",\"?\",\":\",\",\",\"]\",\"[\",\"{\",\"}\",\"#\",\"&\",\"*\",\"!\",\"|\",\">\",\"'\",'\"',\"%\",\"@\",\"`\",\"-\"],!0,!1),pe=/^[^\\r\\n\\t ,\\][{}:#\"']/,ke=Tn([\"\\r\",`\n`,\"\t\",\" \",\",\",\"]\",\"[\",\"{\",\"}\",\":\",\"#\",'\"',\"'\"],!0,!1),Fe=function(){return pg().replace(/^ *| *$/g,\"\")},Ne=\"--\",oe=ar(\"--\",!1),le=/^[a-zA-Z\\/0-9]/,Be=Tn([[\"a\",\"z\"],[\"A\",\"Z\"],\"/\",[\"0\",\"9\"]],!1,!1),fe=/^[^\\r\\n\\t :,]/,ae=Tn([\"\\r\",`\n`,\"\t\",\" \",\":\",\",\"],!0,!1),qe=\"null\",ne=ar(\"null\",!1),Y=function(){return null},he=\"true\",ie=ar(\"true\",!1),de=function(){return!0},_e=\"false\",Pt=ar(\"false\",!1),It=function(){return!1},Or=Us(\"string\"),ii='\"',gi=ar('\"',!1),hr=function(){return\"\"},fi=function(R){return R},ni=function(R){return R.join(\"\")},Ks=/^[^\"\\\\\\0-\\x1F\\x7F]/,pr=Tn(['\"',\"\\\\\",[\"\\0\",\"\u001f\"],\"\\x7F\"],!0,!1),Ii='\\\\\"',rs=ar('\\\\\"',!1),fa=function(){return'\"'},CA=\"\\\\\\\\\",cg=ar(\"\\\\\\\\\",!1),is=function(){return\"\\\\\"},mA=\"\\\\/\",ha=ar(\"\\\\/\",!1),wp=function(){return\"/\"},EA=\"\\\\b\",IA=ar(\"\\\\b\",!1),wr=function(){return\"\\b\"},Tl=\"\\\\f\",ug=ar(\"\\\\f\",!1),Io=function(){return\"\\f\"},gg=\"\\\\n\",Bp=ar(\"\\\\n\",!1),Qp=function(){return`\n`},vr=\"\\\\r\",se=ar(\"\\\\r\",!1),yo=function(){return\"\\r\"},Fn=\"\\\\t\",fg=ar(\"\\\\t\",!1),Qt=function(){return\"\t\"},Ll=\"\\\\u\",Nn=ar(\"\\\\u\",!1),ns=function(R,q,Ce,Ke){return String.fromCharCode(parseInt(`0x${R}${q}${Ce}${Ke}`))},ss=/^[0-9a-fA-F]/,gt=Tn([[\"0\",\"9\"],[\"a\",\"f\"],[\"A\",\"F\"]],!1,!1),wo=Us(\"blank space\"),At=/^[ \\t]/,ln=Tn([\" \",\"\t\"],!1,!1),S=Us(\"white space\"),Lt=/^[ \\t\\n\\r]/,hg=Tn([\" \",\"\t\",`\n`,\"\\r\"],!1,!1),Ol=`\\r\n`,bp=ar(`\\r\n`,!1),Sp=`\n`,vp=ar(`\n`,!1),xp=\"\\r\",Pp=ar(\"\\r\",!1),G=0,yt=0,yA=[{line:1,column:1}],zi=0,Ml=[],Xe=0,pa;if(\"startRule\"in e){if(!(e.startRule in i))throw new Error(`Can't start parsing from rule \"`+e.startRule+'\".');n=i[e.startRule]}function pg(){return r.substring(yt,G)}function OE(){return cn(yt,G)}function Dp(R,q){throw q=q!==void 0?q:cn(yt,G),Ul([Us(R)],r.substring(yt,G),q)}function ME(R,q){throw q=q!==void 0?q:cn(yt,G),dg(R,q)}function ar(R,q){return{type:\"literal\",text:R,ignoreCase:q}}function Tn(R,q,Ce){return{type:\"class\",parts:R,inverted:q,ignoreCase:Ce}}function Kl(){return{type:\"any\"}}function kp(){return{type:\"end\"}}function Us(R){return{type:\"other\",description:R}}function da(R){var q=yA[R],Ce;if(q)return q;for(Ce=R-1;!yA[Ce];)Ce--;for(q=yA[Ce],q={line:q.line,column:q.column};Ce<R;)r.charCodeAt(Ce)===10?(q.line++,q.column=1):q.column++,Ce++;return yA[R]=q,q}function cn(R,q){var Ce=da(R),Ke=da(q);return{start:{offset:R,line:Ce.line,column:Ce.column},end:{offset:q,line:Ke.line,column:Ke.column}}}function Le(R){G<zi||(G>zi&&(zi=G,Ml=[]),Ml.push(R))}function dg(R,q){return new ac(R,null,null,q)}function Ul(R,q,Ce){return new ac(ac.buildMessage(R,q),R,q,Ce)}function Hs(){var R;return R=Cg(),R}function Hl(){var R,q,Ce;for(R=G,q=[],Ce=wA();Ce!==t;)q.push(Ce),Ce=wA();return q!==t&&(yt=R,q=s(q)),R=q,R}function wA(){var R,q,Ce,Ke,Re;return R=G,q=ma(),q!==t?(r.charCodeAt(G)===45?(Ce=o,G++):(Ce=t,Xe===0&&Le(a)),Ce!==t?(Ke=Rr(),Ke!==t?(Re=Ca(),Re!==t?(yt=R,q=l(Re),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t),R}function Cg(){var R,q,Ce;for(R=G,q=[],Ce=mg();Ce!==t;)q.push(Ce),Ce=mg();return q!==t&&(yt=R,q=c(q)),R=q,R}function mg(){var R,q,Ce,Ke,Re,ze,dt,Ft,Ln;if(R=G,q=Rr(),q===t&&(q=null),q!==t){if(Ce=G,r.charCodeAt(G)===35?(Ke=u,G++):(Ke=t,Xe===0&&Le(g)),Ke!==t){if(Re=[],ze=G,dt=G,Xe++,Ft=js(),Xe--,Ft===t?dt=void 0:(G=dt,dt=t),dt!==t?(r.length>G?(Ft=r.charAt(G),G++):(Ft=t,Xe===0&&Le(f)),Ft!==t?(dt=[dt,Ft],ze=dt):(G=ze,ze=t)):(G=ze,ze=t),ze!==t)for(;ze!==t;)Re.push(ze),ze=G,dt=G,Xe++,Ft=js(),Xe--,Ft===t?dt=void 0:(G=dt,dt=t),dt!==t?(r.length>G?(Ft=r.charAt(G),G++):(Ft=t,Xe===0&&Le(f)),Ft!==t?(dt=[dt,Ft],ze=dt):(G=ze,ze=t)):(G=ze,ze=t);else Re=t;Re!==t?(Ke=[Ke,Re],Ce=Ke):(G=Ce,Ce=t)}else G=Ce,Ce=t;if(Ce===t&&(Ce=null),Ce!==t){if(Ke=[],Re=Ys(),Re!==t)for(;Re!==t;)Ke.push(Re),Re=Ys();else Ke=t;Ke!==t?(yt=R,q=h(),R=q):(G=R,R=t)}else G=R,R=t}else G=R,R=t;if(R===t&&(R=G,q=ma(),q!==t?(Ce=Gl(),Ce!==t?(Ke=Rr(),Ke===t&&(Ke=null),Ke!==t?(r.charCodeAt(G)===58?(Re=p,G++):(Re=t,Xe===0&&Le(C)),Re!==t?(ze=Rr(),ze===t&&(ze=null),ze!==t?(dt=Ca(),dt!==t?(yt=R,q=y(Ce,dt),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t),R===t&&(R=G,q=ma(),q!==t?(Ce=Gs(),Ce!==t?(Ke=Rr(),Ke===t&&(Ke=null),Ke!==t?(r.charCodeAt(G)===58?(Re=p,G++):(Re=t,Xe===0&&Le(C)),Re!==t?(ze=Rr(),ze===t&&(ze=null),ze!==t?(dt=Ca(),dt!==t?(yt=R,q=y(Ce,dt),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t),R===t))){if(R=G,q=ma(),q!==t)if(Ce=Gs(),Ce!==t)if(Ke=Rr(),Ke!==t)if(Re=KE(),Re!==t){if(ze=[],dt=Ys(),dt!==t)for(;dt!==t;)ze.push(dt),dt=Ys();else ze=t;ze!==t?(yt=R,q=y(Ce,Re),R=q):(G=R,R=t)}else G=R,R=t;else G=R,R=t;else G=R,R=t;else G=R,R=t;if(R===t)if(R=G,q=ma(),q!==t)if(Ce=Gs(),Ce!==t){if(Ke=[],Re=G,ze=Rr(),ze===t&&(ze=null),ze!==t?(r.charCodeAt(G)===44?(dt=B,G++):(dt=t,Xe===0&&Le(v)),dt!==t?(Ft=Rr(),Ft===t&&(Ft=null),Ft!==t?(Ln=Gs(),Ln!==t?(yt=Re,ze=D(Ce,Ln),Re=ze):(G=Re,Re=t)):(G=Re,Re=t)):(G=Re,Re=t)):(G=Re,Re=t),Re!==t)for(;Re!==t;)Ke.push(Re),Re=G,ze=Rr(),ze===t&&(ze=null),ze!==t?(r.charCodeAt(G)===44?(dt=B,G++):(dt=t,Xe===0&&Le(v)),dt!==t?(Ft=Rr(),Ft===t&&(Ft=null),Ft!==t?(Ln=Gs(),Ln!==t?(yt=Re,ze=D(Ce,Ln),Re=ze):(G=Re,Re=t)):(G=Re,Re=t)):(G=Re,Re=t)):(G=Re,Re=t);else Ke=t;Ke!==t?(Re=Rr(),Re===t&&(Re=null),Re!==t?(r.charCodeAt(G)===58?(ze=p,G++):(ze=t,Xe===0&&Le(C)),ze!==t?(dt=Rr(),dt===t&&(dt=null),dt!==t?(Ft=Ca(),Ft!==t?(yt=R,q=T(Ce,Ke,Ft),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)}else G=R,R=t;else G=R,R=t}return R}function Ca(){var R,q,Ce,Ke,Re,ze,dt;if(R=G,q=G,Xe++,Ce=G,Ke=js(),Ke!==t?(Re=rt(),Re!==t?(r.charCodeAt(G)===45?(ze=o,G++):(ze=t,Xe===0&&Le(a)),ze!==t?(dt=Rr(),dt!==t?(Ke=[Ke,Re,ze,dt],Ce=Ke):(G=Ce,Ce=t)):(G=Ce,Ce=t)):(G=Ce,Ce=t)):(G=Ce,Ce=t),Xe--,Ce!==t?(G=q,q=void 0):q=t,q!==t?(Ce=Ys(),Ce!==t?(Ke=Bo(),Ke!==t?(Re=Hl(),Re!==t?(ze=BA(),ze!==t?(yt=R,q=H(Re),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t),R===t&&(R=G,q=js(),q!==t?(Ce=Bo(),Ce!==t?(Ke=Cg(),Ke!==t?(Re=BA(),Re!==t?(yt=R,q=H(Ke),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t),R===t))if(R=G,q=Yl(),q!==t){if(Ce=[],Ke=Ys(),Ke!==t)for(;Ke!==t;)Ce.push(Ke),Ke=Ys();else Ce=t;Ce!==t?(yt=R,q=j(q),R=q):(G=R,R=t)}else G=R,R=t;return R}function ma(){var R,q,Ce;for(Xe++,R=G,q=[],r.charCodeAt(G)===32?(Ce=V,G++):(Ce=t,Xe===0&&Le(W));Ce!==t;)q.push(Ce),r.charCodeAt(G)===32?(Ce=V,G++):(Ce=t,Xe===0&&Le(W));return q!==t?(yt=G,Ce=_(q),Ce?Ce=void 0:Ce=t,Ce!==t?(q=[q,Ce],R=q):(G=R,R=t)):(G=R,R=t),Xe--,R===t&&(q=t,Xe===0&&Le($)),R}function rt(){var R,q,Ce;for(R=G,q=[],r.charCodeAt(G)===32?(Ce=V,G++):(Ce=t,Xe===0&&Le(W));Ce!==t;)q.push(Ce),r.charCodeAt(G)===32?(Ce=V,G++):(Ce=t,Xe===0&&Le(W));return q!==t?(yt=G,Ce=A(q),Ce?Ce=void 0:Ce=t,Ce!==t?(q=[q,Ce],R=q):(G=R,R=t)):(G=R,R=t),R}function Bo(){var R;return yt=G,R=Ae(),R?R=void 0:R=t,R}function BA(){var R;return yt=G,R=ge(),R?R=void 0:R=t,R}function Gl(){var R;return R=jl(),R===t&&(R=Rp()),R}function Gs(){var R,q,Ce;if(R=jl(),R===t){if(R=G,q=[],Ce=Eg(),Ce!==t)for(;Ce!==t;)q.push(Ce),Ce=Eg();else q=t;q!==t&&(yt=R,q=re()),R=q}return R}function Yl(){var R;return R=Fp(),R===t&&(R=UE(),R===t&&(R=jl(),R===t&&(R=Rp()))),R}function KE(){var R;return R=Fp(),R===t&&(R=jl(),R===t&&(R=Eg())),R}function Rp(){var R,q,Ce,Ke,Re,ze;if(Xe++,R=G,F.test(r.charAt(G))?(q=r.charAt(G),G++):(q=t,Xe===0&&Le(ue)),q!==t){for(Ce=[],Ke=G,Re=Rr(),Re===t&&(Re=null),Re!==t?(pe.test(r.charAt(G))?(ze=r.charAt(G),G++):(ze=t,Xe===0&&Le(ke)),ze!==t?(Re=[Re,ze],Ke=Re):(G=Ke,Ke=t)):(G=Ke,Ke=t);Ke!==t;)Ce.push(Ke),Ke=G,Re=Rr(),Re===t&&(Re=null),Re!==t?(pe.test(r.charAt(G))?(ze=r.charAt(G),G++):(ze=t,Xe===0&&Le(ke)),ze!==t?(Re=[Re,ze],Ke=Re):(G=Ke,Ke=t)):(G=Ke,Ke=t);Ce!==t?(yt=R,q=Fe(),R=q):(G=R,R=t)}else G=R,R=t;return Xe--,R===t&&(q=t,Xe===0&&Le(O)),R}function Eg(){var R,q,Ce,Ke,Re;if(R=G,r.substr(G,2)===Ne?(q=Ne,G+=2):(q=t,Xe===0&&Le(oe)),q===t&&(q=null),q!==t)if(le.test(r.charAt(G))?(Ce=r.charAt(G),G++):(Ce=t,Xe===0&&Le(Be)),Ce!==t){for(Ke=[],fe.test(r.charAt(G))?(Re=r.charAt(G),G++):(Re=t,Xe===0&&Le(ae));Re!==t;)Ke.push(Re),fe.test(r.charAt(G))?(Re=r.charAt(G),G++):(Re=t,Xe===0&&Le(ae));Ke!==t?(yt=R,q=Fe(),R=q):(G=R,R=t)}else G=R,R=t;else G=R,R=t;return R}function Fp(){var R,q;return R=G,r.substr(G,4)===qe?(q=qe,G+=4):(q=t,Xe===0&&Le(ne)),q!==t&&(yt=R,q=Y()),R=q,R}function UE(){var R,q;return R=G,r.substr(G,4)===he?(q=he,G+=4):(q=t,Xe===0&&Le(ie)),q!==t&&(yt=R,q=de()),R=q,R===t&&(R=G,r.substr(G,5)===_e?(q=_e,G+=5):(q=t,Xe===0&&Le(Pt)),q!==t&&(yt=R,q=It()),R=q),R}function jl(){var R,q,Ce,Ke;return Xe++,R=G,r.charCodeAt(G)===34?(q=ii,G++):(q=t,Xe===0&&Le(gi)),q!==t?(r.charCodeAt(G)===34?(Ce=ii,G++):(Ce=t,Xe===0&&Le(gi)),Ce!==t?(yt=R,q=hr(),R=q):(G=R,R=t)):(G=R,R=t),R===t&&(R=G,r.charCodeAt(G)===34?(q=ii,G++):(q=t,Xe===0&&Le(gi)),q!==t?(Ce=HE(),Ce!==t?(r.charCodeAt(G)===34?(Ke=ii,G++):(Ke=t,Xe===0&&Le(gi)),Ke!==t?(yt=R,q=fi(Ce),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)),Xe--,R===t&&(q=t,Xe===0&&Le(Or)),R}function HE(){var R,q,Ce;if(R=G,q=[],Ce=Ig(),Ce!==t)for(;Ce!==t;)q.push(Ce),Ce=Ig();else q=t;return q!==t&&(yt=R,q=ni(q)),R=q,R}function Ig(){var R,q,Ce,Ke,Re,ze;return Ks.test(r.charAt(G))?(R=r.charAt(G),G++):(R=t,Xe===0&&Le(pr)),R===t&&(R=G,r.substr(G,2)===Ii?(q=Ii,G+=2):(q=t,Xe===0&&Le(rs)),q!==t&&(yt=R,q=fa()),R=q,R===t&&(R=G,r.substr(G,2)===CA?(q=CA,G+=2):(q=t,Xe===0&&Le(cg)),q!==t&&(yt=R,q=is()),R=q,R===t&&(R=G,r.substr(G,2)===mA?(q=mA,G+=2):(q=t,Xe===0&&Le(ha)),q!==t&&(yt=R,q=wp()),R=q,R===t&&(R=G,r.substr(G,2)===EA?(q=EA,G+=2):(q=t,Xe===0&&Le(IA)),q!==t&&(yt=R,q=wr()),R=q,R===t&&(R=G,r.substr(G,2)===Tl?(q=Tl,G+=2):(q=t,Xe===0&&Le(ug)),q!==t&&(yt=R,q=Io()),R=q,R===t&&(R=G,r.substr(G,2)===gg?(q=gg,G+=2):(q=t,Xe===0&&Le(Bp)),q!==t&&(yt=R,q=Qp()),R=q,R===t&&(R=G,r.substr(G,2)===vr?(q=vr,G+=2):(q=t,Xe===0&&Le(se)),q!==t&&(yt=R,q=yo()),R=q,R===t&&(R=G,r.substr(G,2)===Fn?(q=Fn,G+=2):(q=t,Xe===0&&Le(fg)),q!==t&&(yt=R,q=Qt()),R=q,R===t&&(R=G,r.substr(G,2)===Ll?(q=Ll,G+=2):(q=t,Xe===0&&Le(Nn)),q!==t?(Ce=QA(),Ce!==t?(Ke=QA(),Ke!==t?(Re=QA(),Re!==t?(ze=QA(),ze!==t?(yt=R,q=ns(Ce,Ke,Re,ze),R=q):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)):(G=R,R=t)))))))))),R}function QA(){var R;return ss.test(r.charAt(G))?(R=r.charAt(G),G++):(R=t,Xe===0&&Le(gt)),R}function Rr(){var R,q;if(Xe++,R=[],At.test(r.charAt(G))?(q=r.charAt(G),G++):(q=t,Xe===0&&Le(ln)),q!==t)for(;q!==t;)R.push(q),At.test(r.charAt(G))?(q=r.charAt(G),G++):(q=t,Xe===0&&Le(ln));else R=t;return Xe--,R===t&&(q=t,Xe===0&&Le(wo)),R}function GE(){var R,q;if(Xe++,R=[],Lt.test(r.charAt(G))?(q=r.charAt(G),G++):(q=t,Xe===0&&Le(hg)),q!==t)for(;q!==t;)R.push(q),Lt.test(r.charAt(G))?(q=r.charAt(G),G++):(q=t,Xe===0&&Le(hg));else R=t;return Xe--,R===t&&(q=t,Xe===0&&Le(S)),R}function Ys(){var R,q,Ce,Ke,Re,ze;if(R=G,q=js(),q!==t){for(Ce=[],Ke=G,Re=Rr(),Re===t&&(Re=null),Re!==t?(ze=js(),ze!==t?(Re=[Re,ze],Ke=Re):(G=Ke,Ke=t)):(G=Ke,Ke=t);Ke!==t;)Ce.push(Ke),Ke=G,Re=Rr(),Re===t&&(Re=null),Re!==t?(ze=js(),ze!==t?(Re=[Re,ze],Ke=Re):(G=Ke,Ke=t)):(G=Ke,Ke=t);Ce!==t?(q=[q,Ce],R=q):(G=R,R=t)}else G=R,R=t;return R}function js(){var R;return r.substr(G,2)===Ol?(R=Ol,G+=2):(R=t,Xe===0&&Le(bp)),R===t&&(r.charCodeAt(G)===10?(R=Sp,G++):(R=t,Xe===0&&Le(vp)),R===t&&(r.charCodeAt(G)===13?(R=xp,G++):(R=t,Xe===0&&Le(Pp)))),R}let yg=2,bA=0;if(pa=n(),pa!==t&&G===r.length)return pa;throw pa!==t&&G<r.length&&Le(kp()),Ul(Ml,zi<r.length?r.charAt(zi):null,zi<r.length?cn(zi,zi+1):cn(zi,zi))}oH.exports={SyntaxError:ac,parse:ade}});var fH=w((s_e,ev)=>{\"use strict\";var gde=r=>{let e=!1,t=!1,i=!1;for(let n=0;n<r.length;n++){let s=r[n];e&&/[a-zA-Z]/.test(s)&&s.toUpperCase()===s?(r=r.slice(0,n)+\"-\"+r.slice(n),e=!1,i=t,t=!0,n++):t&&i&&/[a-zA-Z]/.test(s)&&s.toLowerCase()===s?(r=r.slice(0,n-1)+\"-\"+r.slice(n-1),i=t,t=!1,e=!0):(e=s.toLowerCase()===s&&s.toUpperCase()!==s,i=t,t=s.toUpperCase()===s&&s.toLowerCase()!==s)}return r},gH=(r,e)=>{if(!(typeof r==\"string\"||Array.isArray(r)))throw new TypeError(\"Expected the input to be `string | string[]`\");e=Object.assign({pascalCase:!1},e);let t=n=>e.pascalCase?n.charAt(0).toUpperCase()+n.slice(1):n;return Array.isArray(r)?r=r.map(n=>n.trim()).filter(n=>n.length).join(\"-\"):r=r.trim(),r.length===0?\"\":r.length===1?e.pascalCase?r.toUpperCase():r.toLowerCase():(r!==r.toLowerCase()&&(r=gde(r)),r=r.replace(/^[_.\\- ]+/,\"\").toLowerCase().replace(/[_.\\- ]+(\\w|$)/g,(n,s)=>s.toUpperCase()).replace(/\\d+(\\w|$)/g,n=>n.toUpperCase()),t(r))};ev.exports=gH;ev.exports.default=gH});var hH=w((o_e,fde)=>{fde.exports=[{name:\"AppVeyor\",constant:\"APPVEYOR\",env:\"APPVEYOR\",pr:\"APPVEYOR_PULL_REQUEST_NUMBER\"},{name:\"Azure Pipelines\",constant:\"AZURE_PIPELINES\",env:\"SYSTEM_TEAMFOUNDATIONCOLLECTIONURI\",pr:\"SYSTEM_PULLREQUEST_PULLREQUESTID\"},{name:\"Appcircle\",constant:\"APPCIRCLE\",env:\"AC_APPCIRCLE\"},{name:\"Bamboo\",constant:\"BAMBOO\",env:\"bamboo_planKey\"},{name:\"Bitbucket Pipelines\",constant:\"BITBUCKET\",env:\"BITBUCKET_COMMIT\",pr:\"BITBUCKET_PR_ID\"},{name:\"Bitrise\",constant:\"BITRISE\",env:\"BITRISE_IO\",pr:\"BITRISE_PULL_REQUEST\"},{name:\"Buddy\",constant:\"BUDDY\",env:\"BUDDY_WORKSPACE_ID\",pr:\"BUDDY_EXECUTION_PULL_REQUEST_ID\"},{name:\"Buildkite\",constant:\"BUILDKITE\",env:\"BUILDKITE\",pr:{env:\"BUILDKITE_PULL_REQUEST\",ne:\"false\"}},{name:\"CircleCI\",constant:\"CIRCLE\",env:\"CIRCLECI\",pr:\"CIRCLE_PULL_REQUEST\"},{name:\"Cirrus CI\",constant:\"CIRRUS\",env:\"CIRRUS_CI\",pr:\"CIRRUS_PR\"},{name:\"AWS CodeBuild\",constant:\"CODEBUILD\",env:\"CODEBUILD_BUILD_ARN\"},{name:\"Codefresh\",constant:\"CODEFRESH\",env:\"CF_BUILD_ID\",pr:{any:[\"CF_PULL_REQUEST_NUMBER\",\"CF_PULL_REQUEST_ID\"]}},{name:\"Codeship\",constant:\"CODESHIP\",env:{CI_NAME:\"codeship\"}},{name:\"Drone\",constant:\"DRONE\",env:\"DRONE\",pr:{DRONE_BUILD_EVENT:\"pull_request\"}},{name:\"dsari\",constant:\"DSARI\",env:\"DSARI\"},{name:\"GitHub Actions\",constant:\"GITHUB_ACTIONS\",env:\"GITHUB_ACTIONS\",pr:{GITHUB_EVENT_NAME:\"pull_request\"}},{name:\"GitLab CI\",constant:\"GITLAB\",env:\"GITLAB_CI\",pr:\"CI_MERGE_REQUEST_ID\"},{name:\"GoCD\",constant:\"GOCD\",env:\"GO_PIPELINE_LABEL\"},{name:\"LayerCI\",constant:\"LAYERCI\",env:\"LAYERCI\",pr:\"LAYERCI_PULL_REQUEST\"},{name:\"Hudson\",constant:\"HUDSON\",env:\"HUDSON_URL\"},{name:\"Jenkins\",constant:\"JENKINS\",env:[\"JENKINS_URL\",\"BUILD_ID\"],pr:{any:[\"ghprbPullId\",\"CHANGE_ID\"]}},{name:\"Magnum CI\",constant:\"MAGNUM\",env:\"MAGNUM\"},{name:\"Netlify CI\",constant:\"NETLIFY\",env:\"NETLIFY\",pr:{env:\"PULL_REQUEST\",ne:\"false\"}},{name:\"Nevercode\",constant:\"NEVERCODE\",env:\"NEVERCODE\",pr:{env:\"NEVERCODE_PULL_REQUEST\",ne:\"false\"}},{name:\"Render\",constant:\"RENDER\",env:\"RENDER\",pr:{IS_PULL_REQUEST:\"true\"}},{name:\"Sail CI\",constant:\"SAIL\",env:\"SAILCI\",pr:\"SAIL_PULL_REQUEST_NUMBER\"},{name:\"Semaphore\",constant:\"SEMAPHORE\",env:\"SEMAPHORE\",pr:\"PULL_REQUEST_NUMBER\"},{name:\"Screwdriver\",constant:\"SCREWDRIVER\",env:\"SCREWDRIVER\",pr:{env:\"SD_PULL_REQUEST\",ne:\"false\"}},{name:\"Shippable\",constant:\"SHIPPABLE\",env:\"SHIPPABLE\",pr:{IS_PULL_REQUEST:\"true\"}},{name:\"Solano CI\",constant:\"SOLANO\",env:\"TDDIUM\",pr:\"TDDIUM_PR_ID\"},{name:\"Strider CD\",constant:\"STRIDER\",env:\"STRIDER\"},{name:\"TaskCluster\",constant:\"TASKCLUSTER\",env:[\"TASK_ID\",\"RUN_ID\"]},{name:\"TeamCity\",constant:\"TEAMCITY\",env:\"TEAMCITY_VERSION\"},{name:\"Travis CI\",constant:\"TRAVIS\",env:\"TRAVIS\",pr:{env:\"TRAVIS_PULL_REQUEST\",ne:\"false\"}},{name:\"Vercel\",constant:\"VERCEL\",env:\"NOW_BUILDER\"},{name:\"Visual Studio App Center\",constant:\"APPCENTER\",env:\"APPCENTER_BUILD_ID\"}]});var Ac=w(Un=>{\"use strict\";var dH=hH(),xo=process.env;Object.defineProperty(Un,\"_vendors\",{value:dH.map(function(r){return r.constant})});Un.name=null;Un.isPR=null;dH.forEach(function(r){let t=(Array.isArray(r.env)?r.env:[r.env]).every(function(i){return pH(i)});if(Un[r.constant]=t,t)switch(Un.name=r.name,typeof r.pr){case\"string\":Un.isPR=!!xo[r.pr];break;case\"object\":\"env\"in r.pr?Un.isPR=r.pr.env in xo&&xo[r.pr.env]!==r.pr.ne:\"any\"in r.pr?Un.isPR=r.pr.any.some(function(i){return!!xo[i]}):Un.isPR=pH(r.pr);break;default:Un.isPR=null}});Un.isCI=!!(xo.CI||xo.CONTINUOUS_INTEGRATION||xo.BUILD_NUMBER||xo.RUN_ID||Un.name);function pH(r){return typeof r==\"string\"?!!xo[r]:Object.keys(r).every(function(e){return xo[e]===r[e]})}});var hn={};ut(hn,{KeyRelationship:()=>lc,applyCascade:()=>od,base64RegExp:()=>yH,colorStringAlphaRegExp:()=>IH,colorStringRegExp:()=>EH,computeKey:()=>FA,getPrintable:()=>Vr,hasExactLength:()=>SH,hasForbiddenKeys:()=>qde,hasKeyRelationship:()=>av,hasMaxLength:()=>xde,hasMinLength:()=>vde,hasMutuallyExclusiveKeys:()=>Jde,hasRequiredKeys:()=>jde,hasUniqueItems:()=>Pde,isArray:()=>Ede,isAtLeast:()=>Rde,isAtMost:()=>Fde,isBase64:()=>Gde,isBoolean:()=>dde,isDate:()=>mde,isDict:()=>yde,isEnum:()=>Zi,isHexColor:()=>Hde,isISO8601:()=>Ude,isInExclusiveRange:()=>Tde,isInInclusiveRange:()=>Nde,isInstanceOf:()=>Bde,isInteger:()=>Lde,isJSON:()=>Yde,isLiteral:()=>hde,isLowerCase:()=>Ode,isNegative:()=>Dde,isNullable:()=>Sde,isNumber:()=>Cde,isObject:()=>wde,isOneOf:()=>Qde,isOptional:()=>bde,isPositive:()=>kde,isString:()=>sd,isTuple:()=>Ide,isUUID4:()=>Kde,isUnknown:()=>bH,isUpperCase:()=>Mde,iso8601RegExp:()=>ov,makeCoercionFn:()=>cc,makeSetter:()=>QH,makeTrait:()=>BH,makeValidator:()=>bt,matchesRegExp:()=>ad,plural:()=>kI,pushError:()=>pt,simpleKeyRegExp:()=>mH,uuid4RegExp:()=>wH});function bt({test:r}){return BH(r)()}function Vr(r){return r===null?\"null\":r===void 0?\"undefined\":r===\"\"?\"an empty string\":JSON.stringify(r)}function FA(r,e){var t,i,n;return typeof e==\"number\"?`${(t=r==null?void 0:r.p)!==null&&t!==void 0?t:\".\"}[${e}]`:mH.test(e)?`${(i=r==null?void 0:r.p)!==null&&i!==void 0?i:\"\"}.${e}`:`${(n=r==null?void 0:r.p)!==null&&n!==void 0?n:\".\"}[${JSON.stringify(e)}]`}function cc(r,e){return t=>{let i=r[e];return r[e]=t,cc(r,e).bind(null,i)}}function QH(r,e){return t=>{r[e]=t}}function kI(r,e,t){return r===1?e:t}function pt({errors:r,p:e}={},t){return r==null||r.push(`${e!=null?e:\".\"}: ${t}`),!1}function hde(r){return bt({test:(e,t)=>e!==r?pt(t,`Expected a literal (got ${Vr(r)})`):!0})}function Zi(r){let e=Array.isArray(r)?r:Object.values(r),t=new Set(e);return bt({test:(i,n)=>t.has(i)?!0:pt(n,`Expected a valid enumeration value (got ${Vr(i)})`)})}var mH,EH,IH,yH,wH,ov,BH,bH,sd,pde,dde,Cde,mde,Ede,Ide,yde,wde,Bde,Qde,od,bde,Sde,vde,xde,SH,Pde,Dde,kde,Rde,Fde,Nde,Tde,Lde,ad,Ode,Mde,Kde,Ude,Hde,Gde,Yde,jde,qde,Jde,lc,Wde,av,ls=Fge(()=>{mH=/^[a-zA-Z_][a-zA-Z0-9_]*$/,EH=/^#[0-9a-f]{6}$/i,IH=/^#[0-9a-f]{6}([0-9a-f]{2})?$/i,yH=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,wH=/^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}$/i,ov=/^(?:[1-9]\\d{3}(-?)(?:(?:0[1-9]|1[0-2])\\1(?:0[1-9]|1\\d|2[0-8])|(?:0[13-9]|1[0-2])\\1(?:29|30)|(?:0[13578]|1[02])(?:\\1)31|00[1-9]|0[1-9]\\d|[12]\\d{2}|3(?:[0-5]\\d|6[0-5]))|(?:[1-9]\\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)(?:(-?)02(?:\\2)29|-?366))T(?:[01]\\d|2[0-3])(:?)[0-5]\\d(?:\\3[0-5]\\d)?(?:Z|[+-][01]\\d(?:\\3[0-5]\\d)?)$/,BH=r=>()=>r;bH=()=>bt({test:(r,e)=>!0});sd=()=>bt({test:(r,e)=>typeof r!=\"string\"?pt(e,`Expected a string (got ${Vr(r)})`):!0});pde=new Map([[\"true\",!0],[\"True\",!0],[\"1\",!0],[1,!0],[\"false\",!1],[\"False\",!1],[\"0\",!1],[0,!1]]),dde=()=>bt({test:(r,e)=>{var t;if(typeof r!=\"boolean\"){if(typeof(e==null?void 0:e.coercions)<\"u\"){if(typeof(e==null?void 0:e.coercion)>\"u\")return pt(e,\"Unbound coercion result\");let i=pde.get(r);if(typeof i<\"u\")return e.coercions.push([(t=e.p)!==null&&t!==void 0?t:\".\",e.coercion.bind(null,i)]),!0}return pt(e,`Expected a boolean (got ${Vr(r)})`)}return!0}}),Cde=()=>bt({test:(r,e)=>{var t;if(typeof r!=\"number\"){if(typeof(e==null?void 0:e.coercions)<\"u\"){if(typeof(e==null?void 0:e.coercion)>\"u\")return pt(e,\"Unbound coercion result\");let i;if(typeof r==\"string\"){let n;try{n=JSON.parse(r)}catch{}if(typeof n==\"number\")if(JSON.stringify(n)===r)i=n;else return pt(e,`Received a number that can't be safely represented by the runtime (${r})`)}if(typeof i<\"u\")return e.coercions.push([(t=e.p)!==null&&t!==void 0?t:\".\",e.coercion.bind(null,i)]),!0}return pt(e,`Expected a number (got ${Vr(r)})`)}return!0}}),mde=()=>bt({test:(r,e)=>{var t;if(!(r instanceof Date)){if(typeof(e==null?void 0:e.coercions)<\"u\"){if(typeof(e==null?void 0:e.coercion)>\"u\")return pt(e,\"Unbound coercion result\");let i;if(typeof r==\"string\"&&ov.test(r))i=new Date(r);else{let n;if(typeof r==\"string\"){let s;try{s=JSON.parse(r)}catch{}typeof s==\"number\"&&(n=s)}else typeof r==\"number\"&&(n=r);if(typeof n<\"u\")if(Number.isSafeInteger(n)||!Number.isSafeInteger(n*1e3))i=new Date(n*1e3);else return pt(e,`Received a timestamp that can't be safely represented by the runtime (${r})`)}if(typeof i<\"u\")return e.coercions.push([(t=e.p)!==null&&t!==void 0?t:\".\",e.coercion.bind(null,i)]),!0}return pt(e,`Expected a date (got ${Vr(r)})`)}return!0}}),Ede=(r,{delimiter:e}={})=>bt({test:(t,i)=>{var n;if(typeof t==\"string\"&&typeof e<\"u\"&&typeof(i==null?void 0:i.coercions)<\"u\"){if(typeof(i==null?void 0:i.coercion)>\"u\")return pt(i,\"Unbound coercion result\");t=t.split(e),i.coercions.push([(n=i.p)!==null&&n!==void 0?n:\".\",i.coercion.bind(null,t)])}if(!Array.isArray(t))return pt(i,`Expected an array (got ${Vr(t)})`);let s=!0;for(let o=0,a=t.length;o<a&&(s=r(t[o],Object.assign(Object.assign({},i),{p:FA(i,o),coercion:cc(t,o)}))&&s,!(!s&&(i==null?void 0:i.errors)==null));++o);return s}}),Ide=(r,{delimiter:e}={})=>{let t=SH(r.length);return bt({test:(i,n)=>{var s;if(typeof i==\"string\"&&typeof e<\"u\"&&typeof(n==null?void 0:n.coercions)<\"u\"){if(typeof(n==null?void 0:n.coercion)>\"u\")return pt(n,\"Unbound coercion result\");i=i.split(e),n.coercions.push([(s=n.p)!==null&&s!==void 0?s:\".\",n.coercion.bind(null,i)])}if(!Array.isArray(i))return pt(n,`Expected a tuple (got ${Vr(i)})`);let o=t(i,Object.assign({},n));for(let a=0,l=i.length;a<l&&a<r.length&&(o=r[a](i[a],Object.assign(Object.assign({},n),{p:FA(n,a),coercion:cc(i,a)}))&&o,!(!o&&(n==null?void 0:n.errors)==null));++a);return o}})},yde=(r,{keys:e=null}={})=>bt({test:(t,i)=>{if(typeof t!=\"object\"||t===null)return pt(i,`Expected an object (got ${Vr(t)})`);let n=Object.keys(t),s=!0;for(let o=0,a=n.length;o<a&&(s||(i==null?void 0:i.errors)!=null);++o){let l=n[o],c=t[l];if(l===\"__proto__\"||l===\"constructor\"){s=pt(Object.assign(Object.assign({},i),{p:FA(i,l)}),\"Unsafe property name\");continue}if(e!==null&&!e(l,i)){s=!1;continue}if(!r(c,Object.assign(Object.assign({},i),{p:FA(i,l),coercion:cc(t,l)}))){s=!1;continue}}return s}}),wde=(r,{extra:e=null}={})=>{let t=Object.keys(r);return bt({test:(i,n)=>{if(typeof i!=\"object\"||i===null)return pt(n,`Expected an object (got ${Vr(i)})`);let s=new Set([...t,...Object.keys(i)]),o={},a=!0;for(let l of s){if(l===\"constructor\"||l===\"__proto__\")a=pt(Object.assign(Object.assign({},n),{p:FA(n,l)}),\"Unsafe property name\");else{let c=Object.prototype.hasOwnProperty.call(r,l)?r[l]:void 0,u=Object.prototype.hasOwnProperty.call(i,l)?i[l]:void 0;typeof c<\"u\"?a=c(u,Object.assign(Object.assign({},n),{p:FA(n,l),coercion:cc(i,l)}))&&a:e===null?a=pt(Object.assign(Object.assign({},n),{p:FA(n,l)}),`Extraneous property (got ${Vr(u)})`):Object.defineProperty(o,l,{enumerable:!0,get:()=>u,set:QH(i,l)})}if(!a&&(n==null?void 0:n.errors)==null)break}return e!==null&&(a||(n==null?void 0:n.errors)!=null)&&(a=e(o,n)&&a),a}})},Bde=r=>bt({test:(e,t)=>e instanceof r?!0:pt(t,`Expected an instance of ${r.name} (got ${Vr(e)})`)}),Qde=(r,{exclusive:e=!1}={})=>bt({test:(t,i)=>{var n,s,o;let a=[],l=typeof(i==null?void 0:i.errors)<\"u\"?[]:void 0;for(let c=0,u=r.length;c<u;++c){let g=typeof(i==null?void 0:i.errors)<\"u\"?[]:void 0,f=typeof(i==null?void 0:i.coercions)<\"u\"?[]:void 0;if(r[c](t,Object.assign(Object.assign({},i),{errors:g,coercions:f,p:`${(n=i==null?void 0:i.p)!==null&&n!==void 0?n:\".\"}#${c+1}`}))){if(a.push([`#${c+1}`,f]),!e)break}else l==null||l.push(g[0])}if(a.length===1){let[,c]=a[0];return typeof c<\"u\"&&((s=i==null?void 0:i.coercions)===null||s===void 0||s.push(...c)),!0}return a.length>1?pt(i,`Expected to match exactly a single predicate (matched ${a.join(\", \")})`):(o=i==null?void 0:i.errors)===null||o===void 0||o.push(...l),!1}}),od=(r,e)=>bt({test:(t,i)=>{var n,s;let o={value:t},a=typeof(i==null?void 0:i.coercions)<\"u\"?cc(o,\"value\"):void 0,l=typeof(i==null?void 0:i.coercions)<\"u\"?[]:void 0;if(!r(t,Object.assign(Object.assign({},i),{coercion:a,coercions:l})))return!1;let c=[];if(typeof l<\"u\")for(let[,u]of l)c.push(u());try{if(typeof(i==null?void 0:i.coercions)<\"u\"){if(o.value!==t){if(typeof(i==null?void 0:i.coercion)>\"u\")return pt(i,\"Unbound coercion result\");i.coercions.push([(n=i.p)!==null&&n!==void 0?n:\".\",i.coercion.bind(null,o.value)])}(s=i==null?void 0:i.coercions)===null||s===void 0||s.push(...l)}return e.every(u=>u(o.value,i))}finally{for(let u of c)u()}}}),bde=r=>bt({test:(e,t)=>typeof e>\"u\"?!0:r(e,t)}),Sde=r=>bt({test:(e,t)=>e===null?!0:r(e,t)}),vde=r=>bt({test:(e,t)=>e.length>=r?!0:pt(t,`Expected to have a length of at least ${r} elements (got ${e.length})`)}),xde=r=>bt({test:(e,t)=>e.length<=r?!0:pt(t,`Expected to have a length of at most ${r} elements (got ${e.length})`)}),SH=r=>bt({test:(e,t)=>e.length!==r?pt(t,`Expected to have a length of exactly ${r} elements (got ${e.length})`):!0}),Pde=({map:r}={})=>bt({test:(e,t)=>{let i=new Set,n=new Set;for(let s=0,o=e.length;s<o;++s){let a=e[s],l=typeof r<\"u\"?r(a):a;if(i.has(l)){if(n.has(l))continue;pt(t,`Expected to contain unique elements; got a duplicate with ${Vr(e)}`),n.add(l)}else i.add(l)}return n.size===0}}),Dde=()=>bt({test:(r,e)=>r<=0?!0:pt(e,`Expected to be negative (got ${r})`)}),kde=()=>bt({test:(r,e)=>r>=0?!0:pt(e,`Expected to be positive (got ${r})`)}),Rde=r=>bt({test:(e,t)=>e>=r?!0:pt(t,`Expected to be at least ${r} (got ${e})`)}),Fde=r=>bt({test:(e,t)=>e<=r?!0:pt(t,`Expected to be at most ${r} (got ${e})`)}),Nde=(r,e)=>bt({test:(t,i)=>t>=r&&t<=e?!0:pt(i,`Expected to be in the [${r}; ${e}] range (got ${t})`)}),Tde=(r,e)=>bt({test:(t,i)=>t>=r&&t<e?!0:pt(i,`Expected to be in the [${r}; ${e}[ range (got ${t})`)}),Lde=({unsafe:r=!1}={})=>bt({test:(e,t)=>e!==Math.round(e)?pt(t,`Expected to be an integer (got ${e})`):Number.isSafeInteger(e)?!0:pt(t,`Expected to be a safe integer (got ${e})`)}),ad=r=>bt({test:(e,t)=>r.test(e)?!0:pt(t,`Expected to match the pattern ${r.toString()} (got ${Vr(e)})`)}),Ode=()=>bt({test:(r,e)=>r!==r.toLowerCase()?pt(e,`Expected to be all-lowercase (got ${r})`):!0}),Mde=()=>bt({test:(r,e)=>r!==r.toUpperCase()?pt(e,`Expected to be all-uppercase (got ${r})`):!0}),Kde=()=>bt({test:(r,e)=>wH.test(r)?!0:pt(e,`Expected to be a valid UUID v4 (got ${Vr(r)})`)}),Ude=()=>bt({test:(r,e)=>ov.test(r)?!1:pt(e,`Expected to be a valid ISO 8601 date string (got ${Vr(r)})`)}),Hde=({alpha:r=!1})=>bt({test:(e,t)=>(r?EH.test(e):IH.test(e))?!0:pt(t,`Expected to be a valid hexadecimal color string (got ${Vr(e)})`)}),Gde=()=>bt({test:(r,e)=>yH.test(r)?!0:pt(e,`Expected to be a valid base 64 string (got ${Vr(r)})`)}),Yde=(r=bH())=>bt({test:(e,t)=>{let i;try{i=JSON.parse(e)}catch{return pt(t,`Expected to be a valid JSON string (got ${Vr(e)})`)}return r(i,t)}}),jde=r=>{let e=new Set(r);return bt({test:(t,i)=>{let n=new Set(Object.keys(t)),s=[];for(let o of e)n.has(o)||s.push(o);return s.length>0?pt(i,`Missing required ${kI(s.length,\"property\",\"properties\")} ${s.map(o=>`\"${o}\"`).join(\", \")}`):!0}})},qde=r=>{let e=new Set(r);return bt({test:(t,i)=>{let n=new Set(Object.keys(t)),s=[];for(let o of e)n.has(o)&&s.push(o);return s.length>0?pt(i,`Forbidden ${kI(s.length,\"property\",\"properties\")} ${s.map(o=>`\"${o}\"`).join(\", \")}`):!0}})},Jde=r=>{let e=new Set(r);return bt({test:(t,i)=>{let n=new Set(Object.keys(t)),s=[];for(let o of e)n.has(o)&&s.push(o);return s.length>1?pt(i,`Mutually exclusive properties ${s.map(o=>`\"${o}\"`).join(\", \")}`):!0}})};(function(r){r.Forbids=\"Forbids\",r.Requires=\"Requires\"})(lc||(lc={}));Wde={[lc.Forbids]:{expect:!1,message:\"forbids using\"},[lc.Requires]:{expect:!0,message:\"requires using\"}},av=(r,e,t,{ignore:i=[]}={})=>{let n=new Set(i),s=new Set(t),o=Wde[e];return bt({test:(a,l)=>{let c=new Set(Object.keys(a));if(!c.has(r)||n.has(a[r]))return!0;let u=[];for(let g of s)(c.has(g)&&!n.has(a[g]))!==o.expect&&u.push(g);return u.length>=1?pt(l,`Property \"${r}\" ${o.message} ${kI(u.length,\"property\",\"properties\")} ${u.map(g=>`\"${g}\"`).join(\", \")}`):!0}})}});var YH=w((o$e,GH)=>{\"use strict\";GH.exports=(r,...e)=>new Promise(t=>{t(r(...e))})});var Jg=w((a$e,pv)=>{\"use strict\";var cCe=YH(),jH=r=>{if(r<1)throw new TypeError(\"Expected `concurrency` to be a number from 1 and up\");let e=[],t=0,i=()=>{t--,e.length>0&&e.shift()()},n=(a,l,...c)=>{t++;let u=cCe(a,...c);l(u),u.then(i,i)},s=(a,l,...c)=>{t<r?n(a,l,...c):e.push(n.bind(null,a,l,...c))},o=(a,...l)=>new Promise(c=>s(a,c,...l));return Object.defineProperties(o,{activeCount:{get:()=>t},pendingCount:{get:()=>e.length}}),o};pv.exports=jH;pv.exports.default=jH});var gd=w((l$e,qH)=>{var uCe=\"2.0.0\",gCe=Number.MAX_SAFE_INTEGER||9007199254740991,fCe=16;qH.exports={SEMVER_SPEC_VERSION:uCe,MAX_LENGTH:256,MAX_SAFE_INTEGER:gCe,MAX_SAFE_COMPONENT_LENGTH:fCe}});var fd=w((c$e,JH)=>{var hCe=typeof process==\"object\"&&process.env&&process.env.NODE_DEBUG&&/\\bsemver\\b/i.test(process.env.NODE_DEBUG)?(...r)=>console.error(\"SEMVER\",...r):()=>{};JH.exports=hCe});var uc=w((TA,WH)=>{var{MAX_SAFE_COMPONENT_LENGTH:dv}=gd(),pCe=fd();TA=WH.exports={};var dCe=TA.re=[],et=TA.src=[],tt=TA.t={},CCe=0,St=(r,e,t)=>{let i=CCe++;pCe(i,e),tt[r]=i,et[i]=e,dCe[i]=new RegExp(e,t?\"g\":void 0)};St(\"NUMERICIDENTIFIER\",\"0|[1-9]\\\\d*\");St(\"NUMERICIDENTIFIERLOOSE\",\"[0-9]+\");St(\"NONNUMERICIDENTIFIER\",\"\\\\d*[a-zA-Z-][a-zA-Z0-9-]*\");St(\"MAINVERSION\",`(${et[tt.NUMERICIDENTIFIER]})\\\\.(${et[tt.NUMERICIDENTIFIER]})\\\\.(${et[tt.NUMERICIDENTIFIER]})`);St(\"MAINVERSIONLOOSE\",`(${et[tt.NUMERICIDENTIFIERLOOSE]})\\\\.(${et[tt.NUMERICIDENTIFIERLOOSE]})\\\\.(${et[tt.NUMERICIDENTIFIERLOOSE]})`);St(\"PRERELEASEIDENTIFIER\",`(?:${et[tt.NUMERICIDENTIFIER]}|${et[tt.NONNUMERICIDENTIFIER]})`);St(\"PRERELEASEIDENTIFIERLOOSE\",`(?:${et[tt.NUMERICIDENTIFIERLOOSE]}|${et[tt.NONNUMERICIDENTIFIER]})`);St(\"PRERELEASE\",`(?:-(${et[tt.PRERELEASEIDENTIFIER]}(?:\\\\.${et[tt.PRERELEASEIDENTIFIER]})*))`);St(\"PRERELEASELOOSE\",`(?:-?(${et[tt.PRERELEASEIDENTIFIERLOOSE]}(?:\\\\.${et[tt.PRERELEASEIDENTIFIERLOOSE]})*))`);St(\"BUILDIDENTIFIER\",\"[0-9A-Za-z-]+\");St(\"BUILD\",`(?:\\\\+(${et[tt.BUILDIDENTIFIER]}(?:\\\\.${et[tt.BUILDIDENTIFIER]})*))`);St(\"FULLPLAIN\",`v?${et[tt.MAINVERSION]}${et[tt.PRERELEASE]}?${et[tt.BUILD]}?`);St(\"FULL\",`^${et[tt.FULLPLAIN]}$`);St(\"LOOSEPLAIN\",`[v=\\\\s]*${et[tt.MAINVERSIONLOOSE]}${et[tt.PRERELEASELOOSE]}?${et[tt.BUILD]}?`);St(\"LOOSE\",`^${et[tt.LOOSEPLAIN]}$`);St(\"GTLT\",\"((?:<|>)?=?)\");St(\"XRANGEIDENTIFIERLOOSE\",`${et[tt.NUMERICIDENTIFIERLOOSE]}|x|X|\\\\*`);St(\"XRANGEIDENTIFIER\",`${et[tt.NUMERICIDENTIFIER]}|x|X|\\\\*`);St(\"XRANGEPLAIN\",`[v=\\\\s]*(${et[tt.XRANGEIDENTIFIER]})(?:\\\\.(${et[tt.XRANGEIDENTIFIER]})(?:\\\\.(${et[tt.XRANGEIDENTIFIER]})(?:${et[tt.PRERELEASE]})?${et[tt.BUILD]}?)?)?`);St(\"XRANGEPLAINLOOSE\",`[v=\\\\s]*(${et[tt.XRANGEIDENTIFIERLOOSE]})(?:\\\\.(${et[tt.XRANGEIDENTIFIERLOOSE]})(?:\\\\.(${et[tt.XRANGEIDENTIFIERLOOSE]})(?:${et[tt.PRERELEASELOOSE]})?${et[tt.BUILD]}?)?)?`);St(\"XRANGE\",`^${et[tt.GTLT]}\\\\s*${et[tt.XRANGEPLAIN]}$`);St(\"XRANGELOOSE\",`^${et[tt.GTLT]}\\\\s*${et[tt.XRANGEPLAINLOOSE]}$`);St(\"COERCE\",`(^|[^\\\\d])(\\\\d{1,${dv}})(?:\\\\.(\\\\d{1,${dv}}))?(?:\\\\.(\\\\d{1,${dv}}))?(?:$|[^\\\\d])`);St(\"COERCERTL\",et[tt.COERCE],!0);St(\"LONETILDE\",\"(?:~>?)\");St(\"TILDETRIM\",`(\\\\s*)${et[tt.LONETILDE]}\\\\s+`,!0);TA.tildeTrimReplace=\"$1~\";St(\"TILDE\",`^${et[tt.LONETILDE]}${et[tt.XRANGEPLAIN]}$`);St(\"TILDELOOSE\",`^${et[tt.LONETILDE]}${et[tt.XRANGEPLAINLOOSE]}$`);St(\"LONECARET\",\"(?:\\\\^)\");St(\"CARETTRIM\",`(\\\\s*)${et[tt.LONECARET]}\\\\s+`,!0);TA.caretTrimReplace=\"$1^\";St(\"CARET\",`^${et[tt.LONECARET]}${et[tt.XRANGEPLAIN]}$`);St(\"CARETLOOSE\",`^${et[tt.LONECARET]}${et[tt.XRANGEPLAINLOOSE]}$`);St(\"COMPARATORLOOSE\",`^${et[tt.GTLT]}\\\\s*(${et[tt.LOOSEPLAIN]})$|^$`);St(\"COMPARATOR\",`^${et[tt.GTLT]}\\\\s*(${et[tt.FULLPLAIN]})$|^$`);St(\"COMPARATORTRIM\",`(\\\\s*)${et[tt.GTLT]}\\\\s*(${et[tt.LOOSEPLAIN]}|${et[tt.XRANGEPLAIN]})`,!0);TA.comparatorTrimReplace=\"$1$2$3\";St(\"HYPHENRANGE\",`^\\\\s*(${et[tt.XRANGEPLAIN]})\\\\s+-\\\\s+(${et[tt.XRANGEPLAIN]})\\\\s*$`);St(\"HYPHENRANGELOOSE\",`^\\\\s*(${et[tt.XRANGEPLAINLOOSE]})\\\\s+-\\\\s+(${et[tt.XRANGEPLAINLOOSE]})\\\\s*$`);St(\"STAR\",\"(<|>)?=?\\\\s*\\\\*\");St(\"GTE0\",\"^\\\\s*>=\\\\s*0.0.0\\\\s*$\");St(\"GTE0PRE\",\"^\\\\s*>=\\\\s*0.0.0-0\\\\s*$\")});var hd=w((u$e,zH)=>{var mCe=[\"includePrerelease\",\"loose\",\"rtl\"],ECe=r=>r?typeof r!=\"object\"?{loose:!0}:mCe.filter(e=>r[e]).reduce((e,t)=>(e[t]=!0,e),{}):{};zH.exports=ECe});var OI=w((g$e,ZH)=>{var VH=/^[0-9]+$/,XH=(r,e)=>{let t=VH.test(r),i=VH.test(e);return t&&i&&(r=+r,e=+e),r===e?0:t&&!i?-1:i&&!t?1:r<e?-1:1},ICe=(r,e)=>XH(e,r);ZH.exports={compareIdentifiers:XH,rcompareIdentifiers:ICe}});var Li=w((f$e,tG)=>{var MI=fd(),{MAX_LENGTH:_H,MAX_SAFE_INTEGER:KI}=gd(),{re:$H,t:eG}=uc(),yCe=hd(),{compareIdentifiers:pd}=OI(),Yn=class{constructor(e,t){if(t=yCe(t),e instanceof Yn){if(e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease)return e;e=e.version}else if(typeof e!=\"string\")throw new TypeError(`Invalid Version: ${e}`);if(e.length>_H)throw new TypeError(`version is longer than ${_H} characters`);MI(\"SemVer\",e,t),this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease;let i=e.trim().match(t.loose?$H[eG.LOOSE]:$H[eG.FULL]);if(!i)throw new TypeError(`Invalid Version: ${e}`);if(this.raw=e,this.major=+i[1],this.minor=+i[2],this.patch=+i[3],this.major>KI||this.major<0)throw new TypeError(\"Invalid major version\");if(this.minor>KI||this.minor<0)throw new TypeError(\"Invalid minor version\");if(this.patch>KI||this.patch<0)throw new TypeError(\"Invalid patch version\");i[4]?this.prerelease=i[4].split(\".\").map(n=>{if(/^[0-9]+$/.test(n)){let s=+n;if(s>=0&&s<KI)return s}return n}):this.prerelease=[],this.build=i[5]?i[5].split(\".\"):[],this.format()}format(){return this.version=`${this.major}.${this.minor}.${this.patch}`,this.prerelease.length&&(this.version+=`-${this.prerelease.join(\".\")}`),this.version}toString(){return this.version}compare(e){if(MI(\"SemVer.compare\",this.version,this.options,e),!(e instanceof Yn)){if(typeof e==\"string\"&&e===this.version)return 0;e=new Yn(e,this.options)}return e.version===this.version?0:this.compareMain(e)||this.comparePre(e)}compareMain(e){return e instanceof Yn||(e=new Yn(e,this.options)),pd(this.major,e.major)||pd(this.minor,e.minor)||pd(this.patch,e.patch)}comparePre(e){if(e instanceof Yn||(e=new Yn(e,this.options)),this.prerelease.length&&!e.prerelease.length)return-1;if(!this.prerelease.length&&e.prerelease.length)return 1;if(!this.prerelease.length&&!e.prerelease.length)return 0;let t=0;do{let i=this.prerelease[t],n=e.prerelease[t];if(MI(\"prerelease compare\",t,i,n),i===void 0&&n===void 0)return 0;if(n===void 0)return 1;if(i===void 0)return-1;if(i===n)continue;return pd(i,n)}while(++t)}compareBuild(e){e instanceof Yn||(e=new Yn(e,this.options));let t=0;do{let i=this.build[t],n=e.build[t];if(MI(\"prerelease compare\",t,i,n),i===void 0&&n===void 0)return 0;if(n===void 0)return 1;if(i===void 0)return-1;if(i===n)continue;return pd(i,n)}while(++t)}inc(e,t){switch(e){case\"premajor\":this.prerelease.length=0,this.patch=0,this.minor=0,this.major++,this.inc(\"pre\",t);break;case\"preminor\":this.prerelease.length=0,this.patch=0,this.minor++,this.inc(\"pre\",t);break;case\"prepatch\":this.prerelease.length=0,this.inc(\"patch\",t),this.inc(\"pre\",t);break;case\"prerelease\":this.prerelease.length===0&&this.inc(\"patch\",t),this.inc(\"pre\",t);break;case\"major\":(this.minor!==0||this.patch!==0||this.prerelease.length===0)&&this.major++,this.minor=0,this.patch=0,this.prerelease=[];break;case\"minor\":(this.patch!==0||this.prerelease.length===0)&&this.minor++,this.patch=0,this.prerelease=[];break;case\"patch\":this.prerelease.length===0&&this.patch++,this.prerelease=[];break;case\"pre\":if(this.prerelease.length===0)this.prerelease=[0];else{let i=this.prerelease.length;for(;--i>=0;)typeof this.prerelease[i]==\"number\"&&(this.prerelease[i]++,i=-2);i===-1&&this.prerelease.push(0)}t&&(this.prerelease[0]===t?isNaN(this.prerelease[1])&&(this.prerelease=[t,0]):this.prerelease=[t,0]);break;default:throw new Error(`invalid increment argument: ${e}`)}return this.format(),this.raw=this.version,this}};tG.exports=Yn});var gc=w((h$e,sG)=>{var{MAX_LENGTH:wCe}=gd(),{re:rG,t:iG}=uc(),nG=Li(),BCe=hd(),QCe=(r,e)=>{if(e=BCe(e),r instanceof nG)return r;if(typeof r!=\"string\"||r.length>wCe||!(e.loose?rG[iG.LOOSE]:rG[iG.FULL]).test(r))return null;try{return new nG(r,e)}catch{return null}};sG.exports=QCe});var aG=w((p$e,oG)=>{var bCe=gc(),SCe=(r,e)=>{let t=bCe(r,e);return t?t.version:null};oG.exports=SCe});var lG=w((d$e,AG)=>{var vCe=gc(),xCe=(r,e)=>{let t=vCe(r.trim().replace(/^[=v]+/,\"\"),e);return t?t.version:null};AG.exports=xCe});var uG=w((C$e,cG)=>{var PCe=Li(),DCe=(r,e,t,i)=>{typeof t==\"string\"&&(i=t,t=void 0);try{return new PCe(r,t).inc(e,i).version}catch{return null}};cG.exports=DCe});var cs=w((m$e,fG)=>{var gG=Li(),kCe=(r,e,t)=>new gG(r,t).compare(new gG(e,t));fG.exports=kCe});var UI=w((E$e,hG)=>{var RCe=cs(),FCe=(r,e,t)=>RCe(r,e,t)===0;hG.exports=FCe});var CG=w((I$e,dG)=>{var pG=gc(),NCe=UI(),TCe=(r,e)=>{if(NCe(r,e))return null;{let t=pG(r),i=pG(e),n=t.prerelease.length||i.prerelease.length,s=n?\"pre\":\"\",o=n?\"prerelease\":\"\";for(let a in t)if((a===\"major\"||a===\"minor\"||a===\"patch\")&&t[a]!==i[a])return s+a;return o}};dG.exports=TCe});var EG=w((y$e,mG)=>{var LCe=Li(),OCe=(r,e)=>new LCe(r,e).major;mG.exports=OCe});var yG=w((w$e,IG)=>{var MCe=Li(),KCe=(r,e)=>new MCe(r,e).minor;IG.exports=KCe});var BG=w((B$e,wG)=>{var UCe=Li(),HCe=(r,e)=>new UCe(r,e).patch;wG.exports=HCe});var bG=w((Q$e,QG)=>{var GCe=gc(),YCe=(r,e)=>{let t=GCe(r,e);return t&&t.prerelease.length?t.prerelease:null};QG.exports=YCe});var vG=w((b$e,SG)=>{var jCe=cs(),qCe=(r,e,t)=>jCe(e,r,t);SG.exports=qCe});var PG=w((S$e,xG)=>{var JCe=cs(),WCe=(r,e)=>JCe(r,e,!0);xG.exports=WCe});var HI=w((v$e,kG)=>{var DG=Li(),zCe=(r,e,t)=>{let i=new DG(r,t),n=new DG(e,t);return i.compare(n)||i.compareBuild(n)};kG.exports=zCe});var FG=w((x$e,RG)=>{var VCe=HI(),XCe=(r,e)=>r.sort((t,i)=>VCe(t,i,e));RG.exports=XCe});var TG=w((P$e,NG)=>{var ZCe=HI(),_Ce=(r,e)=>r.sort((t,i)=>ZCe(i,t,e));NG.exports=_Ce});var dd=w((D$e,LG)=>{var $Ce=cs(),eme=(r,e,t)=>$Ce(r,e,t)>0;LG.exports=eme});var GI=w((k$e,OG)=>{var tme=cs(),rme=(r,e,t)=>tme(r,e,t)<0;OG.exports=rme});var Cv=w((R$e,MG)=>{var ime=cs(),nme=(r,e,t)=>ime(r,e,t)!==0;MG.exports=nme});var YI=w((F$e,KG)=>{var sme=cs(),ome=(r,e,t)=>sme(r,e,t)>=0;KG.exports=ome});var jI=w((N$e,UG)=>{var ame=cs(),Ame=(r,e,t)=>ame(r,e,t)<=0;UG.exports=Ame});var mv=w((T$e,HG)=>{var lme=UI(),cme=Cv(),ume=dd(),gme=YI(),fme=GI(),hme=jI(),pme=(r,e,t,i)=>{switch(e){case\"===\":return typeof r==\"object\"&&(r=r.version),typeof t==\"object\"&&(t=t.version),r===t;case\"!==\":return typeof r==\"object\"&&(r=r.version),typeof t==\"object\"&&(t=t.version),r!==t;case\"\":case\"=\":case\"==\":return lme(r,t,i);case\"!=\":return cme(r,t,i);case\">\":return ume(r,t,i);case\">=\":return gme(r,t,i);case\"<\":return fme(r,t,i);case\"<=\":return hme(r,t,i);default:throw new TypeError(`Invalid operator: ${e}`)}};HG.exports=pme});var YG=w((L$e,GG)=>{var dme=Li(),Cme=gc(),{re:qI,t:JI}=uc(),mme=(r,e)=>{if(r instanceof dme)return r;if(typeof r==\"number\"&&(r=String(r)),typeof r!=\"string\")return null;e=e||{};let t=null;if(!e.rtl)t=r.match(qI[JI.COERCE]);else{let i;for(;(i=qI[JI.COERCERTL].exec(r))&&(!t||t.index+t[0].length!==r.length);)(!t||i.index+i[0].length!==t.index+t[0].length)&&(t=i),qI[JI.COERCERTL].lastIndex=i.index+i[1].length+i[2].length;qI[JI.COERCERTL].lastIndex=-1}return t===null?null:Cme(`${t[2]}.${t[3]||\"0\"}.${t[4]||\"0\"}`,e)};GG.exports=mme});var qG=w((O$e,jG)=>{\"use strict\";jG.exports=function(r){r.prototype[Symbol.iterator]=function*(){for(let e=this.head;e;e=e.next)yield e.value}}});var WI=w((M$e,JG)=>{\"use strict\";JG.exports=Ht;Ht.Node=fc;Ht.create=Ht;function Ht(r){var e=this;if(e instanceof Ht||(e=new Ht),e.tail=null,e.head=null,e.length=0,r&&typeof r.forEach==\"function\")r.forEach(function(n){e.push(n)});else if(arguments.length>0)for(var t=0,i=arguments.length;t<i;t++)e.push(arguments[t]);return e}Ht.prototype.removeNode=function(r){if(r.list!==this)throw new Error(\"removing node which does not belong to this list\");var e=r.next,t=r.prev;return e&&(e.prev=t),t&&(t.next=e),r===this.head&&(this.head=e),r===this.tail&&(this.tail=t),r.list.length--,r.next=null,r.prev=null,r.list=null,e};Ht.prototype.unshiftNode=function(r){if(r!==this.head){r.list&&r.list.removeNode(r);var e=this.head;r.list=this,r.next=e,e&&(e.prev=r),this.head=r,this.tail||(this.tail=r),this.length++}};Ht.prototype.pushNode=function(r){if(r!==this.tail){r.list&&r.list.removeNode(r);var e=this.tail;r.list=this,r.prev=e,e&&(e.next=r),this.tail=r,this.head||(this.head=r),this.length++}};Ht.prototype.push=function(){for(var r=0,e=arguments.length;r<e;r++)Ime(this,arguments[r]);return this.length};Ht.prototype.unshift=function(){for(var r=0,e=arguments.length;r<e;r++)yme(this,arguments[r]);return this.length};Ht.prototype.pop=function(){if(!!this.tail){var r=this.tail.value;return this.tail=this.tail.prev,this.tail?this.tail.next=null:this.head=null,this.length--,r}};Ht.prototype.shift=function(){if(!!this.head){var r=this.head.value;return this.head=this.head.next,this.head?this.head.prev=null:this.tail=null,this.length--,r}};Ht.prototype.forEach=function(r,e){e=e||this;for(var t=this.head,i=0;t!==null;i++)r.call(e,t.value,i,this),t=t.next};Ht.prototype.forEachReverse=function(r,e){e=e||this;for(var t=this.tail,i=this.length-1;t!==null;i--)r.call(e,t.value,i,this),t=t.prev};Ht.prototype.get=function(r){for(var e=0,t=this.head;t!==null&&e<r;e++)t=t.next;if(e===r&&t!==null)return t.value};Ht.prototype.getReverse=function(r){for(var e=0,t=this.tail;t!==null&&e<r;e++)t=t.prev;if(e===r&&t!==null)return t.value};Ht.prototype.map=function(r,e){e=e||this;for(var t=new Ht,i=this.head;i!==null;)t.push(r.call(e,i.value,this)),i=i.next;return t};Ht.prototype.mapReverse=function(r,e){e=e||this;for(var t=new Ht,i=this.tail;i!==null;)t.push(r.call(e,i.value,this)),i=i.prev;return t};Ht.prototype.reduce=function(r,e){var t,i=this.head;if(arguments.length>1)t=e;else if(this.head)i=this.head.next,t=this.head.value;else throw new TypeError(\"Reduce of empty list with no initial value\");for(var n=0;i!==null;n++)t=r(t,i.value,n),i=i.next;return t};Ht.prototype.reduceReverse=function(r,e){var t,i=this.tail;if(arguments.length>1)t=e;else if(this.tail)i=this.tail.prev,t=this.tail.value;else throw new TypeError(\"Reduce of empty list with no initial value\");for(var n=this.length-1;i!==null;n--)t=r(t,i.value,n),i=i.prev;return t};Ht.prototype.toArray=function(){for(var r=new Array(this.length),e=0,t=this.head;t!==null;e++)r[e]=t.value,t=t.next;return r};Ht.prototype.toArrayReverse=function(){for(var r=new Array(this.length),e=0,t=this.tail;t!==null;e++)r[e]=t.value,t=t.prev;return r};Ht.prototype.slice=function(r,e){e=e||this.length,e<0&&(e+=this.length),r=r||0,r<0&&(r+=this.length);var t=new Ht;if(e<r||e<0)return t;r<0&&(r=0),e>this.length&&(e=this.length);for(var i=0,n=this.head;n!==null&&i<r;i++)n=n.next;for(;n!==null&&i<e;i++,n=n.next)t.push(n.value);return t};Ht.prototype.sliceReverse=function(r,e){e=e||this.length,e<0&&(e+=this.length),r=r||0,r<0&&(r+=this.length);var t=new Ht;if(e<r||e<0)return t;r<0&&(r=0),e>this.length&&(e=this.length);for(var i=this.length,n=this.tail;n!==null&&i>e;i--)n=n.prev;for(;n!==null&&i>r;i--,n=n.prev)t.push(n.value);return t};Ht.prototype.splice=function(r,e,...t){r>this.length&&(r=this.length-1),r<0&&(r=this.length+r);for(var i=0,n=this.head;n!==null&&i<r;i++)n=n.next;for(var s=[],i=0;n&&i<e;i++)s.push(n.value),n=this.removeNode(n);n===null&&(n=this.tail),n!==this.head&&n!==this.tail&&(n=n.prev);for(var i=0;i<t.length;i++)n=Eme(this,n,t[i]);return s};Ht.prototype.reverse=function(){for(var r=this.head,e=this.tail,t=r;t!==null;t=t.prev){var i=t.prev;t.prev=t.next,t.next=i}return this.head=e,this.tail=r,this};function Eme(r,e,t){var i=e===r.head?new fc(t,null,e,r):new fc(t,e,e.next,r);return i.next===null&&(r.tail=i),i.prev===null&&(r.head=i),r.length++,i}function Ime(r,e){r.tail=new fc(e,r.tail,null,r),r.head||(r.head=r.tail),r.length++}function yme(r,e){r.head=new fc(e,null,r.head,r),r.tail||(r.tail=r.head),r.length++}function fc(r,e,t,i){if(!(this instanceof fc))return new fc(r,e,t,i);this.list=i,this.value=r,e?(e.next=this,this.prev=e):this.prev=null,t?(t.prev=this,this.next=t):this.next=null}try{qG()(Ht)}catch{}});var ZG=w((K$e,XG)=>{\"use strict\";var wme=WI(),hc=Symbol(\"max\"),va=Symbol(\"length\"),Wg=Symbol(\"lengthCalculator\"),md=Symbol(\"allowStale\"),pc=Symbol(\"maxAge\"),Sa=Symbol(\"dispose\"),WG=Symbol(\"noDisposeOnSet\"),di=Symbol(\"lruList\"),Zs=Symbol(\"cache\"),VG=Symbol(\"updateAgeOnGet\"),Ev=()=>1,yv=class{constructor(e){if(typeof e==\"number\"&&(e={max:e}),e||(e={}),e.max&&(typeof e.max!=\"number\"||e.max<0))throw new TypeError(\"max must be a non-negative number\");let t=this[hc]=e.max||1/0,i=e.length||Ev;if(this[Wg]=typeof i!=\"function\"?Ev:i,this[md]=e.stale||!1,e.maxAge&&typeof e.maxAge!=\"number\")throw new TypeError(\"maxAge must be a number\");this[pc]=e.maxAge||0,this[Sa]=e.dispose,this[WG]=e.noDisposeOnSet||!1,this[VG]=e.updateAgeOnGet||!1,this.reset()}set max(e){if(typeof e!=\"number\"||e<0)throw new TypeError(\"max must be a non-negative number\");this[hc]=e||1/0,Cd(this)}get max(){return this[hc]}set allowStale(e){this[md]=!!e}get allowStale(){return this[md]}set maxAge(e){if(typeof e!=\"number\")throw new TypeError(\"maxAge must be a non-negative number\");this[pc]=e,Cd(this)}get maxAge(){return this[pc]}set lengthCalculator(e){typeof e!=\"function\"&&(e=Ev),e!==this[Wg]&&(this[Wg]=e,this[va]=0,this[di].forEach(t=>{t.length=this[Wg](t.value,t.key),this[va]+=t.length})),Cd(this)}get lengthCalculator(){return this[Wg]}get length(){return this[va]}get itemCount(){return this[di].length}rforEach(e,t){t=t||this;for(let i=this[di].tail;i!==null;){let n=i.prev;zG(this,e,i,t),i=n}}forEach(e,t){t=t||this;for(let i=this[di].head;i!==null;){let n=i.next;zG(this,e,i,t),i=n}}keys(){return this[di].toArray().map(e=>e.key)}values(){return this[di].toArray().map(e=>e.value)}reset(){this[Sa]&&this[di]&&this[di].length&&this[di].forEach(e=>this[Sa](e.key,e.value)),this[Zs]=new Map,this[di]=new wme,this[va]=0}dump(){return this[di].map(e=>zI(this,e)?!1:{k:e.key,v:e.value,e:e.now+(e.maxAge||0)}).toArray().filter(e=>e)}dumpLru(){return this[di]}set(e,t,i){if(i=i||this[pc],i&&typeof i!=\"number\")throw new TypeError(\"maxAge must be a number\");let n=i?Date.now():0,s=this[Wg](t,e);if(this[Zs].has(e)){if(s>this[hc])return zg(this,this[Zs].get(e)),!1;let l=this[Zs].get(e).value;return this[Sa]&&(this[WG]||this[Sa](e,l.value)),l.now=n,l.maxAge=i,l.value=t,this[va]+=s-l.length,l.length=s,this.get(e),Cd(this),!0}let o=new wv(e,t,s,n,i);return o.length>this[hc]?(this[Sa]&&this[Sa](e,t),!1):(this[va]+=o.length,this[di].unshift(o),this[Zs].set(e,this[di].head),Cd(this),!0)}has(e){if(!this[Zs].has(e))return!1;let t=this[Zs].get(e).value;return!zI(this,t)}get(e){return Iv(this,e,!0)}peek(e){return Iv(this,e,!1)}pop(){let e=this[di].tail;return e?(zg(this,e),e.value):null}del(e){zg(this,this[Zs].get(e))}load(e){this.reset();let t=Date.now();for(let i=e.length-1;i>=0;i--){let n=e[i],s=n.e||0;if(s===0)this.set(n.k,n.v);else{let o=s-t;o>0&&this.set(n.k,n.v,o)}}}prune(){this[Zs].forEach((e,t)=>Iv(this,t,!1))}},Iv=(r,e,t)=>{let i=r[Zs].get(e);if(i){let n=i.value;if(zI(r,n)){if(zg(r,i),!r[md])return}else t&&(r[VG]&&(i.value.now=Date.now()),r[di].unshiftNode(i));return n.value}},zI=(r,e)=>{if(!e||!e.maxAge&&!r[pc])return!1;let t=Date.now()-e.now;return e.maxAge?t>e.maxAge:r[pc]&&t>r[pc]},Cd=r=>{if(r[va]>r[hc])for(let e=r[di].tail;r[va]>r[hc]&&e!==null;){let t=e.prev;zg(r,e),e=t}},zg=(r,e)=>{if(e){let t=e.value;r[Sa]&&r[Sa](t.key,t.value),r[va]-=t.length,r[Zs].delete(t.key),r[di].removeNode(e)}},wv=class{constructor(e,t,i,n,s){this.key=e,this.value=t,this.length=i,this.now=n,this.maxAge=s||0}},zG=(r,e,t,i)=>{let n=t.value;zI(r,n)&&(zg(r,t),r[md]||(n=void 0)),n&&e.call(i,n.value,n.key,r)};XG.exports=yv});var us=w((U$e,tY)=>{var dc=class{constructor(e,t){if(t=Qme(t),e instanceof dc)return e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease?e:new dc(e.raw,t);if(e instanceof Bv)return this.raw=e.value,this.set=[[e]],this.format(),this;if(this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease,this.raw=e,this.set=e.split(/\\s*\\|\\|\\s*/).map(i=>this.parseRange(i.trim())).filter(i=>i.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${e}`);if(this.set.length>1){let i=this.set[0];if(this.set=this.set.filter(n=>!$G(n[0])),this.set.length===0)this.set=[i];else if(this.set.length>1){for(let n of this.set)if(n.length===1&&Pme(n[0])){this.set=[n];break}}}this.format()}format(){return this.range=this.set.map(e=>e.join(\" \").trim()).join(\"||\").trim(),this.range}toString(){return this.range}parseRange(e){e=e.trim();let i=`parseRange:${Object.keys(this.options).join(\",\")}:${e}`,n=_G.get(i);if(n)return n;let s=this.options.loose,o=s?Oi[Qi.HYPHENRANGELOOSE]:Oi[Qi.HYPHENRANGE];e=e.replace(o,Kme(this.options.includePrerelease)),Gr(\"hyphen replace\",e),e=e.replace(Oi[Qi.COMPARATORTRIM],Sme),Gr(\"comparator trim\",e,Oi[Qi.COMPARATORTRIM]),e=e.replace(Oi[Qi.TILDETRIM],vme),e=e.replace(Oi[Qi.CARETTRIM],xme),e=e.split(/\\s+/).join(\" \");let a=s?Oi[Qi.COMPARATORLOOSE]:Oi[Qi.COMPARATOR],l=e.split(\" \").map(f=>Dme(f,this.options)).join(\" \").split(/\\s+/).map(f=>Mme(f,this.options)).filter(this.options.loose?f=>!!f.match(a):()=>!0).map(f=>new Bv(f,this.options)),c=l.length,u=new Map;for(let f of l){if($G(f))return[f];u.set(f.value,f)}u.size>1&&u.has(\"\")&&u.delete(\"\");let g=[...u.values()];return _G.set(i,g),g}intersects(e,t){if(!(e instanceof dc))throw new TypeError(\"a Range is required\");return this.set.some(i=>eY(i,t)&&e.set.some(n=>eY(n,t)&&i.every(s=>n.every(o=>s.intersects(o,t)))))}test(e){if(!e)return!1;if(typeof e==\"string\")try{e=new bme(e,this.options)}catch{return!1}for(let t=0;t<this.set.length;t++)if(Ume(this.set[t],e,this.options))return!0;return!1}};tY.exports=dc;var Bme=ZG(),_G=new Bme({max:1e3}),Qme=hd(),Bv=Ed(),Gr=fd(),bme=Li(),{re:Oi,t:Qi,comparatorTrimReplace:Sme,tildeTrimReplace:vme,caretTrimReplace:xme}=uc(),$G=r=>r.value===\"<0.0.0-0\",Pme=r=>r.value===\"\",eY=(r,e)=>{let t=!0,i=r.slice(),n=i.pop();for(;t&&i.length;)t=i.every(s=>n.intersects(s,e)),n=i.pop();return t},Dme=(r,e)=>(Gr(\"comp\",r,e),r=Fme(r,e),Gr(\"caret\",r),r=kme(r,e),Gr(\"tildes\",r),r=Tme(r,e),Gr(\"xrange\",r),r=Ome(r,e),Gr(\"stars\",r),r),$i=r=>!r||r.toLowerCase()===\"x\"||r===\"*\",kme=(r,e)=>r.trim().split(/\\s+/).map(t=>Rme(t,e)).join(\" \"),Rme=(r,e)=>{let t=e.loose?Oi[Qi.TILDELOOSE]:Oi[Qi.TILDE];return r.replace(t,(i,n,s,o,a)=>{Gr(\"tilde\",r,i,n,s,o,a);let l;return $i(n)?l=\"\":$i(s)?l=`>=${n}.0.0 <${+n+1}.0.0-0`:$i(o)?l=`>=${n}.${s}.0 <${n}.${+s+1}.0-0`:a?(Gr(\"replaceTilde pr\",a),l=`>=${n}.${s}.${o}-${a} <${n}.${+s+1}.0-0`):l=`>=${n}.${s}.${o} <${n}.${+s+1}.0-0`,Gr(\"tilde return\",l),l})},Fme=(r,e)=>r.trim().split(/\\s+/).map(t=>Nme(t,e)).join(\" \"),Nme=(r,e)=>{Gr(\"caret\",r,e);let t=e.loose?Oi[Qi.CARETLOOSE]:Oi[Qi.CARET],i=e.includePrerelease?\"-0\":\"\";return r.replace(t,(n,s,o,a,l)=>{Gr(\"caret\",r,n,s,o,a,l);let c;return $i(s)?c=\"\":$i(o)?c=`>=${s}.0.0${i} <${+s+1}.0.0-0`:$i(a)?s===\"0\"?c=`>=${s}.${o}.0${i} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.0${i} <${+s+1}.0.0-0`:l?(Gr(\"replaceCaret pr\",l),s===\"0\"?o===\"0\"?c=`>=${s}.${o}.${a}-${l} <${s}.${o}.${+a+1}-0`:c=`>=${s}.${o}.${a}-${l} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.${a}-${l} <${+s+1}.0.0-0`):(Gr(\"no pr\"),s===\"0\"?o===\"0\"?c=`>=${s}.${o}.${a}${i} <${s}.${o}.${+a+1}-0`:c=`>=${s}.${o}.${a}${i} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.${a} <${+s+1}.0.0-0`),Gr(\"caret return\",c),c})},Tme=(r,e)=>(Gr(\"replaceXRanges\",r,e),r.split(/\\s+/).map(t=>Lme(t,e)).join(\" \")),Lme=(r,e)=>{r=r.trim();let t=e.loose?Oi[Qi.XRANGELOOSE]:Oi[Qi.XRANGE];return r.replace(t,(i,n,s,o,a,l)=>{Gr(\"xRange\",r,i,n,s,o,a,l);let c=$i(s),u=c||$i(o),g=u||$i(a),f=g;return n===\"=\"&&f&&(n=\"\"),l=e.includePrerelease?\"-0\":\"\",c?n===\">\"||n===\"<\"?i=\"<0.0.0-0\":i=\"*\":n&&f?(u&&(o=0),a=0,n===\">\"?(n=\">=\",u?(s=+s+1,o=0,a=0):(o=+o+1,a=0)):n===\"<=\"&&(n=\"<\",u?s=+s+1:o=+o+1),n===\"<\"&&(l=\"-0\"),i=`${n+s}.${o}.${a}${l}`):u?i=`>=${s}.0.0${l} <${+s+1}.0.0-0`:g&&(i=`>=${s}.${o}.0${l} <${s}.${+o+1}.0-0`),Gr(\"xRange return\",i),i})},Ome=(r,e)=>(Gr(\"replaceStars\",r,e),r.trim().replace(Oi[Qi.STAR],\"\")),Mme=(r,e)=>(Gr(\"replaceGTE0\",r,e),r.trim().replace(Oi[e.includePrerelease?Qi.GTE0PRE:Qi.GTE0],\"\")),Kme=r=>(e,t,i,n,s,o,a,l,c,u,g,f,h)=>($i(i)?t=\"\":$i(n)?t=`>=${i}.0.0${r?\"-0\":\"\"}`:$i(s)?t=`>=${i}.${n}.0${r?\"-0\":\"\"}`:o?t=`>=${t}`:t=`>=${t}${r?\"-0\":\"\"}`,$i(c)?l=\"\":$i(u)?l=`<${+c+1}.0.0-0`:$i(g)?l=`<${c}.${+u+1}.0-0`:f?l=`<=${c}.${u}.${g}-${f}`:r?l=`<${c}.${u}.${+g+1}-0`:l=`<=${l}`,`${t} ${l}`.trim()),Ume=(r,e,t)=>{for(let i=0;i<r.length;i++)if(!r[i].test(e))return!1;if(e.prerelease.length&&!t.includePrerelease){for(let i=0;i<r.length;i++)if(Gr(r[i].semver),r[i].semver!==Bv.ANY&&r[i].semver.prerelease.length>0){let n=r[i].semver;if(n.major===e.major&&n.minor===e.minor&&n.patch===e.patch)return!0}return!1}return!0}});var Ed=w((H$e,oY)=>{var Id=Symbol(\"SemVer ANY\"),Vg=class{static get ANY(){return Id}constructor(e,t){if(t=Hme(t),e instanceof Vg){if(e.loose===!!t.loose)return e;e=e.value}bv(\"comparator\",e,t),this.options=t,this.loose=!!t.loose,this.parse(e),this.semver===Id?this.value=\"\":this.value=this.operator+this.semver.version,bv(\"comp\",this)}parse(e){let t=this.options.loose?rY[iY.COMPARATORLOOSE]:rY[iY.COMPARATOR],i=e.match(t);if(!i)throw new TypeError(`Invalid comparator: ${e}`);this.operator=i[1]!==void 0?i[1]:\"\",this.operator===\"=\"&&(this.operator=\"\"),i[2]?this.semver=new nY(i[2],this.options.loose):this.semver=Id}toString(){return this.value}test(e){if(bv(\"Comparator.test\",e,this.options.loose),this.semver===Id||e===Id)return!0;if(typeof e==\"string\")try{e=new nY(e,this.options)}catch{return!1}return Qv(e,this.operator,this.semver,this.options)}intersects(e,t){if(!(e instanceof Vg))throw new TypeError(\"a Comparator is required\");if((!t||typeof t!=\"object\")&&(t={loose:!!t,includePrerelease:!1}),this.operator===\"\")return this.value===\"\"?!0:new sY(e.value,t).test(this.value);if(e.operator===\"\")return e.value===\"\"?!0:new sY(this.value,t).test(e.semver);let i=(this.operator===\">=\"||this.operator===\">\")&&(e.operator===\">=\"||e.operator===\">\"),n=(this.operator===\"<=\"||this.operator===\"<\")&&(e.operator===\"<=\"||e.operator===\"<\"),s=this.semver.version===e.semver.version,o=(this.operator===\">=\"||this.operator===\"<=\")&&(e.operator===\">=\"||e.operator===\"<=\"),a=Qv(this.semver,\"<\",e.semver,t)&&(this.operator===\">=\"||this.operator===\">\")&&(e.operator===\"<=\"||e.operator===\"<\"),l=Qv(this.semver,\">\",e.semver,t)&&(this.operator===\"<=\"||this.operator===\"<\")&&(e.operator===\">=\"||e.operator===\">\");return i||n||s&&o||a||l}};oY.exports=Vg;var Hme=hd(),{re:rY,t:iY}=uc(),Qv=mv(),bv=fd(),nY=Li(),sY=us()});var yd=w((G$e,aY)=>{var Gme=us(),Yme=(r,e,t)=>{try{e=new Gme(e,t)}catch{return!1}return e.test(r)};aY.exports=Yme});var lY=w((Y$e,AY)=>{var jme=us(),qme=(r,e)=>new jme(r,e).set.map(t=>t.map(i=>i.value).join(\" \").trim().split(\" \"));AY.exports=qme});var uY=w((j$e,cY)=>{var Jme=Li(),Wme=us(),zme=(r,e,t)=>{let i=null,n=null,s=null;try{s=new Wme(e,t)}catch{return null}return r.forEach(o=>{s.test(o)&&(!i||n.compare(o)===-1)&&(i=o,n=new Jme(i,t))}),i};cY.exports=zme});var fY=w((q$e,gY)=>{var Vme=Li(),Xme=us(),Zme=(r,e,t)=>{let i=null,n=null,s=null;try{s=new Xme(e,t)}catch{return null}return r.forEach(o=>{s.test(o)&&(!i||n.compare(o)===1)&&(i=o,n=new Vme(i,t))}),i};gY.exports=Zme});var dY=w((J$e,pY)=>{var Sv=Li(),_me=us(),hY=dd(),$me=(r,e)=>{r=new _me(r,e);let t=new Sv(\"0.0.0\");if(r.test(t)||(t=new Sv(\"0.0.0-0\"),r.test(t)))return t;t=null;for(let i=0;i<r.set.length;++i){let n=r.set[i],s=null;n.forEach(o=>{let a=new Sv(o.semver.version);switch(o.operator){case\">\":a.prerelease.length===0?a.patch++:a.prerelease.push(0),a.raw=a.format();case\"\":case\">=\":(!s||hY(a,s))&&(s=a);break;case\"<\":case\"<=\":break;default:throw new Error(`Unexpected operation: ${o.operator}`)}}),s&&(!t||hY(t,s))&&(t=s)}return t&&r.test(t)?t:null};pY.exports=$me});var mY=w((W$e,CY)=>{var eEe=us(),tEe=(r,e)=>{try{return new eEe(r,e).range||\"*\"}catch{return null}};CY.exports=tEe});var VI=w((z$e,wY)=>{var rEe=Li(),yY=Ed(),{ANY:iEe}=yY,nEe=us(),sEe=yd(),EY=dd(),IY=GI(),oEe=jI(),aEe=YI(),AEe=(r,e,t,i)=>{r=new rEe(r,i),e=new nEe(e,i);let n,s,o,a,l;switch(t){case\">\":n=EY,s=oEe,o=IY,a=\">\",l=\">=\";break;case\"<\":n=IY,s=aEe,o=EY,a=\"<\",l=\"<=\";break;default:throw new TypeError('Must provide a hilo val of \"<\" or \">\"')}if(sEe(r,e,i))return!1;for(let c=0;c<e.set.length;++c){let u=e.set[c],g=null,f=null;if(u.forEach(h=>{h.semver===iEe&&(h=new yY(\">=0.0.0\")),g=g||h,f=f||h,n(h.semver,g.semver,i)?g=h:o(h.semver,f.semver,i)&&(f=h)}),g.operator===a||g.operator===l||(!f.operator||f.operator===a)&&s(r,f.semver))return!1;if(f.operator===l&&o(r,f.semver))return!1}return!0};wY.exports=AEe});var QY=w((V$e,BY)=>{var lEe=VI(),cEe=(r,e,t)=>lEe(r,e,\">\",t);BY.exports=cEe});var SY=w((X$e,bY)=>{var uEe=VI(),gEe=(r,e,t)=>uEe(r,e,\"<\",t);bY.exports=gEe});var PY=w((Z$e,xY)=>{var vY=us(),fEe=(r,e,t)=>(r=new vY(r,t),e=new vY(e,t),r.intersects(e));xY.exports=fEe});var kY=w((_$e,DY)=>{var hEe=yd(),pEe=cs();DY.exports=(r,e,t)=>{let i=[],n=null,s=null,o=r.sort((u,g)=>pEe(u,g,t));for(let u of o)hEe(u,e,t)?(s=u,n||(n=u)):(s&&i.push([n,s]),s=null,n=null);n&&i.push([n,null]);let a=[];for(let[u,g]of i)u===g?a.push(u):!g&&u===o[0]?a.push(\"*\"):g?u===o[0]?a.push(`<=${g}`):a.push(`${u} - ${g}`):a.push(`>=${u}`);let l=a.join(\" || \"),c=typeof e.raw==\"string\"?e.raw:String(e);return l.length<c.length?l:e}});var LY=w(($$e,TY)=>{var RY=us(),XI=Ed(),{ANY:vv}=XI,wd=yd(),xv=cs(),dEe=(r,e,t={})=>{if(r===e)return!0;r=new RY(r,t),e=new RY(e,t);let i=!1;e:for(let n of r.set){for(let s of e.set){let o=CEe(n,s,t);if(i=i||o!==null,o)continue e}if(i)return!1}return!0},CEe=(r,e,t)=>{if(r===e)return!0;if(r.length===1&&r[0].semver===vv){if(e.length===1&&e[0].semver===vv)return!0;t.includePrerelease?r=[new XI(\">=0.0.0-0\")]:r=[new XI(\">=0.0.0\")]}if(e.length===1&&e[0].semver===vv){if(t.includePrerelease)return!0;e=[new XI(\">=0.0.0\")]}let i=new Set,n,s;for(let h of r)h.operator===\">\"||h.operator===\">=\"?n=FY(n,h,t):h.operator===\"<\"||h.operator===\"<=\"?s=NY(s,h,t):i.add(h.semver);if(i.size>1)return null;let o;if(n&&s){if(o=xv(n.semver,s.semver,t),o>0)return null;if(o===0&&(n.operator!==\">=\"||s.operator!==\"<=\"))return null}for(let h of i){if(n&&!wd(h,String(n),t)||s&&!wd(h,String(s),t))return null;for(let p of e)if(!wd(h,String(p),t))return!1;return!0}let a,l,c,u,g=s&&!t.includePrerelease&&s.semver.prerelease.length?s.semver:!1,f=n&&!t.includePrerelease&&n.semver.prerelease.length?n.semver:!1;g&&g.prerelease.length===1&&s.operator===\"<\"&&g.prerelease[0]===0&&(g=!1);for(let h of e){if(u=u||h.operator===\">\"||h.operator===\">=\",c=c||h.operator===\"<\"||h.operator===\"<=\",n){if(f&&h.semver.prerelease&&h.semver.prerelease.length&&h.semver.major===f.major&&h.semver.minor===f.minor&&h.semver.patch===f.patch&&(f=!1),h.operator===\">\"||h.operator===\">=\"){if(a=FY(n,h,t),a===h&&a!==n)return!1}else if(n.operator===\">=\"&&!wd(n.semver,String(h),t))return!1}if(s){if(g&&h.semver.prerelease&&h.semver.prerelease.length&&h.semver.major===g.major&&h.semver.minor===g.minor&&h.semver.patch===g.patch&&(g=!1),h.operator===\"<\"||h.operator===\"<=\"){if(l=NY(s,h,t),l===h&&l!==s)return!1}else if(s.operator===\"<=\"&&!wd(s.semver,String(h),t))return!1}if(!h.operator&&(s||n)&&o!==0)return!1}return!(n&&c&&!s&&o!==0||s&&u&&!n&&o!==0||f||g)},FY=(r,e,t)=>{if(!r)return e;let i=xv(r.semver,e.semver,t);return i>0?r:i<0||e.operator===\">\"&&r.operator===\">=\"?e:r},NY=(r,e,t)=>{if(!r)return e;let i=xv(r.semver,e.semver,t);return i<0?r:i>0||e.operator===\"<\"&&r.operator===\"<=\"?e:r};TY.exports=dEe});var Xr=w((eet,OY)=>{var Pv=uc();OY.exports={re:Pv.re,src:Pv.src,tokens:Pv.t,SEMVER_SPEC_VERSION:gd().SEMVER_SPEC_VERSION,SemVer:Li(),compareIdentifiers:OI().compareIdentifiers,rcompareIdentifiers:OI().rcompareIdentifiers,parse:gc(),valid:aG(),clean:lG(),inc:uG(),diff:CG(),major:EG(),minor:yG(),patch:BG(),prerelease:bG(),compare:cs(),rcompare:vG(),compareLoose:PG(),compareBuild:HI(),sort:FG(),rsort:TG(),gt:dd(),lt:GI(),eq:UI(),neq:Cv(),gte:YI(),lte:jI(),cmp:mv(),coerce:YG(),Comparator:Ed(),Range:us(),satisfies:yd(),toComparators:lY(),maxSatisfying:uY(),minSatisfying:fY(),minVersion:dY(),validRange:mY(),outside:VI(),gtr:QY(),ltr:SY(),intersects:PY(),simplifyRange:kY(),subset:LY()}});var Dv=w(ZI=>{\"use strict\";Object.defineProperty(ZI,\"__esModule\",{value:!0});ZI.VERSION=void 0;ZI.VERSION=\"9.1.0\"});var Gt=w((exports,module)=>{\"use strict\";var __spreadArray=exports&&exports.__spreadArray||function(r,e,t){if(t||arguments.length===2)for(var i=0,n=e.length,s;i<n;i++)(s||!(i in e))&&(s||(s=Array.prototype.slice.call(e,0,i)),s[i]=e[i]);return r.concat(s||Array.prototype.slice.call(e))};Object.defineProperty(exports,\"__esModule\",{value:!0});exports.toFastProperties=exports.timer=exports.peek=exports.isES2015MapSupported=exports.PRINT_WARNING=exports.PRINT_ERROR=exports.packArray=exports.IDENTITY=exports.NOOP=exports.merge=exports.groupBy=exports.defaults=exports.assignNoOverwrite=exports.assign=exports.zipObject=exports.sortBy=exports.indexOf=exports.some=exports.difference=exports.every=exports.isObject=exports.isRegExp=exports.isArray=exports.partial=exports.uniq=exports.compact=exports.reduce=exports.findAll=exports.find=exports.cloneObj=exports.cloneArr=exports.contains=exports.has=exports.pick=exports.reject=exports.filter=exports.dropRight=exports.drop=exports.isFunction=exports.isUndefined=exports.isString=exports.forEach=exports.last=exports.first=exports.flatten=exports.map=exports.mapValues=exports.values=exports.keys=exports.isEmpty=void 0;exports.upperFirst=void 0;function isEmpty(r){return r&&r.length===0}exports.isEmpty=isEmpty;function keys(r){return r==null?[]:Object.keys(r)}exports.keys=keys;function values(r){for(var e=[],t=Object.keys(r),i=0;i<t.length;i++)e.push(r[t[i]]);return e}exports.values=values;function mapValues(r,e){for(var t=[],i=keys(r),n=0;n<i.length;n++){var s=i[n];t.push(e.call(null,r[s],s))}return t}exports.mapValues=mapValues;function map(r,e){for(var t=[],i=0;i<r.length;i++)t.push(e.call(null,r[i],i));return t}exports.map=map;function flatten(r){for(var e=[],t=0;t<r.length;t++){var i=r[t];Array.isArray(i)?e=e.concat(flatten(i)):e.push(i)}return e}exports.flatten=flatten;function first(r){return isEmpty(r)?void 0:r[0]}exports.first=first;function last(r){var e=r&&r.length;return e?r[e-1]:void 0}exports.last=last;function forEach(r,e){if(Array.isArray(r))for(var t=0;t<r.length;t++)e.call(null,r[t],t);else if(isObject(r))for(var i=keys(r),t=0;t<i.length;t++){var n=i[t],s=r[n];e.call(null,s,n)}else throw Error(\"non exhaustive match\")}exports.forEach=forEach;function isString(r){return typeof r==\"string\"}exports.isString=isString;function isUndefined(r){return r===void 0}exports.isUndefined=isUndefined;function isFunction(r){return r instanceof Function}exports.isFunction=isFunction;function drop(r,e){return e===void 0&&(e=1),r.slice(e,r.length)}exports.drop=drop;function dropRight(r,e){return e===void 0&&(e=1),r.slice(0,r.length-e)}exports.dropRight=dropRight;function filter(r,e){var t=[];if(Array.isArray(r))for(var i=0;i<r.length;i++){var n=r[i];e.call(null,n)&&t.push(n)}return t}exports.filter=filter;function reject(r,e){return filter(r,function(t){return!e(t)})}exports.reject=reject;function pick(r,e){for(var t=Object.keys(r),i={},n=0;n<t.length;n++){var s=t[n],o=r[s];e(o)&&(i[s]=o)}return i}exports.pick=pick;function has(r,e){return isObject(r)?r.hasOwnProperty(e):!1}exports.has=has;function contains(r,e){return find(r,function(t){return t===e})!==void 0}exports.contains=contains;function cloneArr(r){for(var e=[],t=0;t<r.length;t++)e.push(r[t]);return e}exports.cloneArr=cloneArr;function cloneObj(r){var e={};for(var t in r)Object.prototype.hasOwnProperty.call(r,t)&&(e[t]=r[t]);return e}exports.cloneObj=cloneObj;function find(r,e){for(var t=0;t<r.length;t++){var i=r[t];if(e.call(null,i))return i}}exports.find=find;function findAll(r,e){for(var t=[],i=0;i<r.length;i++){var n=r[i];e.call(null,n)&&t.push(n)}return t}exports.findAll=findAll;function reduce(r,e,t){for(var i=Array.isArray(r),n=i?r:values(r),s=i?[]:keys(r),o=t,a=0;a<n.length;a++)o=e.call(null,o,n[a],i?a:s[a]);return o}exports.reduce=reduce;function compact(r){return reject(r,function(e){return e==null})}exports.compact=compact;function uniq(r,e){e===void 0&&(e=function(i){return i});var t=[];return reduce(r,function(i,n){var s=e(n);return contains(t,s)?i:(t.push(s),i.concat(n))},[])}exports.uniq=uniq;function partial(r){for(var e=[],t=1;t<arguments.length;t++)e[t-1]=arguments[t];var i=[null],n=i.concat(e);return Function.bind.apply(r,n)}exports.partial=partial;function isArray(r){return Array.isArray(r)}exports.isArray=isArray;function isRegExp(r){return r instanceof RegExp}exports.isRegExp=isRegExp;function isObject(r){return r instanceof Object}exports.isObject=isObject;function every(r,e){for(var t=0;t<r.length;t++)if(!e(r[t],t))return!1;return!0}exports.every=every;function difference(r,e){return reject(r,function(t){return contains(e,t)})}exports.difference=difference;function some(r,e){for(var t=0;t<r.length;t++)if(e(r[t]))return!0;return!1}exports.some=some;function indexOf(r,e){for(var t=0;t<r.length;t++)if(r[t]===e)return t;return-1}exports.indexOf=indexOf;function sortBy(r,e){var t=cloneArr(r);return t.sort(function(i,n){return e(i)-e(n)}),t}exports.sortBy=sortBy;function zipObject(r,e){if(r.length!==e.length)throw Error(\"can't zipObject with different number of keys and values!\");for(var t={},i=0;i<r.length;i++)t[r[i]]=e[i];return t}exports.zipObject=zipObject;function assign(r){for(var e=[],t=1;t<arguments.length;t++)e[t-1]=arguments[t];for(var i=0;i<e.length;i++)for(var n=e[i],s=keys(n),o=0;o<s.length;o++){var a=s[o];r[a]=n[a]}return r}exports.assign=assign;function assignNoOverwrite(r){for(var e=[],t=1;t<arguments.length;t++)e[t-1]=arguments[t];for(var i=0;i<e.length;i++)for(var n=e[i],s=keys(n),o=0;o<s.length;o++){var a=s[o];has(r,a)||(r[a]=n[a])}return r}exports.assignNoOverwrite=assignNoOverwrite;function defaults(){for(var r=[],e=0;e<arguments.length;e++)r[e]=arguments[e];return assignNoOverwrite.apply(void 0,__spreadArray([{}],r,!1))}exports.defaults=defaults;function groupBy(r,e){var t={};return forEach(r,function(i){var n=e(i),s=t[n];s?s.push(i):t[n]=[i]}),t}exports.groupBy=groupBy;function merge(r,e){for(var t=cloneObj(r),i=keys(e),n=0;n<i.length;n++){var s=i[n],o=e[s];t[s]=o}return t}exports.merge=merge;function NOOP(){}exports.NOOP=NOOP;function IDENTITY(r){return r}exports.IDENTITY=IDENTITY;function packArray(r){for(var e=[],t=0;t<r.length;t++){var i=r[t];e.push(i!==void 0?i:void 0)}return e}exports.packArray=packArray;function PRINT_ERROR(r){console&&console.error&&console.error(\"Error: \"+r)}exports.PRINT_ERROR=PRINT_ERROR;function PRINT_WARNING(r){console&&console.warn&&console.warn(\"Warning: \"+r)}exports.PRINT_WARNING=PRINT_WARNING;function isES2015MapSupported(){return typeof Map==\"function\"}exports.isES2015MapSupported=isES2015MapSupported;function peek(r){return r[r.length-1]}exports.peek=peek;function timer(r){var e=new Date().getTime(),t=r(),i=new Date().getTime(),n=i-e;return{time:n,value:t}}exports.timer=timer;function toFastProperties(toBecomeFast){function FakeConstructor(){}FakeConstructor.prototype=toBecomeFast;var fakeInstance=new FakeConstructor;function fakeAccess(){return typeof fakeInstance.bar}return fakeAccess(),fakeAccess(),toBecomeFast;eval(toBecomeFast)}exports.toFastProperties=toFastProperties;function upperFirst(r){if(!r)return r;var e=getCharacterFromCodePointAt(r,0);return e.toUpperCase()+r.substring(e.length)}exports.upperFirst=upperFirst;var surrogatePairPattern=/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/;function getCharacterFromCodePointAt(r,e){var t=r.substring(e,e+1);return surrogatePairPattern.test(t)?t:r[e]}});var $I=w((MY,_I)=>{(function(r,e){typeof define==\"function\"&&define.amd?define([],e):typeof _I==\"object\"&&_I.exports?_I.exports=e():r.regexpToAst=e()})(typeof self<\"u\"?self:MY,function(){function r(){}r.prototype.saveState=function(){return{idx:this.idx,input:this.input,groupIdx:this.groupIdx}},r.prototype.restoreState=function(p){this.idx=p.idx,this.input=p.input,this.groupIdx=p.groupIdx},r.prototype.pattern=function(p){this.idx=0,this.input=p,this.groupIdx=0,this.consumeChar(\"/\");var C=this.disjunction();this.consumeChar(\"/\");for(var y={type:\"Flags\",loc:{begin:this.idx,end:p.length},global:!1,ignoreCase:!1,multiLine:!1,unicode:!1,sticky:!1};this.isRegExpFlag();)switch(this.popChar()){case\"g\":o(y,\"global\");break;case\"i\":o(y,\"ignoreCase\");break;case\"m\":o(y,\"multiLine\");break;case\"u\":o(y,\"unicode\");break;case\"y\":o(y,\"sticky\");break}if(this.idx!==this.input.length)throw Error(\"Redundant input: \"+this.input.substring(this.idx));return{type:\"Pattern\",flags:y,value:C,loc:this.loc(0)}},r.prototype.disjunction=function(){var p=[],C=this.idx;for(p.push(this.alternative());this.peekChar()===\"|\";)this.consumeChar(\"|\"),p.push(this.alternative());return{type:\"Disjunction\",value:p,loc:this.loc(C)}},r.prototype.alternative=function(){for(var p=[],C=this.idx;this.isTerm();)p.push(this.term());return{type:\"Alternative\",value:p,loc:this.loc(C)}},r.prototype.term=function(){return this.isAssertion()?this.assertion():this.atom()},r.prototype.assertion=function(){var p=this.idx;switch(this.popChar()){case\"^\":return{type:\"StartAnchor\",loc:this.loc(p)};case\"$\":return{type:\"EndAnchor\",loc:this.loc(p)};case\"\\\\\":switch(this.popChar()){case\"b\":return{type:\"WordBoundary\",loc:this.loc(p)};case\"B\":return{type:\"NonWordBoundary\",loc:this.loc(p)}}throw Error(\"Invalid Assertion Escape\");case\"(\":this.consumeChar(\"?\");var C;switch(this.popChar()){case\"=\":C=\"Lookahead\";break;case\"!\":C=\"NegativeLookahead\";break}a(C);var y=this.disjunction();return this.consumeChar(\")\"),{type:C,value:y,loc:this.loc(p)}}l()},r.prototype.quantifier=function(p){var C,y=this.idx;switch(this.popChar()){case\"*\":C={atLeast:0,atMost:1/0};break;case\"+\":C={atLeast:1,atMost:1/0};break;case\"?\":C={atLeast:0,atMost:1};break;case\"{\":var B=this.integerIncludingZero();switch(this.popChar()){case\"}\":C={atLeast:B,atMost:B};break;case\",\":var v;this.isDigit()?(v=this.integerIncludingZero(),C={atLeast:B,atMost:v}):C={atLeast:B,atMost:1/0},this.consumeChar(\"}\");break}if(p===!0&&C===void 0)return;a(C);break}if(!(p===!0&&C===void 0))return a(C),this.peekChar(0)===\"?\"?(this.consumeChar(\"?\"),C.greedy=!1):C.greedy=!0,C.type=\"Quantifier\",C.loc=this.loc(y),C},r.prototype.atom=function(){var p,C=this.idx;switch(this.peekChar()){case\".\":p=this.dotAll();break;case\"\\\\\":p=this.atomEscape();break;case\"[\":p=this.characterClass();break;case\"(\":p=this.group();break}return p===void 0&&this.isPatternCharacter()&&(p=this.patternCharacter()),a(p),p.loc=this.loc(C),this.isQuantifier()&&(p.quantifier=this.quantifier()),p},r.prototype.dotAll=function(){return this.consumeChar(\".\"),{type:\"Set\",complement:!0,value:[n(`\n`),n(\"\\r\"),n(\"\\u2028\"),n(\"\\u2029\")]}},r.prototype.atomEscape=function(){switch(this.consumeChar(\"\\\\\"),this.peekChar()){case\"1\":case\"2\":case\"3\":case\"4\":case\"5\":case\"6\":case\"7\":case\"8\":case\"9\":return this.decimalEscapeAtom();case\"d\":case\"D\":case\"s\":case\"S\":case\"w\":case\"W\":return this.characterClassEscape();case\"f\":case\"n\":case\"r\":case\"t\":case\"v\":return this.controlEscapeAtom();case\"c\":return this.controlLetterEscapeAtom();case\"0\":return this.nulCharacterAtom();case\"x\":return this.hexEscapeSequenceAtom();case\"u\":return this.regExpUnicodeEscapeSequenceAtom();default:return this.identityEscapeAtom()}},r.prototype.decimalEscapeAtom=function(){var p=this.positiveInteger();return{type:\"GroupBackReference\",value:p}},r.prototype.characterClassEscape=function(){var p,C=!1;switch(this.popChar()){case\"d\":p=u;break;case\"D\":p=u,C=!0;break;case\"s\":p=f;break;case\"S\":p=f,C=!0;break;case\"w\":p=g;break;case\"W\":p=g,C=!0;break}return a(p),{type:\"Set\",value:p,complement:C}},r.prototype.controlEscapeAtom=function(){var p;switch(this.popChar()){case\"f\":p=n(\"\\f\");break;case\"n\":p=n(`\n`);break;case\"r\":p=n(\"\\r\");break;case\"t\":p=n(\"\t\");break;case\"v\":p=n(\"\\v\");break}return a(p),{type:\"Character\",value:p}},r.prototype.controlLetterEscapeAtom=function(){this.consumeChar(\"c\");var p=this.popChar();if(/[a-zA-Z]/.test(p)===!1)throw Error(\"Invalid \");var C=p.toUpperCase().charCodeAt(0)-64;return{type:\"Character\",value:C}},r.prototype.nulCharacterAtom=function(){return this.consumeChar(\"0\"),{type:\"Character\",value:n(\"\\0\")}},r.prototype.hexEscapeSequenceAtom=function(){return this.consumeChar(\"x\"),this.parseHexDigits(2)},r.prototype.regExpUnicodeEscapeSequenceAtom=function(){return this.consumeChar(\"u\"),this.parseHexDigits(4)},r.prototype.identityEscapeAtom=function(){var p=this.popChar();return{type:\"Character\",value:n(p)}},r.prototype.classPatternCharacterAtom=function(){switch(this.peekChar()){case`\n`:case\"\\r\":case\"\\u2028\":case\"\\u2029\":case\"\\\\\":case\"]\":throw Error(\"TBD\");default:var p=this.popChar();return{type:\"Character\",value:n(p)}}},r.prototype.characterClass=function(){var p=[],C=!1;for(this.consumeChar(\"[\"),this.peekChar(0)===\"^\"&&(this.consumeChar(\"^\"),C=!0);this.isClassAtom();){var y=this.classAtom(),B=y.type===\"Character\";if(B&&this.isRangeDash()){this.consumeChar(\"-\");var v=this.classAtom(),D=v.type===\"Character\";if(D){if(v.value<y.value)throw Error(\"Range out of order in character class\");p.push({from:y.value,to:v.value})}else s(y.value,p),p.push(n(\"-\")),s(v.value,p)}else s(y.value,p)}return this.consumeChar(\"]\"),{type:\"Set\",complement:C,value:p}},r.prototype.classAtom=function(){switch(this.peekChar()){case\"]\":case`\n`:case\"\\r\":case\"\\u2028\":case\"\\u2029\":throw Error(\"TBD\");case\"\\\\\":return this.classEscape();default:return this.classPatternCharacterAtom()}},r.prototype.classEscape=function(){switch(this.consumeChar(\"\\\\\"),this.peekChar()){case\"b\":return this.consumeChar(\"b\"),{type:\"Character\",value:n(\"\\b\")};case\"d\":case\"D\":case\"s\":case\"S\":case\"w\":case\"W\":return this.characterClassEscape();case\"f\":case\"n\":case\"r\":case\"t\":case\"v\":return this.controlEscapeAtom();case\"c\":return this.controlLetterEscapeAtom();case\"0\":return this.nulCharacterAtom();case\"x\":return this.hexEscapeSequenceAtom();case\"u\":return this.regExpUnicodeEscapeSequenceAtom();default:return this.identityEscapeAtom()}},r.prototype.group=function(){var p=!0;switch(this.consumeChar(\"(\"),this.peekChar(0)){case\"?\":this.consumeChar(\"?\"),this.consumeChar(\":\"),p=!1;break;default:this.groupIdx++;break}var C=this.disjunction();this.consumeChar(\")\");var y={type:\"Group\",capturing:p,value:C};return p&&(y.idx=this.groupIdx),y},r.prototype.positiveInteger=function(){var p=this.popChar();if(i.test(p)===!1)throw Error(\"Expecting a positive integer\");for(;t.test(this.peekChar(0));)p+=this.popChar();return parseInt(p,10)},r.prototype.integerIncludingZero=function(){var p=this.popChar();if(t.test(p)===!1)throw Error(\"Expecting an integer\");for(;t.test(this.peekChar(0));)p+=this.popChar();return parseInt(p,10)},r.prototype.patternCharacter=function(){var p=this.popChar();switch(p){case`\n`:case\"\\r\":case\"\\u2028\":case\"\\u2029\":case\"^\":case\"$\":case\"\\\\\":case\".\":case\"*\":case\"+\":case\"?\":case\"(\":case\")\":case\"[\":case\"|\":throw Error(\"TBD\");default:return{type:\"Character\",value:n(p)}}},r.prototype.isRegExpFlag=function(){switch(this.peekChar(0)){case\"g\":case\"i\":case\"m\":case\"u\":case\"y\":return!0;default:return!1}},r.prototype.isRangeDash=function(){return this.peekChar()===\"-\"&&this.isClassAtom(1)},r.prototype.isDigit=function(){return t.test(this.peekChar(0))},r.prototype.isClassAtom=function(p){switch(p===void 0&&(p=0),this.peekChar(p)){case\"]\":case`\n`:case\"\\r\":case\"\\u2028\":case\"\\u2029\":return!1;default:return!0}},r.prototype.isTerm=function(){return this.isAtom()||this.isAssertion()},r.prototype.isAtom=function(){if(this.isPatternCharacter())return!0;switch(this.peekChar(0)){case\".\":case\"\\\\\":case\"[\":case\"(\":return!0;default:return!1}},r.prototype.isAssertion=function(){switch(this.peekChar(0)){case\"^\":case\"$\":return!0;case\"\\\\\":switch(this.peekChar(1)){case\"b\":case\"B\":return!0;default:return!1}case\"(\":return this.peekChar(1)===\"?\"&&(this.peekChar(2)===\"=\"||this.peekChar(2)===\"!\");default:return!1}},r.prototype.isQuantifier=function(){var p=this.saveState();try{return this.quantifier(!0)!==void 0}catch{return!1}finally{this.restoreState(p)}},r.prototype.isPatternCharacter=function(){switch(this.peekChar()){case\"^\":case\"$\":case\"\\\\\":case\".\":case\"*\":case\"+\":case\"?\":case\"(\":case\")\":case\"[\":case\"|\":case\"/\":case`\n`:case\"\\r\":case\"\\u2028\":case\"\\u2029\":return!1;default:return!0}},r.prototype.parseHexDigits=function(p){for(var C=\"\",y=0;y<p;y++){var B=this.popChar();if(e.test(B)===!1)throw Error(\"Expecting a HexDecimal digits\");C+=B}var v=parseInt(C,16);return{type:\"Character\",value:v}},r.prototype.peekChar=function(p){return p===void 0&&(p=0),this.input[this.idx+p]},r.prototype.popChar=function(){var p=this.peekChar(0);return this.consumeChar(),p},r.prototype.consumeChar=function(p){if(p!==void 0&&this.input[this.idx]!==p)throw Error(\"Expected: '\"+p+\"' but found: '\"+this.input[this.idx]+\"' at offset: \"+this.idx);if(this.idx>=this.input.length)throw Error(\"Unexpected end of input\");this.idx++},r.prototype.loc=function(p){return{begin:p,end:this.idx}};var e=/[0-9a-fA-F]/,t=/[0-9]/,i=/[1-9]/;function n(p){return p.charCodeAt(0)}function s(p,C){p.length!==void 0?p.forEach(function(y){C.push(y)}):C.push(p)}function o(p,C){if(p[C]===!0)throw\"duplicate flag \"+C;p[C]=!0}function a(p){if(p===void 0)throw Error(\"Internal Error - Should never get here!\")}function l(){throw Error(\"Internal Error - Should never get here!\")}var c,u=[];for(c=n(\"0\");c<=n(\"9\");c++)u.push(c);var g=[n(\"_\")].concat(u);for(c=n(\"a\");c<=n(\"z\");c++)g.push(c);for(c=n(\"A\");c<=n(\"Z\");c++)g.push(c);var f=[n(\" \"),n(\"\\f\"),n(`\n`),n(\"\\r\"),n(\"\t\"),n(\"\\v\"),n(\"\t\"),n(\"\\xA0\"),n(\"\\u1680\"),n(\"\\u2000\"),n(\"\\u2001\"),n(\"\\u2002\"),n(\"\\u2003\"),n(\"\\u2004\"),n(\"\\u2005\"),n(\"\\u2006\"),n(\"\\u2007\"),n(\"\\u2008\"),n(\"\\u2009\"),n(\"\\u200A\"),n(\"\\u2028\"),n(\"\\u2029\"),n(\"\\u202F\"),n(\"\\u205F\"),n(\"\\u3000\"),n(\"\\uFEFF\")];function h(){}return h.prototype.visitChildren=function(p){for(var C in p){var y=p[C];p.hasOwnProperty(C)&&(y.type!==void 0?this.visit(y):Array.isArray(y)&&y.forEach(function(B){this.visit(B)},this))}},h.prototype.visit=function(p){switch(p.type){case\"Pattern\":this.visitPattern(p);break;case\"Flags\":this.visitFlags(p);break;case\"Disjunction\":this.visitDisjunction(p);break;case\"Alternative\":this.visitAlternative(p);break;case\"StartAnchor\":this.visitStartAnchor(p);break;case\"EndAnchor\":this.visitEndAnchor(p);break;case\"WordBoundary\":this.visitWordBoundary(p);break;case\"NonWordBoundary\":this.visitNonWordBoundary(p);break;case\"Lookahead\":this.visitLookahead(p);break;case\"NegativeLookahead\":this.visitNegativeLookahead(p);break;case\"Character\":this.visitCharacter(p);break;case\"Set\":this.visitSet(p);break;case\"Group\":this.visitGroup(p);break;case\"GroupBackReference\":this.visitGroupBackReference(p);break;case\"Quantifier\":this.visitQuantifier(p);break}this.visitChildren(p)},h.prototype.visitPattern=function(p){},h.prototype.visitFlags=function(p){},h.prototype.visitDisjunction=function(p){},h.prototype.visitAlternative=function(p){},h.prototype.visitStartAnchor=function(p){},h.prototype.visitEndAnchor=function(p){},h.prototype.visitWordBoundary=function(p){},h.prototype.visitNonWordBoundary=function(p){},h.prototype.visitLookahead=function(p){},h.prototype.visitNegativeLookahead=function(p){},h.prototype.visitCharacter=function(p){},h.prototype.visitSet=function(p){},h.prototype.visitGroup=function(p){},h.prototype.visitGroupBackReference=function(p){},h.prototype.visitQuantifier=function(p){},{RegExpParser:r,BaseRegExpVisitor:h,VERSION:\"0.5.0\"}})});var ty=w(Xg=>{\"use strict\";Object.defineProperty(Xg,\"__esModule\",{value:!0});Xg.clearRegExpParserCache=Xg.getRegExpAst=void 0;var mEe=$I(),ey={},EEe=new mEe.RegExpParser;function IEe(r){var e=r.toString();if(ey.hasOwnProperty(e))return ey[e];var t=EEe.pattern(e);return ey[e]=t,t}Xg.getRegExpAst=IEe;function yEe(){ey={}}Xg.clearRegExpParserCache=yEe});var YY=w(Cn=>{\"use strict\";var wEe=Cn&&Cn.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!=\"function\"&&t!==null)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Cn,\"__esModule\",{value:!0});Cn.canMatchCharCode=Cn.firstCharOptimizedIndices=Cn.getOptimizedStartCodesIndices=Cn.failedOptimizationPrefixMsg=void 0;var UY=$I(),gs=Gt(),HY=ty(),xa=Rv(),GY=\"Complement Sets are not supported for first char optimization\";Cn.failedOptimizationPrefixMsg=`Unable to use \"first char\" lexer optimizations:\n`;function BEe(r,e){e===void 0&&(e=!1);try{var t=(0,HY.getRegExpAst)(r),i=iy(t.value,{},t.flags.ignoreCase);return i}catch(s){if(s.message===GY)e&&(0,gs.PRINT_WARNING)(\"\"+Cn.failedOptimizationPrefixMsg+(\"\tUnable to optimize: < \"+r.toString()+` >\n`)+`\tComplement Sets cannot be automatically optimized.\n\tThis will disable the lexer's first char optimizations.\n\tSee: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#COMPLEMENT for details.`);else{var n=\"\";e&&(n=`\n\tThis will disable the lexer's first char optimizations.\n\tSee: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#REGEXP_PARSING for details.`),(0,gs.PRINT_ERROR)(Cn.failedOptimizationPrefixMsg+`\n`+(\"\tFailed parsing: < \"+r.toString()+` >\n`)+(\"\tUsing the regexp-to-ast library version: \"+UY.VERSION+`\n`)+\"\tPlease open an issue at: https://github.com/bd82/regexp-to-ast/issues\"+n)}}return[]}Cn.getOptimizedStartCodesIndices=BEe;function iy(r,e,t){switch(r.type){case\"Disjunction\":for(var i=0;i<r.value.length;i++)iy(r.value[i],e,t);break;case\"Alternative\":for(var n=r.value,i=0;i<n.length;i++){var s=n[i];switch(s.type){case\"EndAnchor\":case\"GroupBackReference\":case\"Lookahead\":case\"NegativeLookahead\":case\"StartAnchor\":case\"WordBoundary\":case\"NonWordBoundary\":continue}var o=s;switch(o.type){case\"Character\":ry(o.value,e,t);break;case\"Set\":if(o.complement===!0)throw Error(GY);(0,gs.forEach)(o.value,function(c){if(typeof c==\"number\")ry(c,e,t);else{var u=c;if(t===!0)for(var g=u.from;g<=u.to;g++)ry(g,e,t);else{for(var g=u.from;g<=u.to&&g<xa.minOptimizationVal;g++)ry(g,e,t);if(u.to>=xa.minOptimizationVal)for(var f=u.from>=xa.minOptimizationVal?u.from:xa.minOptimizationVal,h=u.to,p=(0,xa.charCodeToOptimizedIndex)(f),C=(0,xa.charCodeToOptimizedIndex)(h),y=p;y<=C;y++)e[y]=y}}});break;case\"Group\":iy(o.value,e,t);break;default:throw Error(\"Non Exhaustive Match\")}var a=o.quantifier!==void 0&&o.quantifier.atLeast===0;if(o.type===\"Group\"&&kv(o)===!1||o.type!==\"Group\"&&a===!1)break}break;default:throw Error(\"non exhaustive match!\")}return(0,gs.values)(e)}Cn.firstCharOptimizedIndices=iy;function ry(r,e,t){var i=(0,xa.charCodeToOptimizedIndex)(r);e[i]=i,t===!0&&QEe(r,e)}function QEe(r,e){var t=String.fromCharCode(r),i=t.toUpperCase();if(i!==t){var n=(0,xa.charCodeToOptimizedIndex)(i.charCodeAt(0));e[n]=n}else{var s=t.toLowerCase();if(s!==t){var n=(0,xa.charCodeToOptimizedIndex)(s.charCodeAt(0));e[n]=n}}}function KY(r,e){return(0,gs.find)(r.value,function(t){if(typeof t==\"number\")return(0,gs.contains)(e,t);var i=t;return(0,gs.find)(e,function(n){return i.from<=n&&n<=i.to})!==void 0})}function kv(r){return r.quantifier&&r.quantifier.atLeast===0?!0:r.value?(0,gs.isArray)(r.value)?(0,gs.every)(r.value,kv):kv(r.value):!1}var bEe=function(r){wEe(e,r);function e(t){var i=r.call(this)||this;return i.targetCharCodes=t,i.found=!1,i}return e.prototype.visitChildren=function(t){if(this.found!==!0){switch(t.type){case\"Lookahead\":this.visitLookahead(t);return;case\"NegativeLookahead\":this.visitNegativeLookahead(t);return}r.prototype.visitChildren.call(this,t)}},e.prototype.visitCharacter=function(t){(0,gs.contains)(this.targetCharCodes,t.value)&&(this.found=!0)},e.prototype.visitSet=function(t){t.complement?KY(t,this.targetCharCodes)===void 0&&(this.found=!0):KY(t,this.targetCharCodes)!==void 0&&(this.found=!0)},e}(UY.BaseRegExpVisitor);function SEe(r,e){if(e instanceof RegExp){var t=(0,HY.getRegExpAst)(e),i=new bEe(r);return i.visit(t),i.found}else return(0,gs.find)(e,function(n){return(0,gs.contains)(r,n.charCodeAt(0))})!==void 0}Cn.canMatchCharCode=SEe});var Rv=w(Ve=>{\"use strict\";var jY=Ve&&Ve.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!=\"function\"&&t!==null)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Ve,\"__esModule\",{value:!0});Ve.charCodeToOptimizedIndex=Ve.minOptimizationVal=Ve.buildLineBreakIssueMessage=Ve.LineTerminatorOptimizedTester=Ve.isShortPattern=Ve.isCustomPattern=Ve.cloneEmptyGroups=Ve.performWarningRuntimeChecks=Ve.performRuntimeChecks=Ve.addStickyFlag=Ve.addStartOfInput=Ve.findUnreachablePatterns=Ve.findModesThatDoNotExist=Ve.findInvalidGroupType=Ve.findDuplicatePatterns=Ve.findUnsupportedFlags=Ve.findStartOfInputAnchor=Ve.findEmptyMatchRegExps=Ve.findEndOfInputAnchor=Ve.findInvalidPatterns=Ve.findMissingPatterns=Ve.validatePatterns=Ve.analyzeTokenTypes=Ve.enableSticky=Ve.disableSticky=Ve.SUPPORT_STICKY=Ve.MODES=Ve.DEFAULT_MODE=void 0;var qY=$I(),ir=Bd(),xe=Gt(),Zg=YY(),JY=ty(),Do=\"PATTERN\";Ve.DEFAULT_MODE=\"defaultMode\";Ve.MODES=\"modes\";Ve.SUPPORT_STICKY=typeof new RegExp(\"(?:)\").sticky==\"boolean\";function vEe(){Ve.SUPPORT_STICKY=!1}Ve.disableSticky=vEe;function xEe(){Ve.SUPPORT_STICKY=!0}Ve.enableSticky=xEe;function PEe(r,e){e=(0,xe.defaults)(e,{useSticky:Ve.SUPPORT_STICKY,debug:!1,safeMode:!1,positionTracking:\"full\",lineTerminatorCharacters:[\"\\r\",`\n`],tracer:function(v,D){return D()}});var t=e.tracer;t(\"initCharCodeToOptimizedIndexMap\",function(){KEe()});var i;t(\"Reject Lexer.NA\",function(){i=(0,xe.reject)(r,function(v){return v[Do]===ir.Lexer.NA})});var n=!1,s;t(\"Transform Patterns\",function(){n=!1,s=(0,xe.map)(i,function(v){var D=v[Do];if((0,xe.isRegExp)(D)){var T=D.source;return T.length===1&&T!==\"^\"&&T!==\"$\"&&T!==\".\"&&!D.ignoreCase?T:T.length===2&&T[0]===\"\\\\\"&&!(0,xe.contains)([\"d\",\"D\",\"s\",\"S\",\"t\",\"r\",\"n\",\"t\",\"0\",\"c\",\"b\",\"B\",\"f\",\"v\",\"w\",\"W\"],T[1])?T[1]:e.useSticky?Tv(D):Nv(D)}else{if((0,xe.isFunction)(D))return n=!0,{exec:D};if((0,xe.has)(D,\"exec\"))return n=!0,D;if(typeof D==\"string\"){if(D.length===1)return D;var H=D.replace(/[\\\\^$.*+?()[\\]{}|]/g,\"\\\\$&\"),j=new RegExp(H);return e.useSticky?Tv(j):Nv(j)}else throw Error(\"non exhaustive match\")}})});var o,a,l,c,u;t(\"misc mapping\",function(){o=(0,xe.map)(i,function(v){return v.tokenTypeIdx}),a=(0,xe.map)(i,function(v){var D=v.GROUP;if(D!==ir.Lexer.SKIPPED){if((0,xe.isString)(D))return D;if((0,xe.isUndefined)(D))return!1;throw Error(\"non exhaustive match\")}}),l=(0,xe.map)(i,function(v){var D=v.LONGER_ALT;if(D){var T=(0,xe.isArray)(D)?(0,xe.map)(D,function(H){return(0,xe.indexOf)(i,H)}):[(0,xe.indexOf)(i,D)];return T}}),c=(0,xe.map)(i,function(v){return v.PUSH_MODE}),u=(0,xe.map)(i,function(v){return(0,xe.has)(v,\"POP_MODE\")})});var g;t(\"Line Terminator Handling\",function(){var v=oj(e.lineTerminatorCharacters);g=(0,xe.map)(i,function(D){return!1}),e.positionTracking!==\"onlyOffset\"&&(g=(0,xe.map)(i,function(D){if((0,xe.has)(D,\"LINE_BREAKS\"))return D.LINE_BREAKS;if(nj(D,v)===!1)return(0,Zg.canMatchCharCode)(v,D.PATTERN)}))});var f,h,p,C;t(\"Misc Mapping #2\",function(){f=(0,xe.map)(i,Ov),h=(0,xe.map)(s,ij),p=(0,xe.reduce)(i,function(v,D){var T=D.GROUP;return(0,xe.isString)(T)&&T!==ir.Lexer.SKIPPED&&(v[T]=[]),v},{}),C=(0,xe.map)(s,function(v,D){return{pattern:s[D],longerAlt:l[D],canLineTerminator:g[D],isCustom:f[D],short:h[D],group:a[D],push:c[D],pop:u[D],tokenTypeIdx:o[D],tokenType:i[D]}})});var y=!0,B=[];return e.safeMode||t(\"First Char Optimization\",function(){B=(0,xe.reduce)(i,function(v,D,T){if(typeof D.PATTERN==\"string\"){var H=D.PATTERN.charCodeAt(0),j=Lv(H);Fv(v,j,C[T])}else if((0,xe.isArray)(D.START_CHARS_HINT)){var $;(0,xe.forEach)(D.START_CHARS_HINT,function(W){var _=typeof W==\"string\"?W.charCodeAt(0):W,A=Lv(_);$!==A&&($=A,Fv(v,A,C[T]))})}else if((0,xe.isRegExp)(D.PATTERN))if(D.PATTERN.unicode)y=!1,e.ensureOptimizations&&(0,xe.PRINT_ERROR)(\"\"+Zg.failedOptimizationPrefixMsg+(\"\tUnable to analyze < \"+D.PATTERN.toString()+` > pattern.\n`)+`\tThe regexp unicode flag is not currently supported by the regexp-to-ast library.\n\tThis will disable the lexer's first char optimizations.\n\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNICODE_OPTIMIZE`);else{var V=(0,Zg.getOptimizedStartCodesIndices)(D.PATTERN,e.ensureOptimizations);(0,xe.isEmpty)(V)&&(y=!1),(0,xe.forEach)(V,function(W){Fv(v,W,C[T])})}else e.ensureOptimizations&&(0,xe.PRINT_ERROR)(\"\"+Zg.failedOptimizationPrefixMsg+(\"\tTokenType: <\"+D.name+`> is using a custom token pattern without providing <start_chars_hint> parameter.\n`)+`\tThis will disable the lexer's first char optimizations.\n\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_OPTIMIZE`),y=!1;return v},[])}),t(\"ArrayPacking\",function(){B=(0,xe.packArray)(B)}),{emptyGroups:p,patternIdxToConfig:C,charCodeToPatternIdxToConfig:B,hasCustom:n,canBeOptimized:y}}Ve.analyzeTokenTypes=PEe;function DEe(r,e){var t=[],i=WY(r);t=t.concat(i.errors);var n=zY(i.valid),s=n.valid;return t=t.concat(n.errors),t=t.concat(kEe(s)),t=t.concat(ej(s)),t=t.concat(tj(s,e)),t=t.concat(rj(s)),t}Ve.validatePatterns=DEe;function kEe(r){var e=[],t=(0,xe.filter)(r,function(i){return(0,xe.isRegExp)(i[Do])});return e=e.concat(VY(t)),e=e.concat(ZY(t)),e=e.concat(_Y(t)),e=e.concat($Y(t)),e=e.concat(XY(t)),e}function WY(r){var e=(0,xe.filter)(r,function(n){return!(0,xe.has)(n,Do)}),t=(0,xe.map)(e,function(n){return{message:\"Token Type: ->\"+n.name+\"<- missing static 'PATTERN' property\",type:ir.LexerDefinitionErrorType.MISSING_PATTERN,tokenTypes:[n]}}),i=(0,xe.difference)(r,e);return{errors:t,valid:i}}Ve.findMissingPatterns=WY;function zY(r){var e=(0,xe.filter)(r,function(n){var s=n[Do];return!(0,xe.isRegExp)(s)&&!(0,xe.isFunction)(s)&&!(0,xe.has)(s,\"exec\")&&!(0,xe.isString)(s)}),t=(0,xe.map)(e,function(n){return{message:\"Token Type: ->\"+n.name+\"<- static 'PATTERN' can only be a RegExp, a Function matching the {CustomPatternMatcherFunc} type or an Object matching the {ICustomPattern} interface.\",type:ir.LexerDefinitionErrorType.INVALID_PATTERN,tokenTypes:[n]}}),i=(0,xe.difference)(r,e);return{errors:t,valid:i}}Ve.findInvalidPatterns=zY;var REe=/[^\\\\][\\$]/;function VY(r){var e=function(n){jY(s,n);function s(){var o=n!==null&&n.apply(this,arguments)||this;return o.found=!1,o}return s.prototype.visitEndAnchor=function(o){this.found=!0},s}(qY.BaseRegExpVisitor),t=(0,xe.filter)(r,function(n){var s=n[Do];try{var o=(0,JY.getRegExpAst)(s),a=new e;return a.visit(o),a.found}catch{return REe.test(s.source)}}),i=(0,xe.map)(t,function(n){return{message:`Unexpected RegExp Anchor Error:\n\tToken Type: ->`+n.name+`<- static 'PATTERN' cannot contain end of input anchor '$'\n\tSee chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS\tfor details.`,type:ir.LexerDefinitionErrorType.EOI_ANCHOR_FOUND,tokenTypes:[n]}});return i}Ve.findEndOfInputAnchor=VY;function XY(r){var e=(0,xe.filter)(r,function(i){var n=i[Do];return n.test(\"\")}),t=(0,xe.map)(e,function(i){return{message:\"Token Type: ->\"+i.name+\"<- static 'PATTERN' must not match an empty string\",type:ir.LexerDefinitionErrorType.EMPTY_MATCH_PATTERN,tokenTypes:[i]}});return t}Ve.findEmptyMatchRegExps=XY;var FEe=/[^\\\\[][\\^]|^\\^/;function ZY(r){var e=function(n){jY(s,n);function s(){var o=n!==null&&n.apply(this,arguments)||this;return o.found=!1,o}return s.prototype.visitStartAnchor=function(o){this.found=!0},s}(qY.BaseRegExpVisitor),t=(0,xe.filter)(r,function(n){var s=n[Do];try{var o=(0,JY.getRegExpAst)(s),a=new e;return a.visit(o),a.found}catch{return FEe.test(s.source)}}),i=(0,xe.map)(t,function(n){return{message:`Unexpected RegExp Anchor Error:\n\tToken Type: ->`+n.name+`<- static 'PATTERN' cannot contain start of input anchor '^'\n\tSee https://chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS\tfor details.`,type:ir.LexerDefinitionErrorType.SOI_ANCHOR_FOUND,tokenTypes:[n]}});return i}Ve.findStartOfInputAnchor=ZY;function _Y(r){var e=(0,xe.filter)(r,function(i){var n=i[Do];return n instanceof RegExp&&(n.multiline||n.global)}),t=(0,xe.map)(e,function(i){return{message:\"Token Type: ->\"+i.name+\"<- static 'PATTERN' may NOT contain global('g') or multiline('m')\",type:ir.LexerDefinitionErrorType.UNSUPPORTED_FLAGS_FOUND,tokenTypes:[i]}});return t}Ve.findUnsupportedFlags=_Y;function $Y(r){var e=[],t=(0,xe.map)(r,function(s){return(0,xe.reduce)(r,function(o,a){return s.PATTERN.source===a.PATTERN.source&&!(0,xe.contains)(e,a)&&a.PATTERN!==ir.Lexer.NA&&(e.push(a),o.push(a)),o},[])});t=(0,xe.compact)(t);var i=(0,xe.filter)(t,function(s){return s.length>1}),n=(0,xe.map)(i,function(s){var o=(0,xe.map)(s,function(l){return l.name}),a=(0,xe.first)(s).PATTERN;return{message:\"The same RegExp pattern ->\"+a+\"<-\"+(\"has been used in all of the following Token Types: \"+o.join(\", \")+\" <-\"),type:ir.LexerDefinitionErrorType.DUPLICATE_PATTERNS_FOUND,tokenTypes:s}});return n}Ve.findDuplicatePatterns=$Y;function ej(r){var e=(0,xe.filter)(r,function(i){if(!(0,xe.has)(i,\"GROUP\"))return!1;var n=i.GROUP;return n!==ir.Lexer.SKIPPED&&n!==ir.Lexer.NA&&!(0,xe.isString)(n)}),t=(0,xe.map)(e,function(i){return{message:\"Token Type: ->\"+i.name+\"<- static 'GROUP' can only be Lexer.SKIPPED/Lexer.NA/A String\",type:ir.LexerDefinitionErrorType.INVALID_GROUP_TYPE_FOUND,tokenTypes:[i]}});return t}Ve.findInvalidGroupType=ej;function tj(r,e){var t=(0,xe.filter)(r,function(n){return n.PUSH_MODE!==void 0&&!(0,xe.contains)(e,n.PUSH_MODE)}),i=(0,xe.map)(t,function(n){var s=\"Token Type: ->\"+n.name+\"<- static 'PUSH_MODE' value cannot refer to a Lexer Mode ->\"+n.PUSH_MODE+\"<-which does not exist\";return{message:s,type:ir.LexerDefinitionErrorType.PUSH_MODE_DOES_NOT_EXIST,tokenTypes:[n]}});return i}Ve.findModesThatDoNotExist=tj;function rj(r){var e=[],t=(0,xe.reduce)(r,function(i,n,s){var o=n.PATTERN;return o===ir.Lexer.NA||((0,xe.isString)(o)?i.push({str:o,idx:s,tokenType:n}):(0,xe.isRegExp)(o)&&TEe(o)&&i.push({str:o.source,idx:s,tokenType:n})),i},[]);return(0,xe.forEach)(r,function(i,n){(0,xe.forEach)(t,function(s){var o=s.str,a=s.idx,l=s.tokenType;if(n<a&&NEe(o,i.PATTERN)){var c=\"Token: ->\"+l.name+`<- can never be matched.\n`+(\"Because it appears AFTER the Token Type ->\"+i.name+\"<-\")+`in the lexer's definition.\nSee https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNREACHABLE`;e.push({message:c,type:ir.LexerDefinitionErrorType.UNREACHABLE_PATTERN,tokenTypes:[i,l]})}})}),e}Ve.findUnreachablePatterns=rj;function NEe(r,e){if((0,xe.isRegExp)(e)){var t=e.exec(r);return t!==null&&t.index===0}else{if((0,xe.isFunction)(e))return e(r,0,[],{});if((0,xe.has)(e,\"exec\"))return e.exec(r,0,[],{});if(typeof e==\"string\")return e===r;throw Error(\"non exhaustive match\")}}function TEe(r){var e=[\".\",\"\\\\\",\"[\",\"]\",\"|\",\"^\",\"$\",\"(\",\")\",\"?\",\"*\",\"+\",\"{\"];return(0,xe.find)(e,function(t){return r.source.indexOf(t)!==-1})===void 0}function Nv(r){var e=r.ignoreCase?\"i\":\"\";return new RegExp(\"^(?:\"+r.source+\")\",e)}Ve.addStartOfInput=Nv;function Tv(r){var e=r.ignoreCase?\"iy\":\"y\";return new RegExp(\"\"+r.source,e)}Ve.addStickyFlag=Tv;function LEe(r,e,t){var i=[];return(0,xe.has)(r,Ve.DEFAULT_MODE)||i.push({message:\"A MultiMode Lexer cannot be initialized without a <\"+Ve.DEFAULT_MODE+`> property in its definition\n`,type:ir.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE}),(0,xe.has)(r,Ve.MODES)||i.push({message:\"A MultiMode Lexer cannot be initialized without a <\"+Ve.MODES+`> property in its definition\n`,type:ir.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY}),(0,xe.has)(r,Ve.MODES)&&(0,xe.has)(r,Ve.DEFAULT_MODE)&&!(0,xe.has)(r.modes,r.defaultMode)&&i.push({message:\"A MultiMode Lexer cannot be initialized with a \"+Ve.DEFAULT_MODE+\": <\"+r.defaultMode+`>which does not exist\n`,type:ir.LexerDefinitionErrorType.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST}),(0,xe.has)(r,Ve.MODES)&&(0,xe.forEach)(r.modes,function(n,s){(0,xe.forEach)(n,function(o,a){(0,xe.isUndefined)(o)&&i.push({message:\"A Lexer cannot be initialized using an undefined Token Type. Mode:\"+(\"<\"+s+\"> at index: <\"+a+`>\n`),type:ir.LexerDefinitionErrorType.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED})})}),i}Ve.performRuntimeChecks=LEe;function OEe(r,e,t){var i=[],n=!1,s=(0,xe.compact)((0,xe.flatten)((0,xe.mapValues)(r.modes,function(l){return l}))),o=(0,xe.reject)(s,function(l){return l[Do]===ir.Lexer.NA}),a=oj(t);return e&&(0,xe.forEach)(o,function(l){var c=nj(l,a);if(c!==!1){var u=sj(l,c),g={message:u,type:c.issue,tokenType:l};i.push(g)}else(0,xe.has)(l,\"LINE_BREAKS\")?l.LINE_BREAKS===!0&&(n=!0):(0,Zg.canMatchCharCode)(a,l.PATTERN)&&(n=!0)}),e&&!n&&i.push({message:`Warning: No LINE_BREAKS Found.\n\tThis Lexer has been defined to track line and column information,\n\tBut none of the Token Types can be identified as matching a line terminator.\n\tSee https://chevrotain.io/docs/guide/resolving_lexer_errors.html#LINE_BREAKS \n\tfor details.`,type:ir.LexerDefinitionErrorType.NO_LINE_BREAKS_FLAGS}),i}Ve.performWarningRuntimeChecks=OEe;function MEe(r){var e={},t=(0,xe.keys)(r);return(0,xe.forEach)(t,function(i){var n=r[i];if((0,xe.isArray)(n))e[i]=[];else throw Error(\"non exhaustive match\")}),e}Ve.cloneEmptyGroups=MEe;function Ov(r){var e=r.PATTERN;if((0,xe.isRegExp)(e))return!1;if((0,xe.isFunction)(e))return!0;if((0,xe.has)(e,\"exec\"))return!0;if((0,xe.isString)(e))return!1;throw Error(\"non exhaustive match\")}Ve.isCustomPattern=Ov;function ij(r){return(0,xe.isString)(r)&&r.length===1?r.charCodeAt(0):!1}Ve.isShortPattern=ij;Ve.LineTerminatorOptimizedTester={test:function(r){for(var e=r.length,t=this.lastIndex;t<e;t++){var i=r.charCodeAt(t);if(i===10)return this.lastIndex=t+1,!0;if(i===13)return r.charCodeAt(t+1)===10?this.lastIndex=t+2:this.lastIndex=t+1,!0}return!1},lastIndex:0};function nj(r,e){if((0,xe.has)(r,\"LINE_BREAKS\"))return!1;if((0,xe.isRegExp)(r.PATTERN)){try{(0,Zg.canMatchCharCode)(e,r.PATTERN)}catch(t){return{issue:ir.LexerDefinitionErrorType.IDENTIFY_TERMINATOR,errMsg:t.message}}return!1}else{if((0,xe.isString)(r.PATTERN))return!1;if(Ov(r))return{issue:ir.LexerDefinitionErrorType.CUSTOM_LINE_BREAK};throw Error(\"non exhaustive match\")}}function sj(r,e){if(e.issue===ir.LexerDefinitionErrorType.IDENTIFY_TERMINATOR)return`Warning: unable to identify line terminator usage in pattern.\n`+(\"\tThe problem is in the <\"+r.name+`> Token Type\n`)+(\"\t Root cause: \"+e.errMsg+`.\n`)+\"\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#IDENTIFY_TERMINATOR\";if(e.issue===ir.LexerDefinitionErrorType.CUSTOM_LINE_BREAK)return`Warning: A Custom Token Pattern should specify the <line_breaks> option.\n`+(\"\tThe problem is in the <\"+r.name+`> Token Type\n`)+\"\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_LINE_BREAK\";throw Error(\"non exhaustive match\")}Ve.buildLineBreakIssueMessage=sj;function oj(r){var e=(0,xe.map)(r,function(t){return(0,xe.isString)(t)&&t.length>0?t.charCodeAt(0):t});return e}function Fv(r,e,t){r[e]===void 0?r[e]=[t]:r[e].push(t)}Ve.minOptimizationVal=256;var ny=[];function Lv(r){return r<Ve.minOptimizationVal?r:ny[r]}Ve.charCodeToOptimizedIndex=Lv;function KEe(){if((0,xe.isEmpty)(ny)){ny=new Array(65536);for(var r=0;r<65536;r++)ny[r]=r>255?255+~~(r/255):r}}});var _g=w(Nt=>{\"use strict\";Object.defineProperty(Nt,\"__esModule\",{value:!0});Nt.isTokenType=Nt.hasExtendingTokensTypesMapProperty=Nt.hasExtendingTokensTypesProperty=Nt.hasCategoriesProperty=Nt.hasShortKeyProperty=Nt.singleAssignCategoriesToksMap=Nt.assignCategoriesMapProp=Nt.assignCategoriesTokensProp=Nt.assignTokenDefaultProps=Nt.expandCategories=Nt.augmentTokenTypes=Nt.tokenIdxToClass=Nt.tokenShortNameIdx=Nt.tokenStructuredMatcherNoCategories=Nt.tokenStructuredMatcher=void 0;var Zr=Gt();function UEe(r,e){var t=r.tokenTypeIdx;return t===e.tokenTypeIdx?!0:e.isParent===!0&&e.categoryMatchesMap[t]===!0}Nt.tokenStructuredMatcher=UEe;function HEe(r,e){return r.tokenTypeIdx===e.tokenTypeIdx}Nt.tokenStructuredMatcherNoCategories=HEe;Nt.tokenShortNameIdx=1;Nt.tokenIdxToClass={};function GEe(r){var e=aj(r);Aj(e),cj(e),lj(e),(0,Zr.forEach)(e,function(t){t.isParent=t.categoryMatches.length>0})}Nt.augmentTokenTypes=GEe;function aj(r){for(var e=(0,Zr.cloneArr)(r),t=r,i=!0;i;){t=(0,Zr.compact)((0,Zr.flatten)((0,Zr.map)(t,function(s){return s.CATEGORIES})));var n=(0,Zr.difference)(t,e);e=e.concat(n),(0,Zr.isEmpty)(n)?i=!1:t=n}return e}Nt.expandCategories=aj;function Aj(r){(0,Zr.forEach)(r,function(e){uj(e)||(Nt.tokenIdxToClass[Nt.tokenShortNameIdx]=e,e.tokenTypeIdx=Nt.tokenShortNameIdx++),Mv(e)&&!(0,Zr.isArray)(e.CATEGORIES)&&(e.CATEGORIES=[e.CATEGORIES]),Mv(e)||(e.CATEGORIES=[]),gj(e)||(e.categoryMatches=[]),fj(e)||(e.categoryMatchesMap={})})}Nt.assignTokenDefaultProps=Aj;function lj(r){(0,Zr.forEach)(r,function(e){e.categoryMatches=[],(0,Zr.forEach)(e.categoryMatchesMap,function(t,i){e.categoryMatches.push(Nt.tokenIdxToClass[i].tokenTypeIdx)})})}Nt.assignCategoriesTokensProp=lj;function cj(r){(0,Zr.forEach)(r,function(e){Kv([],e)})}Nt.assignCategoriesMapProp=cj;function Kv(r,e){(0,Zr.forEach)(r,function(t){e.categoryMatchesMap[t.tokenTypeIdx]=!0}),(0,Zr.forEach)(e.CATEGORIES,function(t){var i=r.concat(e);(0,Zr.contains)(i,t)||Kv(i,t)})}Nt.singleAssignCategoriesToksMap=Kv;function uj(r){return(0,Zr.has)(r,\"tokenTypeIdx\")}Nt.hasShortKeyProperty=uj;function Mv(r){return(0,Zr.has)(r,\"CATEGORIES\")}Nt.hasCategoriesProperty=Mv;function gj(r){return(0,Zr.has)(r,\"categoryMatches\")}Nt.hasExtendingTokensTypesProperty=gj;function fj(r){return(0,Zr.has)(r,\"categoryMatchesMap\")}Nt.hasExtendingTokensTypesMapProperty=fj;function YEe(r){return(0,Zr.has)(r,\"tokenTypeIdx\")}Nt.isTokenType=YEe});var Uv=w(sy=>{\"use strict\";Object.defineProperty(sy,\"__esModule\",{value:!0});sy.defaultLexerErrorProvider=void 0;sy.defaultLexerErrorProvider={buildUnableToPopLexerModeMessage:function(r){return\"Unable to pop Lexer Mode after encountering Token ->\"+r.image+\"<- The Mode Stack is empty\"},buildUnexpectedCharactersMessage:function(r,e,t,i,n){return\"unexpected character: ->\"+r.charAt(e)+\"<- at offset: \"+e+\",\"+(\" skipped \"+t+\" characters.\")}}});var Bd=w(Cc=>{\"use strict\";Object.defineProperty(Cc,\"__esModule\",{value:!0});Cc.Lexer=Cc.LexerDefinitionErrorType=void 0;var _s=Rv(),nr=Gt(),jEe=_g(),qEe=Uv(),JEe=ty(),WEe;(function(r){r[r.MISSING_PATTERN=0]=\"MISSING_PATTERN\",r[r.INVALID_PATTERN=1]=\"INVALID_PATTERN\",r[r.EOI_ANCHOR_FOUND=2]=\"EOI_ANCHOR_FOUND\",r[r.UNSUPPORTED_FLAGS_FOUND=3]=\"UNSUPPORTED_FLAGS_FOUND\",r[r.DUPLICATE_PATTERNS_FOUND=4]=\"DUPLICATE_PATTERNS_FOUND\",r[r.INVALID_GROUP_TYPE_FOUND=5]=\"INVALID_GROUP_TYPE_FOUND\",r[r.PUSH_MODE_DOES_NOT_EXIST=6]=\"PUSH_MODE_DOES_NOT_EXIST\",r[r.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE=7]=\"MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE\",r[r.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY=8]=\"MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY\",r[r.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST=9]=\"MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST\",r[r.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED=10]=\"LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED\",r[r.SOI_ANCHOR_FOUND=11]=\"SOI_ANCHOR_FOUND\",r[r.EMPTY_MATCH_PATTERN=12]=\"EMPTY_MATCH_PATTERN\",r[r.NO_LINE_BREAKS_FLAGS=13]=\"NO_LINE_BREAKS_FLAGS\",r[r.UNREACHABLE_PATTERN=14]=\"UNREACHABLE_PATTERN\",r[r.IDENTIFY_TERMINATOR=15]=\"IDENTIFY_TERMINATOR\",r[r.CUSTOM_LINE_BREAK=16]=\"CUSTOM_LINE_BREAK\"})(WEe=Cc.LexerDefinitionErrorType||(Cc.LexerDefinitionErrorType={}));var Qd={deferDefinitionErrorsHandling:!1,positionTracking:\"full\",lineTerminatorsPattern:/\\n|\\r\\n?/g,lineTerminatorCharacters:[`\n`,\"\\r\"],ensureOptimizations:!1,safeMode:!1,errorMessageProvider:qEe.defaultLexerErrorProvider,traceInitPerf:!1,skipValidations:!1};Object.freeze(Qd);var zEe=function(){function r(e,t){var i=this;if(t===void 0&&(t=Qd),this.lexerDefinition=e,this.lexerDefinitionErrors=[],this.lexerDefinitionWarning=[],this.patternIdxToConfig={},this.charCodeToPatternIdxToConfig={},this.modes=[],this.emptyGroups={},this.config=void 0,this.trackStartLines=!0,this.trackEndLines=!0,this.hasCustom=!1,this.canModeBeOptimized={},typeof t==\"boolean\")throw Error(`The second argument to the Lexer constructor is now an ILexerConfig Object.\na boolean 2nd argument is no longer supported`);this.config=(0,nr.merge)(Qd,t);var n=this.config.traceInitPerf;n===!0?(this.traceInitMaxIdent=1/0,this.traceInitPerf=!0):typeof n==\"number\"&&(this.traceInitMaxIdent=n,this.traceInitPerf=!0),this.traceInitIndent=-1,this.TRACE_INIT(\"Lexer Constructor\",function(){var s,o=!0;i.TRACE_INIT(\"Lexer Config handling\",function(){if(i.config.lineTerminatorsPattern===Qd.lineTerminatorsPattern)i.config.lineTerminatorsPattern=_s.LineTerminatorOptimizedTester;else if(i.config.lineTerminatorCharacters===Qd.lineTerminatorCharacters)throw Error(`Error: Missing <lineTerminatorCharacters> property on the Lexer config.\n\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#MISSING_LINE_TERM_CHARS`);if(t.safeMode&&t.ensureOptimizations)throw Error('\"safeMode\" and \"ensureOptimizations\" flags are mutually exclusive.');i.trackStartLines=/full|onlyStart/i.test(i.config.positionTracking),i.trackEndLines=/full/i.test(i.config.positionTracking),(0,nr.isArray)(e)?(s={modes:{}},s.modes[_s.DEFAULT_MODE]=(0,nr.cloneArr)(e),s[_s.DEFAULT_MODE]=_s.DEFAULT_MODE):(o=!1,s=(0,nr.cloneObj)(e))}),i.config.skipValidations===!1&&(i.TRACE_INIT(\"performRuntimeChecks\",function(){i.lexerDefinitionErrors=i.lexerDefinitionErrors.concat((0,_s.performRuntimeChecks)(s,i.trackStartLines,i.config.lineTerminatorCharacters))}),i.TRACE_INIT(\"performWarningRuntimeChecks\",function(){i.lexerDefinitionWarning=i.lexerDefinitionWarning.concat((0,_s.performWarningRuntimeChecks)(s,i.trackStartLines,i.config.lineTerminatorCharacters))})),s.modes=s.modes?s.modes:{},(0,nr.forEach)(s.modes,function(u,g){s.modes[g]=(0,nr.reject)(u,function(f){return(0,nr.isUndefined)(f)})});var a=(0,nr.keys)(s.modes);if((0,nr.forEach)(s.modes,function(u,g){i.TRACE_INIT(\"Mode: <\"+g+\"> processing\",function(){if(i.modes.push(g),i.config.skipValidations===!1&&i.TRACE_INIT(\"validatePatterns\",function(){i.lexerDefinitionErrors=i.lexerDefinitionErrors.concat((0,_s.validatePatterns)(u,a))}),(0,nr.isEmpty)(i.lexerDefinitionErrors)){(0,jEe.augmentTokenTypes)(u);var f;i.TRACE_INIT(\"analyzeTokenTypes\",function(){f=(0,_s.analyzeTokenTypes)(u,{lineTerminatorCharacters:i.config.lineTerminatorCharacters,positionTracking:t.positionTracking,ensureOptimizations:t.ensureOptimizations,safeMode:t.safeMode,tracer:i.TRACE_INIT.bind(i)})}),i.patternIdxToConfig[g]=f.patternIdxToConfig,i.charCodeToPatternIdxToConfig[g]=f.charCodeToPatternIdxToConfig,i.emptyGroups=(0,nr.merge)(i.emptyGroups,f.emptyGroups),i.hasCustom=f.hasCustom||i.hasCustom,i.canModeBeOptimized[g]=f.canBeOptimized}})}),i.defaultMode=s.defaultMode,!(0,nr.isEmpty)(i.lexerDefinitionErrors)&&!i.config.deferDefinitionErrorsHandling){var l=(0,nr.map)(i.lexerDefinitionErrors,function(u){return u.message}),c=l.join(`-----------------------\n`);throw new Error(`Errors detected in definition of Lexer:\n`+c)}(0,nr.forEach)(i.lexerDefinitionWarning,function(u){(0,nr.PRINT_WARNING)(u.message)}),i.TRACE_INIT(\"Choosing sub-methods implementations\",function(){if(_s.SUPPORT_STICKY?(i.chopInput=nr.IDENTITY,i.match=i.matchWithTest):(i.updateLastIndex=nr.NOOP,i.match=i.matchWithExec),o&&(i.handleModes=nr.NOOP),i.trackStartLines===!1&&(i.computeNewColumn=nr.IDENTITY),i.trackEndLines===!1&&(i.updateTokenEndLineColumnLocation=nr.NOOP),/full/i.test(i.config.positionTracking))i.createTokenInstance=i.createFullToken;else if(/onlyStart/i.test(i.config.positionTracking))i.createTokenInstance=i.createStartOnlyToken;else if(/onlyOffset/i.test(i.config.positionTracking))i.createTokenInstance=i.createOffsetOnlyToken;else throw Error('Invalid <positionTracking> config option: \"'+i.config.positionTracking+'\"');i.hasCustom?(i.addToken=i.addTokenUsingPush,i.handlePayload=i.handlePayloadWithCustom):(i.addToken=i.addTokenUsingMemberAccess,i.handlePayload=i.handlePayloadNoCustom)}),i.TRACE_INIT(\"Failed Optimization Warnings\",function(){var u=(0,nr.reduce)(i.canModeBeOptimized,function(g,f,h){return f===!1&&g.push(h),g},[]);if(t.ensureOptimizations&&!(0,nr.isEmpty)(u))throw Error(\"Lexer Modes: < \"+u.join(\", \")+` > cannot be optimized.\n\t Disable the \"ensureOptimizations\" lexer config flag to silently ignore this and run the lexer in an un-optimized mode.\n\t Or inspect the console log for details on how to resolve these issues.`)}),i.TRACE_INIT(\"clearRegExpParserCache\",function(){(0,JEe.clearRegExpParserCache)()}),i.TRACE_INIT(\"toFastProperties\",function(){(0,nr.toFastProperties)(i)})})}return r.prototype.tokenize=function(e,t){if(t===void 0&&(t=this.defaultMode),!(0,nr.isEmpty)(this.lexerDefinitionErrors)){var i=(0,nr.map)(this.lexerDefinitionErrors,function(o){return o.message}),n=i.join(`-----------------------\n`);throw new Error(`Unable to Tokenize because Errors detected in definition of Lexer:\n`+n)}var s=this.tokenizeInternal(e,t);return s},r.prototype.tokenizeInternal=function(e,t){var i=this,n,s,o,a,l,c,u,g,f,h,p,C,y,B,v,D,T=e,H=T.length,j=0,$=0,V=this.hasCustom?0:Math.floor(e.length/10),W=new Array(V),_=[],A=this.trackStartLines?1:void 0,Ae=this.trackStartLines?1:void 0,ge=(0,_s.cloneEmptyGroups)(this.emptyGroups),re=this.trackStartLines,O=this.config.lineTerminatorsPattern,F=0,ue=[],pe=[],ke=[],Fe=[];Object.freeze(Fe);var Ne=void 0;function oe(){return ue}function le(pr){var Ii=(0,_s.charCodeToOptimizedIndex)(pr),rs=pe[Ii];return rs===void 0?Fe:rs}var Be=function(pr){if(ke.length===1&&pr.tokenType.PUSH_MODE===void 0){var Ii=i.config.errorMessageProvider.buildUnableToPopLexerModeMessage(pr);_.push({offset:pr.startOffset,line:pr.startLine!==void 0?pr.startLine:void 0,column:pr.startColumn!==void 0?pr.startColumn:void 0,length:pr.image.length,message:Ii})}else{ke.pop();var rs=(0,nr.last)(ke);ue=i.patternIdxToConfig[rs],pe=i.charCodeToPatternIdxToConfig[rs],F=ue.length;var fa=i.canModeBeOptimized[rs]&&i.config.safeMode===!1;pe&&fa?Ne=le:Ne=oe}};function fe(pr){ke.push(pr),pe=this.charCodeToPatternIdxToConfig[pr],ue=this.patternIdxToConfig[pr],F=ue.length,F=ue.length;var Ii=this.canModeBeOptimized[pr]&&this.config.safeMode===!1;pe&&Ii?Ne=le:Ne=oe}fe.call(this,t);for(var ae;j<H;){c=null;var qe=T.charCodeAt(j),ne=Ne(qe),Y=ne.length;for(n=0;n<Y;n++){ae=ne[n];var he=ae.pattern;u=null;var ie=ae.short;if(ie!==!1?qe===ie&&(c=he):ae.isCustom===!0?(D=he.exec(T,j,W,ge),D!==null?(c=D[0],D.payload!==void 0&&(u=D.payload)):c=null):(this.updateLastIndex(he,j),c=this.match(he,e,j)),c!==null){if(l=ae.longerAlt,l!==void 0){var de=l.length;for(o=0;o<de;o++){var _e=ue[l[o]],Pt=_e.pattern;if(g=null,_e.isCustom===!0?(D=Pt.exec(T,j,W,ge),D!==null?(a=D[0],D.payload!==void 0&&(g=D.payload)):a=null):(this.updateLastIndex(Pt,j),a=this.match(Pt,e,j)),a&&a.length>c.length){c=a,u=g,ae=_e;break}}}break}}if(c!==null){if(f=c.length,h=ae.group,h!==void 0&&(p=ae.tokenTypeIdx,C=this.createTokenInstance(c,j,p,ae.tokenType,A,Ae,f),this.handlePayload(C,u),h===!1?$=this.addToken(W,$,C):ge[h].push(C)),e=this.chopInput(e,f),j=j+f,Ae=this.computeNewColumn(Ae,f),re===!0&&ae.canLineTerminator===!0){var It=0,Or=void 0,ii=void 0;O.lastIndex=0;do Or=O.test(c),Or===!0&&(ii=O.lastIndex-1,It++);while(Or===!0);It!==0&&(A=A+It,Ae=f-ii,this.updateTokenEndLineColumnLocation(C,h,ii,It,A,Ae,f))}this.handleModes(ae,Be,fe,C)}else{for(var gi=j,hr=A,fi=Ae,ni=!1;!ni&&j<H;)for(B=T.charCodeAt(j),e=this.chopInput(e,1),j++,s=0;s<F;s++){var Ks=ue[s],he=Ks.pattern,ie=Ks.short;if(ie!==!1?T.charCodeAt(j)===ie&&(ni=!0):Ks.isCustom===!0?ni=he.exec(T,j,W,ge)!==null:(this.updateLastIndex(he,j),ni=he.exec(e)!==null),ni===!0)break}y=j-gi,v=this.config.errorMessageProvider.buildUnexpectedCharactersMessage(T,gi,y,hr,fi),_.push({offset:gi,line:hr,column:fi,length:y,message:v})}}return this.hasCustom||(W.length=$),{tokens:W,groups:ge,errors:_}},r.prototype.handleModes=function(e,t,i,n){if(e.pop===!0){var s=e.push;t(n),s!==void 0&&i.call(this,s)}else e.push!==void 0&&i.call(this,e.push)},r.prototype.chopInput=function(e,t){return e.substring(t)},r.prototype.updateLastIndex=function(e,t){e.lastIndex=t},r.prototype.updateTokenEndLineColumnLocation=function(e,t,i,n,s,o,a){var l,c;t!==void 0&&(l=i===a-1,c=l?-1:0,n===1&&l===!0||(e.endLine=s+c,e.endColumn=o-1+-c))},r.prototype.computeNewColumn=function(e,t){return e+t},r.prototype.createTokenInstance=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return null},r.prototype.createOffsetOnlyToken=function(e,t,i,n){return{image:e,startOffset:t,tokenTypeIdx:i,tokenType:n}},r.prototype.createStartOnlyToken=function(e,t,i,n,s,o){return{image:e,startOffset:t,startLine:s,startColumn:o,tokenTypeIdx:i,tokenType:n}},r.prototype.createFullToken=function(e,t,i,n,s,o,a){return{image:e,startOffset:t,endOffset:t+a-1,startLine:s,endLine:s,startColumn:o,endColumn:o+a-1,tokenTypeIdx:i,tokenType:n}},r.prototype.addToken=function(e,t,i){return 666},r.prototype.addTokenUsingPush=function(e,t,i){return e.push(i),t},r.prototype.addTokenUsingMemberAccess=function(e,t,i){return e[t]=i,t++,t},r.prototype.handlePayload=function(e,t){},r.prototype.handlePayloadNoCustom=function(e,t){},r.prototype.handlePayloadWithCustom=function(e,t){t!==null&&(e.payload=t)},r.prototype.match=function(e,t,i){return null},r.prototype.matchWithTest=function(e,t,i){var n=e.test(t);return n===!0?t.substring(i,e.lastIndex):null},r.prototype.matchWithExec=function(e,t){var i=e.exec(t);return i!==null?i[0]:i},r.prototype.TRACE_INIT=function(e,t){if(this.traceInitPerf===!0){this.traceInitIndent++;var i=new Array(this.traceInitIndent+1).join(\"\t\");this.traceInitIndent<this.traceInitMaxIdent&&console.log(i+\"--> <\"+e+\">\");var n=(0,nr.timer)(t),s=n.time,o=n.value,a=s>10?console.warn:console.log;return this.traceInitIndent<this.traceInitMaxIdent&&a(i+\"<-- <\"+e+\"> time: \"+s+\"ms\"),this.traceInitIndent--,o}else return t()},r.SKIPPED=\"This marks a skipped Token pattern, this means each token identified by it willbe consumed and then thrown into oblivion, this can be used to for example to completely ignore whitespace.\",r.NA=/NOT_APPLICABLE/,r}();Cc.Lexer=zEe});var LA=w(bi=>{\"use strict\";Object.defineProperty(bi,\"__esModule\",{value:!0});bi.tokenMatcher=bi.createTokenInstance=bi.EOF=bi.createToken=bi.hasTokenLabel=bi.tokenName=bi.tokenLabel=void 0;var $s=Gt(),VEe=Bd(),Hv=_g();function XEe(r){return wj(r)?r.LABEL:r.name}bi.tokenLabel=XEe;function ZEe(r){return r.name}bi.tokenName=ZEe;function wj(r){return(0,$s.isString)(r.LABEL)&&r.LABEL!==\"\"}bi.hasTokenLabel=wj;var _Ee=\"parent\",hj=\"categories\",pj=\"label\",dj=\"group\",Cj=\"push_mode\",mj=\"pop_mode\",Ej=\"longer_alt\",Ij=\"line_breaks\",yj=\"start_chars_hint\";function Bj(r){return $Ee(r)}bi.createToken=Bj;function $Ee(r){var e=r.pattern,t={};if(t.name=r.name,(0,$s.isUndefined)(e)||(t.PATTERN=e),(0,$s.has)(r,_Ee))throw`The parent property is no longer supported.\nSee: https://github.com/chevrotain/chevrotain/issues/564#issuecomment-349062346 for details.`;return(0,$s.has)(r,hj)&&(t.CATEGORIES=r[hj]),(0,Hv.augmentTokenTypes)([t]),(0,$s.has)(r,pj)&&(t.LABEL=r[pj]),(0,$s.has)(r,dj)&&(t.GROUP=r[dj]),(0,$s.has)(r,mj)&&(t.POP_MODE=r[mj]),(0,$s.has)(r,Cj)&&(t.PUSH_MODE=r[Cj]),(0,$s.has)(r,Ej)&&(t.LONGER_ALT=r[Ej]),(0,$s.has)(r,Ij)&&(t.LINE_BREAKS=r[Ij]),(0,$s.has)(r,yj)&&(t.START_CHARS_HINT=r[yj]),t}bi.EOF=Bj({name:\"EOF\",pattern:VEe.Lexer.NA});(0,Hv.augmentTokenTypes)([bi.EOF]);function eIe(r,e,t,i,n,s,o,a){return{image:e,startOffset:t,endOffset:i,startLine:n,endLine:s,startColumn:o,endColumn:a,tokenTypeIdx:r.tokenTypeIdx,tokenType:r}}bi.createTokenInstance=eIe;function tIe(r,e){return(0,Hv.tokenStructuredMatcher)(r,e)}bi.tokenMatcher=tIe});var mn=w(zt=>{\"use strict\";var Pa=zt&&zt.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!=\"function\"&&t!==null)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(zt,\"__esModule\",{value:!0});zt.serializeProduction=zt.serializeGrammar=zt.Terminal=zt.Alternation=zt.RepetitionWithSeparator=zt.Repetition=zt.RepetitionMandatoryWithSeparator=zt.RepetitionMandatory=zt.Option=zt.Alternative=zt.Rule=zt.NonTerminal=zt.AbstractProduction=void 0;var Ar=Gt(),rIe=LA(),ko=function(){function r(e){this._definition=e}return Object.defineProperty(r.prototype,\"definition\",{get:function(){return this._definition},set:function(e){this._definition=e},enumerable:!1,configurable:!0}),r.prototype.accept=function(e){e.visit(this),(0,Ar.forEach)(this.definition,function(t){t.accept(e)})},r}();zt.AbstractProduction=ko;var Qj=function(r){Pa(e,r);function e(t){var i=r.call(this,[])||this;return i.idx=1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return Object.defineProperty(e.prototype,\"definition\",{get:function(){return this.referencedRule!==void 0?this.referencedRule.definition:[]},set:function(t){},enumerable:!1,configurable:!0}),e.prototype.accept=function(t){t.visit(this)},e}(ko);zt.NonTerminal=Qj;var bj=function(r){Pa(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.orgText=\"\",(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return e}(ko);zt.Rule=bj;var Sj=function(r){Pa(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.ignoreAmbiguities=!1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return e}(ko);zt.Alternative=Sj;var vj=function(r){Pa(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return e}(ko);zt.Option=vj;var xj=function(r){Pa(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return e}(ko);zt.RepetitionMandatory=xj;var Pj=function(r){Pa(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return e}(ko);zt.RepetitionMandatoryWithSeparator=Pj;var Dj=function(r){Pa(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return e}(ko);zt.Repetition=Dj;var kj=function(r){Pa(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return e}(ko);zt.RepetitionWithSeparator=kj;var Rj=function(r){Pa(e,r);function e(t){var i=r.call(this,t.definition)||this;return i.idx=1,i.ignoreAmbiguities=!1,i.hasPredicates=!1,(0,Ar.assign)(i,(0,Ar.pick)(t,function(n){return n!==void 0})),i}return Object.defineProperty(e.prototype,\"definition\",{get:function(){return this._definition},set:function(t){this._definition=t},enumerable:!1,configurable:!0}),e}(ko);zt.Alternation=Rj;var oy=function(){function r(e){this.idx=1,(0,Ar.assign)(this,(0,Ar.pick)(e,function(t){return t!==void 0}))}return r.prototype.accept=function(e){e.visit(this)},r}();zt.Terminal=oy;function iIe(r){return(0,Ar.map)(r,bd)}zt.serializeGrammar=iIe;function bd(r){function e(s){return(0,Ar.map)(s,bd)}if(r instanceof Qj){var t={type:\"NonTerminal\",name:r.nonTerminalName,idx:r.idx};return(0,Ar.isString)(r.label)&&(t.label=r.label),t}else{if(r instanceof Sj)return{type:\"Alternative\",definition:e(r.definition)};if(r instanceof vj)return{type:\"Option\",idx:r.idx,definition:e(r.definition)};if(r instanceof xj)return{type:\"RepetitionMandatory\",idx:r.idx,definition:e(r.definition)};if(r instanceof Pj)return{type:\"RepetitionMandatoryWithSeparator\",idx:r.idx,separator:bd(new oy({terminalType:r.separator})),definition:e(r.definition)};if(r instanceof kj)return{type:\"RepetitionWithSeparator\",idx:r.idx,separator:bd(new oy({terminalType:r.separator})),definition:e(r.definition)};if(r instanceof Dj)return{type:\"Repetition\",idx:r.idx,definition:e(r.definition)};if(r instanceof Rj)return{type:\"Alternation\",idx:r.idx,definition:e(r.definition)};if(r instanceof oy){var i={type:\"Terminal\",name:r.terminalType.name,label:(0,rIe.tokenLabel)(r.terminalType),idx:r.idx};(0,Ar.isString)(r.label)&&(i.terminalLabel=r.label);var n=r.terminalType.PATTERN;return r.terminalType.PATTERN&&(i.pattern=(0,Ar.isRegExp)(n)?n.source:n),i}else{if(r instanceof bj)return{type:\"Rule\",name:r.name,orgText:r.orgText,definition:e(r.definition)};throw Error(\"non exhaustive match\")}}}zt.serializeProduction=bd});var Ay=w(ay=>{\"use strict\";Object.defineProperty(ay,\"__esModule\",{value:!0});ay.RestWalker=void 0;var Gv=Gt(),En=mn(),nIe=function(){function r(){}return r.prototype.walk=function(e,t){var i=this;t===void 0&&(t=[]),(0,Gv.forEach)(e.definition,function(n,s){var o=(0,Gv.drop)(e.definition,s+1);if(n instanceof En.NonTerminal)i.walkProdRef(n,o,t);else if(n instanceof En.Terminal)i.walkTerminal(n,o,t);else if(n instanceof En.Alternative)i.walkFlat(n,o,t);else if(n instanceof En.Option)i.walkOption(n,o,t);else if(n instanceof En.RepetitionMandatory)i.walkAtLeastOne(n,o,t);else if(n instanceof En.RepetitionMandatoryWithSeparator)i.walkAtLeastOneSep(n,o,t);else if(n instanceof En.RepetitionWithSeparator)i.walkManySep(n,o,t);else if(n instanceof En.Repetition)i.walkMany(n,o,t);else if(n instanceof En.Alternation)i.walkOr(n,o,t);else throw Error(\"non exhaustive match\")})},r.prototype.walkTerminal=function(e,t,i){},r.prototype.walkProdRef=function(e,t,i){},r.prototype.walkFlat=function(e,t,i){var n=t.concat(i);this.walk(e,n)},r.prototype.walkOption=function(e,t,i){var n=t.concat(i);this.walk(e,n)},r.prototype.walkAtLeastOne=function(e,t,i){var n=[new En.Option({definition:e.definition})].concat(t,i);this.walk(e,n)},r.prototype.walkAtLeastOneSep=function(e,t,i){var n=Fj(e,t,i);this.walk(e,n)},r.prototype.walkMany=function(e,t,i){var n=[new En.Option({definition:e.definition})].concat(t,i);this.walk(e,n)},r.prototype.walkManySep=function(e,t,i){var n=Fj(e,t,i);this.walk(e,n)},r.prototype.walkOr=function(e,t,i){var n=this,s=t.concat(i);(0,Gv.forEach)(e.definition,function(o){var a=new En.Alternative({definition:[o]});n.walk(a,s)})},r}();ay.RestWalker=nIe;function Fj(r,e,t){var i=[new En.Option({definition:[new En.Terminal({terminalType:r.separator})].concat(r.definition)})],n=i.concat(e,t);return n}});var $g=w(ly=>{\"use strict\";Object.defineProperty(ly,\"__esModule\",{value:!0});ly.GAstVisitor=void 0;var Ro=mn(),sIe=function(){function r(){}return r.prototype.visit=function(e){var t=e;switch(t.constructor){case Ro.NonTerminal:return this.visitNonTerminal(t);case Ro.Alternative:return this.visitAlternative(t);case Ro.Option:return this.visitOption(t);case Ro.RepetitionMandatory:return this.visitRepetitionMandatory(t);case Ro.RepetitionMandatoryWithSeparator:return this.visitRepetitionMandatoryWithSeparator(t);case Ro.RepetitionWithSeparator:return this.visitRepetitionWithSeparator(t);case Ro.Repetition:return this.visitRepetition(t);case Ro.Alternation:return this.visitAlternation(t);case Ro.Terminal:return this.visitTerminal(t);case Ro.Rule:return this.visitRule(t);default:throw Error(\"non exhaustive match\")}},r.prototype.visitNonTerminal=function(e){},r.prototype.visitAlternative=function(e){},r.prototype.visitOption=function(e){},r.prototype.visitRepetition=function(e){},r.prototype.visitRepetitionMandatory=function(e){},r.prototype.visitRepetitionMandatoryWithSeparator=function(e){},r.prototype.visitRepetitionWithSeparator=function(e){},r.prototype.visitAlternation=function(e){},r.prototype.visitTerminal=function(e){},r.prototype.visitRule=function(e){},r}();ly.GAstVisitor=sIe});var vd=w(Mi=>{\"use strict\";var oIe=Mi&&Mi.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!=\"function\"&&t!==null)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Mi,\"__esModule\",{value:!0});Mi.collectMethods=Mi.DslMethodsCollectorVisitor=Mi.getProductionDslName=Mi.isBranchingProd=Mi.isOptionalProd=Mi.isSequenceProd=void 0;var Sd=Gt(),Qr=mn(),aIe=$g();function AIe(r){return r instanceof Qr.Alternative||r instanceof Qr.Option||r instanceof Qr.Repetition||r instanceof Qr.RepetitionMandatory||r instanceof Qr.RepetitionMandatoryWithSeparator||r instanceof Qr.RepetitionWithSeparator||r instanceof Qr.Terminal||r instanceof Qr.Rule}Mi.isSequenceProd=AIe;function Yv(r,e){e===void 0&&(e=[]);var t=r instanceof Qr.Option||r instanceof Qr.Repetition||r instanceof Qr.RepetitionWithSeparator;return t?!0:r instanceof Qr.Alternation?(0,Sd.some)(r.definition,function(i){return Yv(i,e)}):r instanceof Qr.NonTerminal&&(0,Sd.contains)(e,r)?!1:r instanceof Qr.AbstractProduction?(r instanceof Qr.NonTerminal&&e.push(r),(0,Sd.every)(r.definition,function(i){return Yv(i,e)})):!1}Mi.isOptionalProd=Yv;function lIe(r){return r instanceof Qr.Alternation}Mi.isBranchingProd=lIe;function cIe(r){if(r instanceof Qr.NonTerminal)return\"SUBRULE\";if(r instanceof Qr.Option)return\"OPTION\";if(r instanceof Qr.Alternation)return\"OR\";if(r instanceof Qr.RepetitionMandatory)return\"AT_LEAST_ONE\";if(r instanceof Qr.RepetitionMandatoryWithSeparator)return\"AT_LEAST_ONE_SEP\";if(r instanceof Qr.RepetitionWithSeparator)return\"MANY_SEP\";if(r instanceof Qr.Repetition)return\"MANY\";if(r instanceof Qr.Terminal)return\"CONSUME\";throw Error(\"non exhaustive match\")}Mi.getProductionDslName=cIe;var Nj=function(r){oIe(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.separator=\"-\",t.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]},t}return e.prototype.reset=function(){this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}},e.prototype.visitTerminal=function(t){var i=t.terminalType.name+this.separator+\"Terminal\";(0,Sd.has)(this.dslMethods,i)||(this.dslMethods[i]=[]),this.dslMethods[i].push(t)},e.prototype.visitNonTerminal=function(t){var i=t.nonTerminalName+this.separator+\"Terminal\";(0,Sd.has)(this.dslMethods,i)||(this.dslMethods[i]=[]),this.dslMethods[i].push(t)},e.prototype.visitOption=function(t){this.dslMethods.option.push(t)},e.prototype.visitRepetitionWithSeparator=function(t){this.dslMethods.repetitionWithSeparator.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.dslMethods.repetitionMandatory.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.dslMethods.repetitionMandatoryWithSeparator.push(t)},e.prototype.visitRepetition=function(t){this.dslMethods.repetition.push(t)},e.prototype.visitAlternation=function(t){this.dslMethods.alternation.push(t)},e}(aIe.GAstVisitor);Mi.DslMethodsCollectorVisitor=Nj;var cy=new Nj;function uIe(r){cy.reset(),r.accept(cy);var e=cy.dslMethods;return cy.reset(),e}Mi.collectMethods=uIe});var qv=w(Fo=>{\"use strict\";Object.defineProperty(Fo,\"__esModule\",{value:!0});Fo.firstForTerminal=Fo.firstForBranching=Fo.firstForSequence=Fo.first=void 0;var uy=Gt(),Tj=mn(),jv=vd();function gy(r){if(r instanceof Tj.NonTerminal)return gy(r.referencedRule);if(r instanceof Tj.Terminal)return Mj(r);if((0,jv.isSequenceProd)(r))return Lj(r);if((0,jv.isBranchingProd)(r))return Oj(r);throw Error(\"non exhaustive match\")}Fo.first=gy;function Lj(r){for(var e=[],t=r.definition,i=0,n=t.length>i,s,o=!0;n&&o;)s=t[i],o=(0,jv.isOptionalProd)(s),e=e.concat(gy(s)),i=i+1,n=t.length>i;return(0,uy.uniq)(e)}Fo.firstForSequence=Lj;function Oj(r){var e=(0,uy.map)(r.definition,function(t){return gy(t)});return(0,uy.uniq)((0,uy.flatten)(e))}Fo.firstForBranching=Oj;function Mj(r){return[r.terminalType]}Fo.firstForTerminal=Mj});var Jv=w(fy=>{\"use strict\";Object.defineProperty(fy,\"__esModule\",{value:!0});fy.IN=void 0;fy.IN=\"_~IN~_\"});var Yj=w(fs=>{\"use strict\";var gIe=fs&&fs.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!=\"function\"&&t!==null)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(fs,\"__esModule\",{value:!0});fs.buildInProdFollowPrefix=fs.buildBetweenProdsFollowPrefix=fs.computeAllProdsFollows=fs.ResyncFollowsWalker=void 0;var fIe=Ay(),hIe=qv(),Kj=Gt(),Uj=Jv(),pIe=mn(),Hj=function(r){gIe(e,r);function e(t){var i=r.call(this)||this;return i.topProd=t,i.follows={},i}return e.prototype.startWalking=function(){return this.walk(this.topProd),this.follows},e.prototype.walkTerminal=function(t,i,n){},e.prototype.walkProdRef=function(t,i,n){var s=Gj(t.referencedRule,t.idx)+this.topProd.name,o=i.concat(n),a=new pIe.Alternative({definition:o}),l=(0,hIe.first)(a);this.follows[s]=l},e}(fIe.RestWalker);fs.ResyncFollowsWalker=Hj;function dIe(r){var e={};return(0,Kj.forEach)(r,function(t){var i=new Hj(t).startWalking();(0,Kj.assign)(e,i)}),e}fs.computeAllProdsFollows=dIe;function Gj(r,e){return r.name+e+Uj.IN}fs.buildBetweenProdsFollowPrefix=Gj;function CIe(r){var e=r.terminalType.name;return e+r.idx+Uj.IN}fs.buildInProdFollowPrefix=CIe});var xd=w(Da=>{\"use strict\";Object.defineProperty(Da,\"__esModule\",{value:!0});Da.defaultGrammarValidatorErrorProvider=Da.defaultGrammarResolverErrorProvider=Da.defaultParserErrorProvider=void 0;var ef=LA(),mIe=Gt(),eo=Gt(),Wv=mn(),jj=vd();Da.defaultParserErrorProvider={buildMismatchTokenMessage:function(r){var e=r.expected,t=r.actual,i=r.previous,n=r.ruleName,s=(0,ef.hasTokenLabel)(e),o=s?\"--> \"+(0,ef.tokenLabel)(e)+\" <--\":\"token of type --> \"+e.name+\" <--\",a=\"Expecting \"+o+\" but found --> '\"+t.image+\"' <--\";return a},buildNotAllInputParsedMessage:function(r){var e=r.firstRedundant,t=r.ruleName;return\"Redundant input, expecting EOF but found: \"+e.image},buildNoViableAltMessage:function(r){var e=r.expectedPathsPerAlt,t=r.actual,i=r.previous,n=r.customUserDescription,s=r.ruleName,o=\"Expecting: \",a=(0,eo.first)(t).image,l=`\nbut found: '`+a+\"'\";if(n)return o+n+l;var c=(0,eo.reduce)(e,function(h,p){return h.concat(p)},[]),u=(0,eo.map)(c,function(h){return\"[\"+(0,eo.map)(h,function(p){return(0,ef.tokenLabel)(p)}).join(\", \")+\"]\"}),g=(0,eo.map)(u,function(h,p){return\"  \"+(p+1)+\". \"+h}),f=`one of these possible Token sequences:\n`+g.join(`\n`);return o+f+l},buildEarlyExitMessage:function(r){var e=r.expectedIterationPaths,t=r.actual,i=r.customUserDescription,n=r.ruleName,s=\"Expecting: \",o=(0,eo.first)(t).image,a=`\nbut found: '`+o+\"'\";if(i)return s+i+a;var l=(0,eo.map)(e,function(u){return\"[\"+(0,eo.map)(u,function(g){return(0,ef.tokenLabel)(g)}).join(\",\")+\"]\"}),c=`expecting at least one iteration which starts with one of these possible Token sequences::\n  `+(\"<\"+l.join(\" ,\")+\">\");return s+c+a}};Object.freeze(Da.defaultParserErrorProvider);Da.defaultGrammarResolverErrorProvider={buildRuleNotFoundError:function(r,e){var t=\"Invalid grammar, reference to a rule which is not defined: ->\"+e.nonTerminalName+`<-\ninside top level rule: ->`+r.name+\"<-\";return t}};Da.defaultGrammarValidatorErrorProvider={buildDuplicateFoundError:function(r,e){function t(u){return u instanceof Wv.Terminal?u.terminalType.name:u instanceof Wv.NonTerminal?u.nonTerminalName:\"\"}var i=r.name,n=(0,eo.first)(e),s=n.idx,o=(0,jj.getProductionDslName)(n),a=t(n),l=s>0,c=\"->\"+o+(l?s:\"\")+\"<- \"+(a?\"with argument: ->\"+a+\"<-\":\"\")+`\n                  appears more than once (`+e.length+\" times) in the top level rule: ->\"+i+`<-.                  \n                  For further details see: https://chevrotain.io/docs/FAQ.html#NUMERICAL_SUFFIXES \n                  `;return c=c.replace(/[ \\t]+/g,\" \"),c=c.replace(/\\s\\s+/g,`\n`),c},buildNamespaceConflictError:function(r){var e=`Namespace conflict found in grammar.\n`+(\"The grammar has both a Terminal(Token) and a Non-Terminal(Rule) named: <\"+r.name+`>.\n`)+`To resolve this make sure each Terminal and Non-Terminal names are unique\nThis is easy to accomplish by using the convention that Terminal names start with an uppercase letter\nand Non-Terminal names start with a lower case letter.`;return e},buildAlternationPrefixAmbiguityError:function(r){var e=(0,eo.map)(r.prefixPath,function(n){return(0,ef.tokenLabel)(n)}).join(\", \"),t=r.alternation.idx===0?\"\":r.alternation.idx,i=\"Ambiguous alternatives: <\"+r.ambiguityIndices.join(\" ,\")+`> due to common lookahead prefix\n`+(\"in <OR\"+t+\"> inside <\"+r.topLevelRule.name+`> Rule,\n`)+(\"<\"+e+`> may appears as a prefix path in all these alternatives.\n`)+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#COMMON_PREFIX\nFor Further details.`;return i},buildAlternationAmbiguityError:function(r){var e=(0,eo.map)(r.prefixPath,function(n){return(0,ef.tokenLabel)(n)}).join(\", \"),t=r.alternation.idx===0?\"\":r.alternation.idx,i=\"Ambiguous Alternatives Detected: <\"+r.ambiguityIndices.join(\" ,\")+\"> in <OR\"+t+\">\"+(\" inside <\"+r.topLevelRule.name+`> Rule,\n`)+(\"<\"+e+`> may appears as a prefix path in all these alternatives.\n`);return i=i+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES\nFor Further details.`,i},buildEmptyRepetitionError:function(r){var e=(0,jj.getProductionDslName)(r.repetition);r.repetition.idx!==0&&(e+=r.repetition.idx);var t=\"The repetition <\"+e+\"> within Rule <\"+r.topLevelRule.name+`> can never consume any tokens.\nThis could lead to an infinite loop.`;return t},buildTokenNameError:function(r){return\"deprecated\"},buildEmptyAlternationError:function(r){var e=\"Ambiguous empty alternative: <\"+(r.emptyChoiceIdx+1)+\">\"+(\" in <OR\"+r.alternation.idx+\"> inside <\"+r.topLevelRule.name+`> Rule.\n`)+\"Only the last alternative may be an empty alternative.\";return e},buildTooManyAlternativesError:function(r){var e=`An Alternation cannot have more than 256 alternatives:\n`+(\"<OR\"+r.alternation.idx+\"> inside <\"+r.topLevelRule.name+`> Rule.\n has `+(r.alternation.definition.length+1)+\" alternatives.\");return e},buildLeftRecursionError:function(r){var e=r.topLevelRule.name,t=mIe.map(r.leftRecursionPath,function(s){return s.name}),i=e+\" --> \"+t.concat([e]).join(\" --> \"),n=`Left Recursion found in grammar.\n`+(\"rule: <\"+e+`> can be invoked from itself (directly or indirectly)\n`)+(`without consuming any Tokens. The grammar path that causes this is: \n `+i+`\n`)+` To fix this refactor your grammar to remove the left recursion.\nsee: https://en.wikipedia.org/wiki/LL_parser#Left_Factoring.`;return n},buildInvalidRuleNameError:function(r){return\"deprecated\"},buildDuplicateRuleNameError:function(r){var e;r.topLevelRule instanceof Wv.Rule?e=r.topLevelRule.name:e=r.topLevelRule;var t=\"Duplicate definition, rule: ->\"+e+\"<- is already defined in the grammar: ->\"+r.grammarName+\"<-\";return t}}});var Wj=w(OA=>{\"use strict\";var EIe=OA&&OA.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!=\"function\"&&t!==null)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(OA,\"__esModule\",{value:!0});OA.GastRefResolverVisitor=OA.resolveGrammar=void 0;var IIe=jn(),qj=Gt(),yIe=$g();function wIe(r,e){var t=new Jj(r,e);return t.resolveRefs(),t.errors}OA.resolveGrammar=wIe;var Jj=function(r){EIe(e,r);function e(t,i){var n=r.call(this)||this;return n.nameToTopRule=t,n.errMsgProvider=i,n.errors=[],n}return e.prototype.resolveRefs=function(){var t=this;(0,qj.forEach)((0,qj.values)(this.nameToTopRule),function(i){t.currTopLevel=i,i.accept(t)})},e.prototype.visitNonTerminal=function(t){var i=this.nameToTopRule[t.nonTerminalName];if(i)t.referencedRule=i;else{var n=this.errMsgProvider.buildRuleNotFoundError(this.currTopLevel,t);this.errors.push({message:n,type:IIe.ParserDefinitionErrorType.UNRESOLVED_SUBRULE_REF,ruleName:this.currTopLevel.name,unresolvedRefName:t.nonTerminalName})}},e}(yIe.GAstVisitor);OA.GastRefResolverVisitor=Jj});var Dd=w(Nr=>{\"use strict\";var mc=Nr&&Nr.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!=\"function\"&&t!==null)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Nr,\"__esModule\",{value:!0});Nr.nextPossibleTokensAfter=Nr.possiblePathsFrom=Nr.NextTerminalAfterAtLeastOneSepWalker=Nr.NextTerminalAfterAtLeastOneWalker=Nr.NextTerminalAfterManySepWalker=Nr.NextTerminalAfterManyWalker=Nr.AbstractNextTerminalAfterProductionWalker=Nr.NextAfterTokenWalker=Nr.AbstractNextPossibleTokensWalker=void 0;var zj=Ay(),Kt=Gt(),BIe=qv(),kt=mn(),Vj=function(r){mc(e,r);function e(t,i){var n=r.call(this)||this;return n.topProd=t,n.path=i,n.possibleTokTypes=[],n.nextProductionName=\"\",n.nextProductionOccurrence=0,n.found=!1,n.isAtEndOfPath=!1,n}return e.prototype.startWalking=function(){if(this.found=!1,this.path.ruleStack[0]!==this.topProd.name)throw Error(\"The path does not start with the walker's top Rule!\");return this.ruleStack=(0,Kt.cloneArr)(this.path.ruleStack).reverse(),this.occurrenceStack=(0,Kt.cloneArr)(this.path.occurrenceStack).reverse(),this.ruleStack.pop(),this.occurrenceStack.pop(),this.updateExpectedNext(),this.walk(this.topProd),this.possibleTokTypes},e.prototype.walk=function(t,i){i===void 0&&(i=[]),this.found||r.prototype.walk.call(this,t,i)},e.prototype.walkProdRef=function(t,i,n){if(t.referencedRule.name===this.nextProductionName&&t.idx===this.nextProductionOccurrence){var s=i.concat(n);this.updateExpectedNext(),this.walk(t.referencedRule,s)}},e.prototype.updateExpectedNext=function(){(0,Kt.isEmpty)(this.ruleStack)?(this.nextProductionName=\"\",this.nextProductionOccurrence=0,this.isAtEndOfPath=!0):(this.nextProductionName=this.ruleStack.pop(),this.nextProductionOccurrence=this.occurrenceStack.pop())},e}(zj.RestWalker);Nr.AbstractNextPossibleTokensWalker=Vj;var QIe=function(r){mc(e,r);function e(t,i){var n=r.call(this,t,i)||this;return n.path=i,n.nextTerminalName=\"\",n.nextTerminalOccurrence=0,n.nextTerminalName=n.path.lastTok.name,n.nextTerminalOccurrence=n.path.lastTokOccurrence,n}return e.prototype.walkTerminal=function(t,i,n){if(this.isAtEndOfPath&&t.terminalType.name===this.nextTerminalName&&t.idx===this.nextTerminalOccurrence&&!this.found){var s=i.concat(n),o=new kt.Alternative({definition:s});this.possibleTokTypes=(0,BIe.first)(o),this.found=!0}},e}(Vj);Nr.NextAfterTokenWalker=QIe;var Pd=function(r){mc(e,r);function e(t,i){var n=r.call(this)||this;return n.topRule=t,n.occurrence=i,n.result={token:void 0,occurrence:void 0,isEndOfRule:void 0},n}return e.prototype.startWalking=function(){return this.walk(this.topRule),this.result},e}(zj.RestWalker);Nr.AbstractNextTerminalAfterProductionWalker=Pd;var bIe=function(r){mc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkMany=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Kt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof kt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkMany.call(this,t,i,n)},e}(Pd);Nr.NextTerminalAfterManyWalker=bIe;var SIe=function(r){mc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkManySep=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Kt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof kt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkManySep.call(this,t,i,n)},e}(Pd);Nr.NextTerminalAfterManySepWalker=SIe;var vIe=function(r){mc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkAtLeastOne=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Kt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof kt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkAtLeastOne.call(this,t,i,n)},e}(Pd);Nr.NextTerminalAfterAtLeastOneWalker=vIe;var xIe=function(r){mc(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.walkAtLeastOneSep=function(t,i,n){if(t.idx===this.occurrence){var s=(0,Kt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof kt.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else r.prototype.walkAtLeastOneSep.call(this,t,i,n)},e}(Pd);Nr.NextTerminalAfterAtLeastOneSepWalker=xIe;function Xj(r,e,t){t===void 0&&(t=[]),t=(0,Kt.cloneArr)(t);var i=[],n=0;function s(c){return c.concat((0,Kt.drop)(r,n+1))}function o(c){var u=Xj(s(c),e,t);return i.concat(u)}for(;t.length<e&&n<r.length;){var a=r[n];if(a instanceof kt.Alternative)return o(a.definition);if(a instanceof kt.NonTerminal)return o(a.definition);if(a instanceof kt.Option)i=o(a.definition);else if(a instanceof kt.RepetitionMandatory){var l=a.definition.concat([new kt.Repetition({definition:a.definition})]);return o(l)}else if(a instanceof kt.RepetitionMandatoryWithSeparator){var l=[new kt.Alternative({definition:a.definition}),new kt.Repetition({definition:[new kt.Terminal({terminalType:a.separator})].concat(a.definition)})];return o(l)}else if(a instanceof kt.RepetitionWithSeparator){var l=a.definition.concat([new kt.Repetition({definition:[new kt.Terminal({terminalType:a.separator})].concat(a.definition)})]);i=o(l)}else if(a instanceof kt.Repetition){var l=a.definition.concat([new kt.Repetition({definition:a.definition})]);i=o(l)}else{if(a instanceof kt.Alternation)return(0,Kt.forEach)(a.definition,function(c){(0,Kt.isEmpty)(c.definition)===!1&&(i=o(c.definition))}),i;if(a instanceof kt.Terminal)t.push(a.terminalType);else throw Error(\"non exhaustive match\")}n++}return i.push({partialPath:t,suffixDef:(0,Kt.drop)(r,n)}),i}Nr.possiblePathsFrom=Xj;function PIe(r,e,t,i){var n=\"EXIT_NONE_TERMINAL\",s=[n],o=\"EXIT_ALTERNATIVE\",a=!1,l=e.length,c=l-i-1,u=[],g=[];for(g.push({idx:-1,def:r,ruleStack:[],occurrenceStack:[]});!(0,Kt.isEmpty)(g);){var f=g.pop();if(f===o){a&&(0,Kt.last)(g).idx<=c&&g.pop();continue}var h=f.def,p=f.idx,C=f.ruleStack,y=f.occurrenceStack;if(!(0,Kt.isEmpty)(h)){var B=h[0];if(B===n){var v={idx:p,def:(0,Kt.drop)(h),ruleStack:(0,Kt.dropRight)(C),occurrenceStack:(0,Kt.dropRight)(y)};g.push(v)}else if(B instanceof kt.Terminal)if(p<l-1){var D=p+1,T=e[D];if(t(T,B.terminalType)){var v={idx:D,def:(0,Kt.drop)(h),ruleStack:C,occurrenceStack:y};g.push(v)}}else if(p===l-1)u.push({nextTokenType:B.terminalType,nextTokenOccurrence:B.idx,ruleStack:C,occurrenceStack:y}),a=!0;else throw Error(\"non exhaustive match\");else if(B instanceof kt.NonTerminal){var H=(0,Kt.cloneArr)(C);H.push(B.nonTerminalName);var j=(0,Kt.cloneArr)(y);j.push(B.idx);var v={idx:p,def:B.definition.concat(s,(0,Kt.drop)(h)),ruleStack:H,occurrenceStack:j};g.push(v)}else if(B instanceof kt.Option){var $={idx:p,def:(0,Kt.drop)(h),ruleStack:C,occurrenceStack:y};g.push($),g.push(o);var V={idx:p,def:B.definition.concat((0,Kt.drop)(h)),ruleStack:C,occurrenceStack:y};g.push(V)}else if(B instanceof kt.RepetitionMandatory){var W=new kt.Repetition({definition:B.definition,idx:B.idx}),_=B.definition.concat([W],(0,Kt.drop)(h)),v={idx:p,def:_,ruleStack:C,occurrenceStack:y};g.push(v)}else if(B instanceof kt.RepetitionMandatoryWithSeparator){var A=new kt.Terminal({terminalType:B.separator}),W=new kt.Repetition({definition:[A].concat(B.definition),idx:B.idx}),_=B.definition.concat([W],(0,Kt.drop)(h)),v={idx:p,def:_,ruleStack:C,occurrenceStack:y};g.push(v)}else if(B instanceof kt.RepetitionWithSeparator){var $={idx:p,def:(0,Kt.drop)(h),ruleStack:C,occurrenceStack:y};g.push($),g.push(o);var A=new kt.Terminal({terminalType:B.separator}),Ae=new kt.Repetition({definition:[A].concat(B.definition),idx:B.idx}),_=B.definition.concat([Ae],(0,Kt.drop)(h)),V={idx:p,def:_,ruleStack:C,occurrenceStack:y};g.push(V)}else if(B instanceof kt.Repetition){var $={idx:p,def:(0,Kt.drop)(h),ruleStack:C,occurrenceStack:y};g.push($),g.push(o);var Ae=new kt.Repetition({definition:B.definition,idx:B.idx}),_=B.definition.concat([Ae],(0,Kt.drop)(h)),V={idx:p,def:_,ruleStack:C,occurrenceStack:y};g.push(V)}else if(B instanceof kt.Alternation)for(var ge=B.definition.length-1;ge>=0;ge--){var re=B.definition[ge],O={idx:p,def:re.definition.concat((0,Kt.drop)(h)),ruleStack:C,occurrenceStack:y};g.push(O),g.push(o)}else if(B instanceof kt.Alternative)g.push({idx:p,def:B.definition.concat((0,Kt.drop)(h)),ruleStack:C,occurrenceStack:y});else if(B instanceof kt.Rule)g.push(DIe(B,p,C,y));else throw Error(\"non exhaustive match\")}}return u}Nr.nextPossibleTokensAfter=PIe;function DIe(r,e,t,i){var n=(0,Kt.cloneArr)(t);n.push(r.name);var s=(0,Kt.cloneArr)(i);return s.push(1),{idx:e,def:r.definition,ruleStack:n,occurrenceStack:s}}});var kd=w(Zt=>{\"use strict\";var $j=Zt&&Zt.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!=\"function\"&&t!==null)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Zt,\"__esModule\",{value:!0});Zt.areTokenCategoriesNotUsed=Zt.isStrictPrefixOfPath=Zt.containsPath=Zt.getLookaheadPathsForOptionalProd=Zt.getLookaheadPathsForOr=Zt.lookAheadSequenceFromAlternatives=Zt.buildSingleAlternativeLookaheadFunction=Zt.buildAlternativesLookAheadFunc=Zt.buildLookaheadFuncForOptionalProd=Zt.buildLookaheadFuncForOr=Zt.getProdType=Zt.PROD_TYPE=void 0;var sr=Gt(),Zj=Dd(),kIe=Ay(),hy=_g(),MA=mn(),RIe=$g(),oi;(function(r){r[r.OPTION=0]=\"OPTION\",r[r.REPETITION=1]=\"REPETITION\",r[r.REPETITION_MANDATORY=2]=\"REPETITION_MANDATORY\",r[r.REPETITION_MANDATORY_WITH_SEPARATOR=3]=\"REPETITION_MANDATORY_WITH_SEPARATOR\",r[r.REPETITION_WITH_SEPARATOR=4]=\"REPETITION_WITH_SEPARATOR\",r[r.ALTERNATION=5]=\"ALTERNATION\"})(oi=Zt.PROD_TYPE||(Zt.PROD_TYPE={}));function FIe(r){if(r instanceof MA.Option)return oi.OPTION;if(r instanceof MA.Repetition)return oi.REPETITION;if(r instanceof MA.RepetitionMandatory)return oi.REPETITION_MANDATORY;if(r instanceof MA.RepetitionMandatoryWithSeparator)return oi.REPETITION_MANDATORY_WITH_SEPARATOR;if(r instanceof MA.RepetitionWithSeparator)return oi.REPETITION_WITH_SEPARATOR;if(r instanceof MA.Alternation)return oi.ALTERNATION;throw Error(\"non exhaustive match\")}Zt.getProdType=FIe;function NIe(r,e,t,i,n,s){var o=tq(r,e,t),a=Xv(o)?hy.tokenStructuredMatcherNoCategories:hy.tokenStructuredMatcher;return s(o,i,a,n)}Zt.buildLookaheadFuncForOr=NIe;function TIe(r,e,t,i,n,s){var o=rq(r,e,n,t),a=Xv(o)?hy.tokenStructuredMatcherNoCategories:hy.tokenStructuredMatcher;return s(o[0],a,i)}Zt.buildLookaheadFuncForOptionalProd=TIe;function LIe(r,e,t,i){var n=r.length,s=(0,sr.every)(r,function(l){return(0,sr.every)(l,function(c){return c.length===1})});if(e)return function(l){for(var c=(0,sr.map)(l,function(D){return D.GATE}),u=0;u<n;u++){var g=r[u],f=g.length,h=c[u];if(h!==void 0&&h.call(this)===!1)continue;e:for(var p=0;p<f;p++){for(var C=g[p],y=C.length,B=0;B<y;B++){var v=this.LA(B+1);if(t(v,C[B])===!1)continue e}return u}}};if(s&&!i){var o=(0,sr.map)(r,function(l){return(0,sr.flatten)(l)}),a=(0,sr.reduce)(o,function(l,c,u){return(0,sr.forEach)(c,function(g){(0,sr.has)(l,g.tokenTypeIdx)||(l[g.tokenTypeIdx]=u),(0,sr.forEach)(g.categoryMatches,function(f){(0,sr.has)(l,f)||(l[f]=u)})}),l},[]);return function(){var l=this.LA(1);return a[l.tokenTypeIdx]}}else return function(){for(var l=0;l<n;l++){var c=r[l],u=c.length;e:for(var g=0;g<u;g++){for(var f=c[g],h=f.length,p=0;p<h;p++){var C=this.LA(p+1);if(t(C,f[p])===!1)continue e}return l}}}}Zt.buildAlternativesLookAheadFunc=LIe;function OIe(r,e,t){var i=(0,sr.every)(r,function(c){return c.length===1}),n=r.length;if(i&&!t){var s=(0,sr.flatten)(r);if(s.length===1&&(0,sr.isEmpty)(s[0].categoryMatches)){var o=s[0],a=o.tokenTypeIdx;return function(){return this.LA(1).tokenTypeIdx===a}}else{var l=(0,sr.reduce)(s,function(c,u,g){return c[u.tokenTypeIdx]=!0,(0,sr.forEach)(u.categoryMatches,function(f){c[f]=!0}),c},[]);return function(){var c=this.LA(1);return l[c.tokenTypeIdx]===!0}}}else return function(){e:for(var c=0;c<n;c++){for(var u=r[c],g=u.length,f=0;f<g;f++){var h=this.LA(f+1);if(e(h,u[f])===!1)continue e}return!0}return!1}}Zt.buildSingleAlternativeLookaheadFunction=OIe;var MIe=function(r){$j(e,r);function e(t,i,n){var s=r.call(this)||this;return s.topProd=t,s.targetOccurrence=i,s.targetProdType=n,s}return e.prototype.startWalking=function(){return this.walk(this.topProd),this.restDef},e.prototype.checkIsTarget=function(t,i,n,s){return t.idx===this.targetOccurrence&&this.targetProdType===i?(this.restDef=n.concat(s),!0):!1},e.prototype.walkOption=function(t,i,n){this.checkIsTarget(t,oi.OPTION,i,n)||r.prototype.walkOption.call(this,t,i,n)},e.prototype.walkAtLeastOne=function(t,i,n){this.checkIsTarget(t,oi.REPETITION_MANDATORY,i,n)||r.prototype.walkOption.call(this,t,i,n)},e.prototype.walkAtLeastOneSep=function(t,i,n){this.checkIsTarget(t,oi.REPETITION_MANDATORY_WITH_SEPARATOR,i,n)||r.prototype.walkOption.call(this,t,i,n)},e.prototype.walkMany=function(t,i,n){this.checkIsTarget(t,oi.REPETITION,i,n)||r.prototype.walkOption.call(this,t,i,n)},e.prototype.walkManySep=function(t,i,n){this.checkIsTarget(t,oi.REPETITION_WITH_SEPARATOR,i,n)||r.prototype.walkOption.call(this,t,i,n)},e}(kIe.RestWalker),eq=function(r){$j(e,r);function e(t,i,n){var s=r.call(this)||this;return s.targetOccurrence=t,s.targetProdType=i,s.targetRef=n,s.result=[],s}return e.prototype.checkIsTarget=function(t,i){t.idx===this.targetOccurrence&&this.targetProdType===i&&(this.targetRef===void 0||t===this.targetRef)&&(this.result=t.definition)},e.prototype.visitOption=function(t){this.checkIsTarget(t,oi.OPTION)},e.prototype.visitRepetition=function(t){this.checkIsTarget(t,oi.REPETITION)},e.prototype.visitRepetitionMandatory=function(t){this.checkIsTarget(t,oi.REPETITION_MANDATORY)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.checkIsTarget(t,oi.REPETITION_MANDATORY_WITH_SEPARATOR)},e.prototype.visitRepetitionWithSeparator=function(t){this.checkIsTarget(t,oi.REPETITION_WITH_SEPARATOR)},e.prototype.visitAlternation=function(t){this.checkIsTarget(t,oi.ALTERNATION)},e}(RIe.GAstVisitor);function _j(r){for(var e=new Array(r),t=0;t<r;t++)e[t]=[];return e}function zv(r){for(var e=[\"\"],t=0;t<r.length;t++){for(var i=r[t],n=[],s=0;s<e.length;s++){var o=e[s];n.push(o+\"_\"+i.tokenTypeIdx);for(var a=0;a<i.categoryMatches.length;a++){var l=\"_\"+i.categoryMatches[a];n.push(o+l)}}e=n}return e}function KIe(r,e,t){for(var i=0;i<r.length;i++)if(i!==t)for(var n=r[i],s=0;s<e.length;s++){var o=e[s];if(n[o]===!0)return!1}return!0}function Vv(r,e){for(var t=(0,sr.map)(r,function(u){return(0,Zj.possiblePathsFrom)([u],1)}),i=_j(t.length),n=(0,sr.map)(t,function(u){var g={};return(0,sr.forEach)(u,function(f){var h=zv(f.partialPath);(0,sr.forEach)(h,function(p){g[p]=!0})}),g}),s=t,o=1;o<=e;o++){var a=s;s=_j(a.length);for(var l=function(u){for(var g=a[u],f=0;f<g.length;f++){var h=g[f].partialPath,p=g[f].suffixDef,C=zv(h),y=KIe(n,C,u);if(y||(0,sr.isEmpty)(p)||h.length===e){var B=i[u];if(iq(B,h)===!1){B.push(h);for(var v=0;v<C.length;v++){var D=C[v];n[u][D]=!0}}}else{var T=(0,Zj.possiblePathsFrom)(p,o+1,h);s[u]=s[u].concat(T),(0,sr.forEach)(T,function(H){var j=zv(H.partialPath);(0,sr.forEach)(j,function($){n[u][$]=!0})})}}},c=0;c<a.length;c++)l(c)}return i}Zt.lookAheadSequenceFromAlternatives=Vv;function tq(r,e,t,i){var n=new eq(r,oi.ALTERNATION,i);return e.accept(n),Vv(n.result,t)}Zt.getLookaheadPathsForOr=tq;function rq(r,e,t,i){var n=new eq(r,t);e.accept(n);var s=n.result,o=new MIe(e,r,t),a=o.startWalking(),l=new MA.Alternative({definition:s}),c=new MA.Alternative({definition:a});return Vv([l,c],i)}Zt.getLookaheadPathsForOptionalProd=rq;function iq(r,e){e:for(var t=0;t<r.length;t++){var i=r[t];if(i.length===e.length){for(var n=0;n<i.length;n++){var s=e[n],o=i[n],a=s===o||o.categoryMatchesMap[s.tokenTypeIdx]!==void 0;if(a===!1)continue e}return!0}}return!1}Zt.containsPath=iq;function UIe(r,e){return r.length<e.length&&(0,sr.every)(r,function(t,i){var n=e[i];return t===n||n.categoryMatchesMap[t.tokenTypeIdx]})}Zt.isStrictPrefixOfPath=UIe;function Xv(r){return(0,sr.every)(r,function(e){return(0,sr.every)(e,function(t){return(0,sr.every)(t,function(i){return(0,sr.isEmpty)(i.categoryMatches)})})})}Zt.areTokenCategoriesNotUsed=Xv});var rx=w(Vt=>{\"use strict\";var Zv=Vt&&Vt.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!=\"function\"&&t!==null)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(Vt,\"__esModule\",{value:!0});Vt.checkPrefixAlternativesAmbiguities=Vt.validateSomeNonEmptyLookaheadPath=Vt.validateTooManyAlts=Vt.RepetionCollector=Vt.validateAmbiguousAlternationAlternatives=Vt.validateEmptyOrAlternative=Vt.getFirstNoneTerminal=Vt.validateNoLeftRecursion=Vt.validateRuleIsOverridden=Vt.validateRuleDoesNotAlreadyExist=Vt.OccurrenceValidationCollector=Vt.identifyProductionForDuplicates=Vt.validateGrammar=void 0;var er=Gt(),br=Gt(),No=jn(),_v=vd(),tf=kd(),HIe=Dd(),to=mn(),$v=$g();function GIe(r,e,t,i,n){var s=er.map(r,function(h){return YIe(h,i)}),o=er.map(r,function(h){return ex(h,h,i)}),a=[],l=[],c=[];(0,br.every)(o,br.isEmpty)&&(a=(0,br.map)(r,function(h){return Aq(h,i)}),l=(0,br.map)(r,function(h){return lq(h,e,i)}),c=gq(r,e,i));var u=JIe(r,t,i),g=(0,br.map)(r,function(h){return uq(h,i)}),f=(0,br.map)(r,function(h){return aq(h,r,n,i)});return er.flatten(s.concat(c,o,a,l,u,g,f))}Vt.validateGrammar=GIe;function YIe(r,e){var t=new oq;r.accept(t);var i=t.allProductions,n=er.groupBy(i,nq),s=er.pick(n,function(a){return a.length>1}),o=er.map(er.values(s),function(a){var l=er.first(a),c=e.buildDuplicateFoundError(r,a),u=(0,_v.getProductionDslName)(l),g={message:c,type:No.ParserDefinitionErrorType.DUPLICATE_PRODUCTIONS,ruleName:r.name,dslName:u,occurrence:l.idx},f=sq(l);return f&&(g.parameter=f),g});return o}function nq(r){return(0,_v.getProductionDslName)(r)+\"_#_\"+r.idx+\"_#_\"+sq(r)}Vt.identifyProductionForDuplicates=nq;function sq(r){return r instanceof to.Terminal?r.terminalType.name:r instanceof to.NonTerminal?r.nonTerminalName:\"\"}var oq=function(r){Zv(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.allProductions=[],t}return e.prototype.visitNonTerminal=function(t){this.allProductions.push(t)},e.prototype.visitOption=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetition=function(t){this.allProductions.push(t)},e.prototype.visitAlternation=function(t){this.allProductions.push(t)},e.prototype.visitTerminal=function(t){this.allProductions.push(t)},e}($v.GAstVisitor);Vt.OccurrenceValidationCollector=oq;function aq(r,e,t,i){var n=[],s=(0,br.reduce)(e,function(a,l){return l.name===r.name?a+1:a},0);if(s>1){var o=i.buildDuplicateRuleNameError({topLevelRule:r,grammarName:t});n.push({message:o,type:No.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:r.name})}return n}Vt.validateRuleDoesNotAlreadyExist=aq;function jIe(r,e,t){var i=[],n;return er.contains(e,r)||(n=\"Invalid rule override, rule: ->\"+r+\"<- cannot be overridden in the grammar: ->\"+t+\"<-as it is not defined in any of the super grammars \",i.push({message:n,type:No.ParserDefinitionErrorType.INVALID_RULE_OVERRIDE,ruleName:r})),i}Vt.validateRuleIsOverridden=jIe;function ex(r,e,t,i){i===void 0&&(i=[]);var n=[],s=Rd(e.definition);if(er.isEmpty(s))return[];var o=r.name,a=er.contains(s,r);a&&n.push({message:t.buildLeftRecursionError({topLevelRule:r,leftRecursionPath:i}),type:No.ParserDefinitionErrorType.LEFT_RECURSION,ruleName:o});var l=er.difference(s,i.concat([r])),c=er.map(l,function(u){var g=er.cloneArr(i);return g.push(u),ex(r,u,t,g)});return n.concat(er.flatten(c))}Vt.validateNoLeftRecursion=ex;function Rd(r){var e=[];if(er.isEmpty(r))return e;var t=er.first(r);if(t instanceof to.NonTerminal)e.push(t.referencedRule);else if(t instanceof to.Alternative||t instanceof to.Option||t instanceof to.RepetitionMandatory||t instanceof to.RepetitionMandatoryWithSeparator||t instanceof to.RepetitionWithSeparator||t instanceof to.Repetition)e=e.concat(Rd(t.definition));else if(t instanceof to.Alternation)e=er.flatten(er.map(t.definition,function(o){return Rd(o.definition)}));else if(!(t instanceof to.Terminal))throw Error(\"non exhaustive match\");var i=(0,_v.isOptionalProd)(t),n=r.length>1;if(i&&n){var s=er.drop(r);return e.concat(Rd(s))}else return e}Vt.getFirstNoneTerminal=Rd;var tx=function(r){Zv(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.alternations=[],t}return e.prototype.visitAlternation=function(t){this.alternations.push(t)},e}($v.GAstVisitor);function Aq(r,e){var t=new tx;r.accept(t);var i=t.alternations,n=er.reduce(i,function(s,o){var a=er.dropRight(o.definition),l=er.map(a,function(c,u){var g=(0,HIe.nextPossibleTokensAfter)([c],[],null,1);return er.isEmpty(g)?{message:e.buildEmptyAlternationError({topLevelRule:r,alternation:o,emptyChoiceIdx:u}),type:No.ParserDefinitionErrorType.NONE_LAST_EMPTY_ALT,ruleName:r.name,occurrence:o.idx,alternative:u+1}:null});return s.concat(er.compact(l))},[]);return n}Vt.validateEmptyOrAlternative=Aq;function lq(r,e,t){var i=new tx;r.accept(i);var n=i.alternations;n=(0,br.reject)(n,function(o){return o.ignoreAmbiguities===!0});var s=er.reduce(n,function(o,a){var l=a.idx,c=a.maxLookahead||e,u=(0,tf.getLookaheadPathsForOr)(l,r,c,a),g=qIe(u,a,r,t),f=fq(u,a,r,t);return o.concat(g,f)},[]);return s}Vt.validateAmbiguousAlternationAlternatives=lq;var cq=function(r){Zv(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.allProductions=[],t}return e.prototype.visitRepetitionWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatory=function(t){this.allProductions.push(t)},e.prototype.visitRepetitionMandatoryWithSeparator=function(t){this.allProductions.push(t)},e.prototype.visitRepetition=function(t){this.allProductions.push(t)},e}($v.GAstVisitor);Vt.RepetionCollector=cq;function uq(r,e){var t=new tx;r.accept(t);var i=t.alternations,n=er.reduce(i,function(s,o){return o.definition.length>255&&s.push({message:e.buildTooManyAlternativesError({topLevelRule:r,alternation:o}),type:No.ParserDefinitionErrorType.TOO_MANY_ALTS,ruleName:r.name,occurrence:o.idx}),s},[]);return n}Vt.validateTooManyAlts=uq;function gq(r,e,t){var i=[];return(0,br.forEach)(r,function(n){var s=new cq;n.accept(s);var o=s.allProductions;(0,br.forEach)(o,function(a){var l=(0,tf.getProdType)(a),c=a.maxLookahead||e,u=a.idx,g=(0,tf.getLookaheadPathsForOptionalProd)(u,n,l,c),f=g[0];if((0,br.isEmpty)((0,br.flatten)(f))){var h=t.buildEmptyRepetitionError({topLevelRule:n,repetition:a});i.push({message:h,type:No.ParserDefinitionErrorType.NO_NON_EMPTY_LOOKAHEAD,ruleName:n.name})}})}),i}Vt.validateSomeNonEmptyLookaheadPath=gq;function qIe(r,e,t,i){var n=[],s=(0,br.reduce)(r,function(a,l,c){return e.definition[c].ignoreAmbiguities===!0||(0,br.forEach)(l,function(u){var g=[c];(0,br.forEach)(r,function(f,h){c!==h&&(0,tf.containsPath)(f,u)&&e.definition[h].ignoreAmbiguities!==!0&&g.push(h)}),g.length>1&&!(0,tf.containsPath)(n,u)&&(n.push(u),a.push({alts:g,path:u}))}),a},[]),o=er.map(s,function(a){var l=(0,br.map)(a.alts,function(u){return u+1}),c=i.buildAlternationAmbiguityError({topLevelRule:t,alternation:e,ambiguityIndices:l,prefixPath:a.path});return{message:c,type:No.ParserDefinitionErrorType.AMBIGUOUS_ALTS,ruleName:t.name,occurrence:e.idx,alternatives:[a.alts]}});return o}function fq(r,e,t,i){var n=[],s=(0,br.reduce)(r,function(o,a,l){var c=(0,br.map)(a,function(u){return{idx:l,path:u}});return o.concat(c)},[]);return(0,br.forEach)(s,function(o){var a=e.definition[o.idx];if(a.ignoreAmbiguities!==!0){var l=o.idx,c=o.path,u=(0,br.findAll)(s,function(f){return e.definition[f.idx].ignoreAmbiguities!==!0&&f.idx<l&&(0,tf.isStrictPrefixOfPath)(f.path,c)}),g=(0,br.map)(u,function(f){var h=[f.idx+1,l+1],p=e.idx===0?\"\":e.idx,C=i.buildAlternationPrefixAmbiguityError({topLevelRule:t,alternation:e,ambiguityIndices:h,prefixPath:f.path});return{message:C,type:No.ParserDefinitionErrorType.AMBIGUOUS_PREFIX_ALTS,ruleName:t.name,occurrence:p,alternatives:h}});n=n.concat(g)}}),n}Vt.checkPrefixAlternativesAmbiguities=fq;function JIe(r,e,t){var i=[],n=(0,br.map)(e,function(s){return s.name});return(0,br.forEach)(r,function(s){var o=s.name;if((0,br.contains)(n,o)){var a=t.buildNamespaceConflictError(s);i.push({message:a,type:No.ParserDefinitionErrorType.CONFLICT_TOKENS_RULES_NAMESPACE,ruleName:o})}}),i}});var pq=w(rf=>{\"use strict\";Object.defineProperty(rf,\"__esModule\",{value:!0});rf.validateGrammar=rf.resolveGrammar=void 0;var ix=Gt(),WIe=Wj(),zIe=rx(),hq=xd();function VIe(r){r=(0,ix.defaults)(r,{errMsgProvider:hq.defaultGrammarResolverErrorProvider});var e={};return(0,ix.forEach)(r.rules,function(t){e[t.name]=t}),(0,WIe.resolveGrammar)(e,r.errMsgProvider)}rf.resolveGrammar=VIe;function XIe(r){return r=(0,ix.defaults)(r,{errMsgProvider:hq.defaultGrammarValidatorErrorProvider}),(0,zIe.validateGrammar)(r.rules,r.maxLookahead,r.tokenTypes,r.errMsgProvider,r.grammarName)}rf.validateGrammar=XIe});var nf=w(In=>{\"use strict\";var Fd=In&&In.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!=\"function\"&&t!==null)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(In,\"__esModule\",{value:!0});In.EarlyExitException=In.NotAllInputParsedException=In.NoViableAltException=In.MismatchedTokenException=In.isRecognitionException=void 0;var ZIe=Gt(),dq=\"MismatchedTokenException\",Cq=\"NoViableAltException\",mq=\"EarlyExitException\",Eq=\"NotAllInputParsedException\",Iq=[dq,Cq,mq,Eq];Object.freeze(Iq);function _Ie(r){return(0,ZIe.contains)(Iq,r.name)}In.isRecognitionException=_Ie;var py=function(r){Fd(e,r);function e(t,i){var n=this.constructor,s=r.call(this,t)||this;return s.token=i,s.resyncedTokens=[],Object.setPrototypeOf(s,n.prototype),Error.captureStackTrace&&Error.captureStackTrace(s,s.constructor),s}return e}(Error),$Ie=function(r){Fd(e,r);function e(t,i,n){var s=r.call(this,t,i)||this;return s.previousToken=n,s.name=dq,s}return e}(py);In.MismatchedTokenException=$Ie;var eye=function(r){Fd(e,r);function e(t,i,n){var s=r.call(this,t,i)||this;return s.previousToken=n,s.name=Cq,s}return e}(py);In.NoViableAltException=eye;var tye=function(r){Fd(e,r);function e(t,i){var n=r.call(this,t,i)||this;return n.name=Eq,n}return e}(py);In.NotAllInputParsedException=tye;var rye=function(r){Fd(e,r);function e(t,i,n){var s=r.call(this,t,i)||this;return s.previousToken=n,s.name=mq,s}return e}(py);In.EarlyExitException=rye});var sx=w(Ki=>{\"use strict\";Object.defineProperty(Ki,\"__esModule\",{value:!0});Ki.attemptInRepetitionRecovery=Ki.Recoverable=Ki.InRuleRecoveryException=Ki.IN_RULE_RECOVERY_EXCEPTION=Ki.EOF_FOLLOW_KEY=void 0;var dy=LA(),hs=Gt(),iye=nf(),nye=Jv(),sye=jn();Ki.EOF_FOLLOW_KEY={};Ki.IN_RULE_RECOVERY_EXCEPTION=\"InRuleRecoveryException\";function nx(r){this.name=Ki.IN_RULE_RECOVERY_EXCEPTION,this.message=r}Ki.InRuleRecoveryException=nx;nx.prototype=Error.prototype;var oye=function(){function r(){}return r.prototype.initRecoverable=function(e){this.firstAfterRepMap={},this.resyncFollows={},this.recoveryEnabled=(0,hs.has)(e,\"recoveryEnabled\")?e.recoveryEnabled:sye.DEFAULT_PARSER_CONFIG.recoveryEnabled,this.recoveryEnabled&&(this.attemptInRepetitionRecovery=yq)},r.prototype.getTokenToInsert=function(e){var t=(0,dy.createTokenInstance)(e,\"\",NaN,NaN,NaN,NaN,NaN,NaN);return t.isInsertedInRecovery=!0,t},r.prototype.canTokenTypeBeInsertedInRecovery=function(e){return!0},r.prototype.tryInRepetitionRecovery=function(e,t,i,n){for(var s=this,o=this.findReSyncTokenType(),a=this.exportLexerState(),l=[],c=!1,u=this.LA(1),g=this.LA(1),f=function(){var h=s.LA(0),p=s.errorMessageProvider.buildMismatchTokenMessage({expected:n,actual:u,previous:h,ruleName:s.getCurrRuleFullName()}),C=new iye.MismatchedTokenException(p,u,s.LA(0));C.resyncedTokens=(0,hs.dropRight)(l),s.SAVE_ERROR(C)};!c;)if(this.tokenMatcher(g,n)){f();return}else if(i.call(this)){f(),e.apply(this,t);return}else this.tokenMatcher(g,o)?c=!0:(g=this.SKIP_TOKEN(),this.addToResyncTokens(g,l));this.importLexerState(a)},r.prototype.shouldInRepetitionRecoveryBeTried=function(e,t,i){return!(i===!1||e===void 0||t===void 0||this.tokenMatcher(this.LA(1),e)||this.isBackTracking()||this.canPerformInRuleRecovery(e,this.getFollowsForInRuleRecovery(e,t)))},r.prototype.getFollowsForInRuleRecovery=function(e,t){var i=this.getCurrentGrammarPath(e,t),n=this.getNextPossibleTokenTypes(i);return n},r.prototype.tryInRuleRecovery=function(e,t){if(this.canRecoverWithSingleTokenInsertion(e,t)){var i=this.getTokenToInsert(e);return i}if(this.canRecoverWithSingleTokenDeletion(e)){var n=this.SKIP_TOKEN();return this.consumeToken(),n}throw new nx(\"sad sad panda\")},r.prototype.canPerformInRuleRecovery=function(e,t){return this.canRecoverWithSingleTokenInsertion(e,t)||this.canRecoverWithSingleTokenDeletion(e)},r.prototype.canRecoverWithSingleTokenInsertion=function(e,t){var i=this;if(!this.canTokenTypeBeInsertedInRecovery(e)||(0,hs.isEmpty)(t))return!1;var n=this.LA(1),s=(0,hs.find)(t,function(o){return i.tokenMatcher(n,o)})!==void 0;return s},r.prototype.canRecoverWithSingleTokenDeletion=function(e){var t=this.tokenMatcher(this.LA(2),e);return t},r.prototype.isInCurrentRuleReSyncSet=function(e){var t=this.getCurrFollowKey(),i=this.getFollowSetFromFollowKey(t);return(0,hs.contains)(i,e)},r.prototype.findReSyncTokenType=function(){for(var e=this.flattenFollowSet(),t=this.LA(1),i=2;;){var n=t.tokenType;if((0,hs.contains)(e,n))return n;t=this.LA(i),i++}},r.prototype.getCurrFollowKey=function(){if(this.RULE_STACK.length===1)return Ki.EOF_FOLLOW_KEY;var e=this.getLastExplicitRuleShortName(),t=this.getLastExplicitRuleOccurrenceIndex(),i=this.getPreviousExplicitRuleShortName();return{ruleName:this.shortRuleNameToFullName(e),idxInCallingRule:t,inRule:this.shortRuleNameToFullName(i)}},r.prototype.buildFullFollowKeyStack=function(){var e=this,t=this.RULE_STACK,i=this.RULE_OCCURRENCE_STACK;return(0,hs.map)(t,function(n,s){return s===0?Ki.EOF_FOLLOW_KEY:{ruleName:e.shortRuleNameToFullName(n),idxInCallingRule:i[s],inRule:e.shortRuleNameToFullName(t[s-1])}})},r.prototype.flattenFollowSet=function(){var e=this,t=(0,hs.map)(this.buildFullFollowKeyStack(),function(i){return e.getFollowSetFromFollowKey(i)});return(0,hs.flatten)(t)},r.prototype.getFollowSetFromFollowKey=function(e){if(e===Ki.EOF_FOLLOW_KEY)return[dy.EOF];var t=e.ruleName+e.idxInCallingRule+nye.IN+e.inRule;return this.resyncFollows[t]},r.prototype.addToResyncTokens=function(e,t){return this.tokenMatcher(e,dy.EOF)||t.push(e),t},r.prototype.reSyncTo=function(e){for(var t=[],i=this.LA(1);this.tokenMatcher(i,e)===!1;)i=this.SKIP_TOKEN(),this.addToResyncTokens(i,t);return(0,hs.dropRight)(t)},r.prototype.attemptInRepetitionRecovery=function(e,t,i,n,s,o,a){},r.prototype.getCurrentGrammarPath=function(e,t){var i=this.getHumanReadableRuleStack(),n=(0,hs.cloneArr)(this.RULE_OCCURRENCE_STACK),s={ruleStack:i,occurrenceStack:n,lastTok:e,lastTokOccurrence:t};return s},r.prototype.getHumanReadableRuleStack=function(){var e=this;return(0,hs.map)(this.RULE_STACK,function(t){return e.shortRuleNameToFullName(t)})},r}();Ki.Recoverable=oye;function yq(r,e,t,i,n,s,o){var a=this.getKeyForAutomaticLookahead(i,n),l=this.firstAfterRepMap[a];if(l===void 0){var c=this.getCurrRuleFullName(),u=this.getGAstProductions()[c],g=new s(u,n);l=g.startWalking(),this.firstAfterRepMap[a]=l}var f=l.token,h=l.occurrence,p=l.isEndOfRule;this.RULE_STACK.length===1&&p&&f===void 0&&(f=dy.EOF,h=1),this.shouldInRepetitionRecoveryBeTried(f,h,o)&&this.tryInRepetitionRecovery(r,e,t,f)}Ki.attemptInRepetitionRecovery=yq});var Cy=w(Jt=>{\"use strict\";Object.defineProperty(Jt,\"__esModule\",{value:!0});Jt.getKeyForAutomaticLookahead=Jt.AT_LEAST_ONE_SEP_IDX=Jt.MANY_SEP_IDX=Jt.AT_LEAST_ONE_IDX=Jt.MANY_IDX=Jt.OPTION_IDX=Jt.OR_IDX=Jt.BITS_FOR_ALT_IDX=Jt.BITS_FOR_RULE_IDX=Jt.BITS_FOR_OCCURRENCE_IDX=Jt.BITS_FOR_METHOD_TYPE=void 0;Jt.BITS_FOR_METHOD_TYPE=4;Jt.BITS_FOR_OCCURRENCE_IDX=8;Jt.BITS_FOR_RULE_IDX=12;Jt.BITS_FOR_ALT_IDX=8;Jt.OR_IDX=1<<Jt.BITS_FOR_OCCURRENCE_IDX;Jt.OPTION_IDX=2<<Jt.BITS_FOR_OCCURRENCE_IDX;Jt.MANY_IDX=3<<Jt.BITS_FOR_OCCURRENCE_IDX;Jt.AT_LEAST_ONE_IDX=4<<Jt.BITS_FOR_OCCURRENCE_IDX;Jt.MANY_SEP_IDX=5<<Jt.BITS_FOR_OCCURRENCE_IDX;Jt.AT_LEAST_ONE_SEP_IDX=6<<Jt.BITS_FOR_OCCURRENCE_IDX;function aye(r,e,t){return t|e|r}Jt.getKeyForAutomaticLookahead=aye;var bet=32-Jt.BITS_FOR_ALT_IDX});var Bq=w(my=>{\"use strict\";Object.defineProperty(my,\"__esModule\",{value:!0});my.LooksAhead=void 0;var ka=kd(),ro=Gt(),wq=jn(),Ra=Cy(),Ec=vd(),Aye=function(){function r(){}return r.prototype.initLooksAhead=function(e){this.dynamicTokensEnabled=(0,ro.has)(e,\"dynamicTokensEnabled\")?e.dynamicTokensEnabled:wq.DEFAULT_PARSER_CONFIG.dynamicTokensEnabled,this.maxLookahead=(0,ro.has)(e,\"maxLookahead\")?e.maxLookahead:wq.DEFAULT_PARSER_CONFIG.maxLookahead,this.lookAheadFuncsCache=(0,ro.isES2015MapSupported)()?new Map:[],(0,ro.isES2015MapSupported)()?(this.getLaFuncFromCache=this.getLaFuncFromMap,this.setLaFuncCache=this.setLaFuncCacheUsingMap):(this.getLaFuncFromCache=this.getLaFuncFromObj,this.setLaFuncCache=this.setLaFuncUsingObj)},r.prototype.preComputeLookaheadFunctions=function(e){var t=this;(0,ro.forEach)(e,function(i){t.TRACE_INIT(i.name+\" Rule Lookahead\",function(){var n=(0,Ec.collectMethods)(i),s=n.alternation,o=n.repetition,a=n.option,l=n.repetitionMandatory,c=n.repetitionMandatoryWithSeparator,u=n.repetitionWithSeparator;(0,ro.forEach)(s,function(g){var f=g.idx===0?\"\":g.idx;t.TRACE_INIT(\"\"+(0,Ec.getProductionDslName)(g)+f,function(){var h=(0,ka.buildLookaheadFuncForOr)(g.idx,i,g.maxLookahead||t.maxLookahead,g.hasPredicates,t.dynamicTokensEnabled,t.lookAheadBuilderForAlternatives),p=(0,Ra.getKeyForAutomaticLookahead)(t.fullRuleNameToShort[i.name],Ra.OR_IDX,g.idx);t.setLaFuncCache(p,h)})}),(0,ro.forEach)(o,function(g){t.computeLookaheadFunc(i,g.idx,Ra.MANY_IDX,ka.PROD_TYPE.REPETITION,g.maxLookahead,(0,Ec.getProductionDslName)(g))}),(0,ro.forEach)(a,function(g){t.computeLookaheadFunc(i,g.idx,Ra.OPTION_IDX,ka.PROD_TYPE.OPTION,g.maxLookahead,(0,Ec.getProductionDslName)(g))}),(0,ro.forEach)(l,function(g){t.computeLookaheadFunc(i,g.idx,Ra.AT_LEAST_ONE_IDX,ka.PROD_TYPE.REPETITION_MANDATORY,g.maxLookahead,(0,Ec.getProductionDslName)(g))}),(0,ro.forEach)(c,function(g){t.computeLookaheadFunc(i,g.idx,Ra.AT_LEAST_ONE_SEP_IDX,ka.PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR,g.maxLookahead,(0,Ec.getProductionDslName)(g))}),(0,ro.forEach)(u,function(g){t.computeLookaheadFunc(i,g.idx,Ra.MANY_SEP_IDX,ka.PROD_TYPE.REPETITION_WITH_SEPARATOR,g.maxLookahead,(0,Ec.getProductionDslName)(g))})})})},r.prototype.computeLookaheadFunc=function(e,t,i,n,s,o){var a=this;this.TRACE_INIT(\"\"+o+(t===0?\"\":t),function(){var l=(0,ka.buildLookaheadFuncForOptionalProd)(t,e,s||a.maxLookahead,a.dynamicTokensEnabled,n,a.lookAheadBuilderForOptional),c=(0,Ra.getKeyForAutomaticLookahead)(a.fullRuleNameToShort[e.name],i,t);a.setLaFuncCache(c,l)})},r.prototype.lookAheadBuilderForOptional=function(e,t,i){return(0,ka.buildSingleAlternativeLookaheadFunction)(e,t,i)},r.prototype.lookAheadBuilderForAlternatives=function(e,t,i,n){return(0,ka.buildAlternativesLookAheadFunc)(e,t,i,n)},r.prototype.getKeyForAutomaticLookahead=function(e,t){var i=this.getLastExplicitRuleShortName();return(0,Ra.getKeyForAutomaticLookahead)(i,e,t)},r.prototype.getLaFuncFromCache=function(e){},r.prototype.getLaFuncFromMap=function(e){return this.lookAheadFuncsCache.get(e)},r.prototype.getLaFuncFromObj=function(e){return this.lookAheadFuncsCache[e]},r.prototype.setLaFuncCache=function(e,t){},r.prototype.setLaFuncCacheUsingMap=function(e,t){this.lookAheadFuncsCache.set(e,t)},r.prototype.setLaFuncUsingObj=function(e,t){this.lookAheadFuncsCache[e]=t},r}();my.LooksAhead=Aye});var Qq=w(To=>{\"use strict\";Object.defineProperty(To,\"__esModule\",{value:!0});To.addNoneTerminalToCst=To.addTerminalToCst=To.setNodeLocationFull=To.setNodeLocationOnlyOffset=void 0;function lye(r,e){isNaN(r.startOffset)===!0?(r.startOffset=e.startOffset,r.endOffset=e.endOffset):r.endOffset<e.endOffset&&(r.endOffset=e.endOffset)}To.setNodeLocationOnlyOffset=lye;function cye(r,e){isNaN(r.startOffset)===!0?(r.startOffset=e.startOffset,r.startColumn=e.startColumn,r.startLine=e.startLine,r.endOffset=e.endOffset,r.endColumn=e.endColumn,r.endLine=e.endLine):r.endOffset<e.endOffset&&(r.endOffset=e.endOffset,r.endColumn=e.endColumn,r.endLine=e.endLine)}To.setNodeLocationFull=cye;function uye(r,e,t){r.children[t]===void 0?r.children[t]=[e]:r.children[t].push(e)}To.addTerminalToCst=uye;function gye(r,e,t){r.children[e]===void 0?r.children[e]=[t]:r.children[e].push(t)}To.addNoneTerminalToCst=gye});var ox=w(KA=>{\"use strict\";Object.defineProperty(KA,\"__esModule\",{value:!0});KA.defineNameProp=KA.functionName=KA.classNameFromInstance=void 0;var fye=Gt();function hye(r){return Sq(r.constructor)}KA.classNameFromInstance=hye;var bq=\"name\";function Sq(r){var e=r.name;return e||\"anonymous\"}KA.functionName=Sq;function pye(r,e){var t=Object.getOwnPropertyDescriptor(r,bq);return(0,fye.isUndefined)(t)||t.configurable?(Object.defineProperty(r,bq,{enumerable:!1,configurable:!0,writable:!1,value:e}),!0):!1}KA.defineNameProp=pye});var kq=w(Si=>{\"use strict\";Object.defineProperty(Si,\"__esModule\",{value:!0});Si.validateRedundantMethods=Si.validateMissingCstMethods=Si.validateVisitor=Si.CstVisitorDefinitionError=Si.createBaseVisitorConstructorWithDefaults=Si.createBaseSemanticVisitorConstructor=Si.defaultVisit=void 0;var ps=Gt(),Nd=ox();function vq(r,e){for(var t=(0,ps.keys)(r),i=t.length,n=0;n<i;n++)for(var s=t[n],o=r[s],a=o.length,l=0;l<a;l++){var c=o[l];c.tokenTypeIdx===void 0&&this[c.name](c.children,e)}}Si.defaultVisit=vq;function dye(r,e){var t=function(){};(0,Nd.defineNameProp)(t,r+\"BaseSemantics\");var i={visit:function(n,s){if((0,ps.isArray)(n)&&(n=n[0]),!(0,ps.isUndefined)(n))return this[n.name](n.children,s)},validateVisitor:function(){var n=xq(this,e);if(!(0,ps.isEmpty)(n)){var s=(0,ps.map)(n,function(o){return o.msg});throw Error(\"Errors Detected in CST Visitor <\"+(0,Nd.functionName)(this.constructor)+`>:\n\t`+(\"\"+s.join(`\n\n`).replace(/\\n/g,`\n\t`)))}}};return t.prototype=i,t.prototype.constructor=t,t._RULE_NAMES=e,t}Si.createBaseSemanticVisitorConstructor=dye;function Cye(r,e,t){var i=function(){};(0,Nd.defineNameProp)(i,r+\"BaseSemanticsWithDefaults\");var n=Object.create(t.prototype);return(0,ps.forEach)(e,function(s){n[s]=vq}),i.prototype=n,i.prototype.constructor=i,i}Si.createBaseVisitorConstructorWithDefaults=Cye;var ax;(function(r){r[r.REDUNDANT_METHOD=0]=\"REDUNDANT_METHOD\",r[r.MISSING_METHOD=1]=\"MISSING_METHOD\"})(ax=Si.CstVisitorDefinitionError||(Si.CstVisitorDefinitionError={}));function xq(r,e){var t=Pq(r,e),i=Dq(r,e);return t.concat(i)}Si.validateVisitor=xq;function Pq(r,e){var t=(0,ps.map)(e,function(i){if(!(0,ps.isFunction)(r[i]))return{msg:\"Missing visitor method: <\"+i+\"> on \"+(0,Nd.functionName)(r.constructor)+\" CST Visitor.\",type:ax.MISSING_METHOD,methodName:i}});return(0,ps.compact)(t)}Si.validateMissingCstMethods=Pq;var mye=[\"constructor\",\"visit\",\"validateVisitor\"];function Dq(r,e){var t=[];for(var i in r)(0,ps.isFunction)(r[i])&&!(0,ps.contains)(mye,i)&&!(0,ps.contains)(e,i)&&t.push({msg:\"Redundant visitor method: <\"+i+\"> on \"+(0,Nd.functionName)(r.constructor)+` CST Visitor\nThere is no Grammar Rule corresponding to this method's name.\n`,type:ax.REDUNDANT_METHOD,methodName:i});return t}Si.validateRedundantMethods=Dq});var Fq=w(Ey=>{\"use strict\";Object.defineProperty(Ey,\"__esModule\",{value:!0});Ey.TreeBuilder=void 0;var sf=Qq(),_r=Gt(),Rq=kq(),Eye=jn(),Iye=function(){function r(){}return r.prototype.initTreeBuilder=function(e){if(this.CST_STACK=[],this.outputCst=e.outputCst,this.nodeLocationTracking=(0,_r.has)(e,\"nodeLocationTracking\")?e.nodeLocationTracking:Eye.DEFAULT_PARSER_CONFIG.nodeLocationTracking,!this.outputCst)this.cstInvocationStateUpdate=_r.NOOP,this.cstFinallyStateUpdate=_r.NOOP,this.cstPostTerminal=_r.NOOP,this.cstPostNonTerminal=_r.NOOP,this.cstPostRule=_r.NOOP;else if(/full/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=sf.setNodeLocationFull,this.setNodeLocationFromNode=sf.setNodeLocationFull,this.cstPostRule=_r.NOOP,this.setInitialNodeLocation=this.setInitialNodeLocationFullRecovery):(this.setNodeLocationFromToken=_r.NOOP,this.setNodeLocationFromNode=_r.NOOP,this.cstPostRule=this.cstPostRuleFull,this.setInitialNodeLocation=this.setInitialNodeLocationFullRegular);else if(/onlyOffset/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=sf.setNodeLocationOnlyOffset,this.setNodeLocationFromNode=sf.setNodeLocationOnlyOffset,this.cstPostRule=_r.NOOP,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRecovery):(this.setNodeLocationFromToken=_r.NOOP,this.setNodeLocationFromNode=_r.NOOP,this.cstPostRule=this.cstPostRuleOnlyOffset,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRegular);else if(/none/i.test(this.nodeLocationTracking))this.setNodeLocationFromToken=_r.NOOP,this.setNodeLocationFromNode=_r.NOOP,this.cstPostRule=_r.NOOP,this.setInitialNodeLocation=_r.NOOP;else throw Error('Invalid <nodeLocationTracking> config option: \"'+e.nodeLocationTracking+'\"')},r.prototype.setInitialNodeLocationOnlyOffsetRecovery=function(e){e.location={startOffset:NaN,endOffset:NaN}},r.prototype.setInitialNodeLocationOnlyOffsetRegular=function(e){e.location={startOffset:this.LA(1).startOffset,endOffset:NaN}},r.prototype.setInitialNodeLocationFullRecovery=function(e){e.location={startOffset:NaN,startLine:NaN,startColumn:NaN,endOffset:NaN,endLine:NaN,endColumn:NaN}},r.prototype.setInitialNodeLocationFullRegular=function(e){var t=this.LA(1);e.location={startOffset:t.startOffset,startLine:t.startLine,startColumn:t.startColumn,endOffset:NaN,endLine:NaN,endColumn:NaN}},r.prototype.cstInvocationStateUpdate=function(e,t){var i={name:e,children:{}};this.setInitialNodeLocation(i),this.CST_STACK.push(i)},r.prototype.cstFinallyStateUpdate=function(){this.CST_STACK.pop()},r.prototype.cstPostRuleFull=function(e){var t=this.LA(0),i=e.location;i.startOffset<=t.startOffset?(i.endOffset=t.endOffset,i.endLine=t.endLine,i.endColumn=t.endColumn):(i.startOffset=NaN,i.startLine=NaN,i.startColumn=NaN)},r.prototype.cstPostRuleOnlyOffset=function(e){var t=this.LA(0),i=e.location;i.startOffset<=t.startOffset?i.endOffset=t.endOffset:i.startOffset=NaN},r.prototype.cstPostTerminal=function(e,t){var i=this.CST_STACK[this.CST_STACK.length-1];(0,sf.addTerminalToCst)(i,t,e),this.setNodeLocationFromToken(i.location,t)},r.prototype.cstPostNonTerminal=function(e,t){var i=this.CST_STACK[this.CST_STACK.length-1];(0,sf.addNoneTerminalToCst)(i,t,e),this.setNodeLocationFromNode(i.location,e.location)},r.prototype.getBaseCstVisitorConstructor=function(){if((0,_r.isUndefined)(this.baseCstVisitorConstructor)){var e=(0,Rq.createBaseSemanticVisitorConstructor)(this.className,(0,_r.keys)(this.gastProductionsCache));return this.baseCstVisitorConstructor=e,e}return this.baseCstVisitorConstructor},r.prototype.getBaseCstVisitorConstructorWithDefaults=function(){if((0,_r.isUndefined)(this.baseCstVisitorWithDefaultsConstructor)){var e=(0,Rq.createBaseVisitorConstructorWithDefaults)(this.className,(0,_r.keys)(this.gastProductionsCache),this.getBaseCstVisitorConstructor());return this.baseCstVisitorWithDefaultsConstructor=e,e}return this.baseCstVisitorWithDefaultsConstructor},r.prototype.getLastExplicitRuleShortName=function(){var e=this.RULE_STACK;return e[e.length-1]},r.prototype.getPreviousExplicitRuleShortName=function(){var e=this.RULE_STACK;return e[e.length-2]},r.prototype.getLastExplicitRuleOccurrenceIndex=function(){var e=this.RULE_OCCURRENCE_STACK;return e[e.length-1]},r}();Ey.TreeBuilder=Iye});var Tq=w(Iy=>{\"use strict\";Object.defineProperty(Iy,\"__esModule\",{value:!0});Iy.LexerAdapter=void 0;var Nq=jn(),yye=function(){function r(){}return r.prototype.initLexerAdapter=function(){this.tokVector=[],this.tokVectorLength=0,this.currIdx=-1},Object.defineProperty(r.prototype,\"input\",{get:function(){return this.tokVector},set:function(e){if(this.selfAnalysisDone!==!0)throw Error(\"Missing <performSelfAnalysis> invocation at the end of the Parser's constructor.\");this.reset(),this.tokVector=e,this.tokVectorLength=e.length},enumerable:!1,configurable:!0}),r.prototype.SKIP_TOKEN=function(){return this.currIdx<=this.tokVector.length-2?(this.consumeToken(),this.LA(1)):Nq.END_OF_FILE},r.prototype.LA=function(e){var t=this.currIdx+e;return t<0||this.tokVectorLength<=t?Nq.END_OF_FILE:this.tokVector[t]},r.prototype.consumeToken=function(){this.currIdx++},r.prototype.exportLexerState=function(){return this.currIdx},r.prototype.importLexerState=function(e){this.currIdx=e},r.prototype.resetLexerState=function(){this.currIdx=-1},r.prototype.moveToTerminatedState=function(){this.currIdx=this.tokVector.length-1},r.prototype.getLexerPosition=function(){return this.exportLexerState()},r}();Iy.LexerAdapter=yye});var Oq=w(yy=>{\"use strict\";Object.defineProperty(yy,\"__esModule\",{value:!0});yy.RecognizerApi=void 0;var Lq=Gt(),wye=nf(),Ax=jn(),Bye=xd(),Qye=rx(),bye=mn(),Sye=function(){function r(){}return r.prototype.ACTION=function(e){return e.call(this)},r.prototype.consume=function(e,t,i){return this.consumeInternal(t,e,i)},r.prototype.subrule=function(e,t,i){return this.subruleInternal(t,e,i)},r.prototype.option=function(e,t){return this.optionInternal(t,e)},r.prototype.or=function(e,t){return this.orInternal(t,e)},r.prototype.many=function(e,t){return this.manyInternal(e,t)},r.prototype.atLeastOne=function(e,t){return this.atLeastOneInternal(e,t)},r.prototype.CONSUME=function(e,t){return this.consumeInternal(e,0,t)},r.prototype.CONSUME1=function(e,t){return this.consumeInternal(e,1,t)},r.prototype.CONSUME2=function(e,t){return this.consumeInternal(e,2,t)},r.prototype.CONSUME3=function(e,t){return this.consumeInternal(e,3,t)},r.prototype.CONSUME4=function(e,t){return this.consumeInternal(e,4,t)},r.prototype.CONSUME5=function(e,t){return this.consumeInternal(e,5,t)},r.prototype.CONSUME6=function(e,t){return this.consumeInternal(e,6,t)},r.prototype.CONSUME7=function(e,t){return this.consumeInternal(e,7,t)},r.prototype.CONSUME8=function(e,t){return this.consumeInternal(e,8,t)},r.prototype.CONSUME9=function(e,t){return this.consumeInternal(e,9,t)},r.prototype.SUBRULE=function(e,t){return this.subruleInternal(e,0,t)},r.prototype.SUBRULE1=function(e,t){return this.subruleInternal(e,1,t)},r.prototype.SUBRULE2=function(e,t){return this.subruleInternal(e,2,t)},r.prototype.SUBRULE3=function(e,t){return this.subruleInternal(e,3,t)},r.prototype.SUBRULE4=function(e,t){return this.subruleInternal(e,4,t)},r.prototype.SUBRULE5=function(e,t){return this.subruleInternal(e,5,t)},r.prototype.SUBRULE6=function(e,t){return this.subruleInternal(e,6,t)},r.prototype.SUBRULE7=function(e,t){return this.subruleInternal(e,7,t)},r.prototype.SUBRULE8=function(e,t){return this.subruleInternal(e,8,t)},r.prototype.SUBRULE9=function(e,t){return this.subruleInternal(e,9,t)},r.prototype.OPTION=function(e){return this.optionInternal(e,0)},r.prototype.OPTION1=function(e){return this.optionInternal(e,1)},r.prototype.OPTION2=function(e){return this.optionInternal(e,2)},r.prototype.OPTION3=function(e){return this.optionInternal(e,3)},r.prototype.OPTION4=function(e){return this.optionInternal(e,4)},r.prototype.OPTION5=function(e){return this.optionInternal(e,5)},r.prototype.OPTION6=function(e){return this.optionInternal(e,6)},r.prototype.OPTION7=function(e){return this.optionInternal(e,7)},r.prototype.OPTION8=function(e){return this.optionInternal(e,8)},r.prototype.OPTION9=function(e){return this.optionInternal(e,9)},r.prototype.OR=function(e){return this.orInternal(e,0)},r.prototype.OR1=function(e){return this.orInternal(e,1)},r.prototype.OR2=function(e){return this.orInternal(e,2)},r.prototype.OR3=function(e){return this.orInternal(e,3)},r.prototype.OR4=function(e){return this.orInternal(e,4)},r.prototype.OR5=function(e){return this.orInternal(e,5)},r.prototype.OR6=function(e){return this.orInternal(e,6)},r.prototype.OR7=function(e){return this.orInternal(e,7)},r.prototype.OR8=function(e){return this.orInternal(e,8)},r.prototype.OR9=function(e){return this.orInternal(e,9)},r.prototype.MANY=function(e){this.manyInternal(0,e)},r.prototype.MANY1=function(e){this.manyInternal(1,e)},r.prototype.MANY2=function(e){this.manyInternal(2,e)},r.prototype.MANY3=function(e){this.manyInternal(3,e)},r.prototype.MANY4=function(e){this.manyInternal(4,e)},r.prototype.MANY5=function(e){this.manyInternal(5,e)},r.prototype.MANY6=function(e){this.manyInternal(6,e)},r.prototype.MANY7=function(e){this.manyInternal(7,e)},r.prototype.MANY8=function(e){this.manyInternal(8,e)},r.prototype.MANY9=function(e){this.manyInternal(9,e)},r.prototype.MANY_SEP=function(e){this.manySepFirstInternal(0,e)},r.prototype.MANY_SEP1=function(e){this.manySepFirstInternal(1,e)},r.prototype.MANY_SEP2=function(e){this.manySepFirstInternal(2,e)},r.prototype.MANY_SEP3=function(e){this.manySepFirstInternal(3,e)},r.prototype.MANY_SEP4=function(e){this.manySepFirstInternal(4,e)},r.prototype.MANY_SEP5=function(e){this.manySepFirstInternal(5,e)},r.prototype.MANY_SEP6=function(e){this.manySepFirstInternal(6,e)},r.prototype.MANY_SEP7=function(e){this.manySepFirstInternal(7,e)},r.prototype.MANY_SEP8=function(e){this.manySepFirstInternal(8,e)},r.prototype.MANY_SEP9=function(e){this.manySepFirstInternal(9,e)},r.prototype.AT_LEAST_ONE=function(e){this.atLeastOneInternal(0,e)},r.prototype.AT_LEAST_ONE1=function(e){return this.atLeastOneInternal(1,e)},r.prototype.AT_LEAST_ONE2=function(e){this.atLeastOneInternal(2,e)},r.prototype.AT_LEAST_ONE3=function(e){this.atLeastOneInternal(3,e)},r.prototype.AT_LEAST_ONE4=function(e){this.atLeastOneInternal(4,e)},r.prototype.AT_LEAST_ONE5=function(e){this.atLeastOneInternal(5,e)},r.prototype.AT_LEAST_ONE6=function(e){this.atLeastOneInternal(6,e)},r.prototype.AT_LEAST_ONE7=function(e){this.atLeastOneInternal(7,e)},r.prototype.AT_LEAST_ONE8=function(e){this.atLeastOneInternal(8,e)},r.prototype.AT_LEAST_ONE9=function(e){this.atLeastOneInternal(9,e)},r.prototype.AT_LEAST_ONE_SEP=function(e){this.atLeastOneSepFirstInternal(0,e)},r.prototype.AT_LEAST_ONE_SEP1=function(e){this.atLeastOneSepFirstInternal(1,e)},r.prototype.AT_LEAST_ONE_SEP2=function(e){this.atLeastOneSepFirstInternal(2,e)},r.prototype.AT_LEAST_ONE_SEP3=function(e){this.atLeastOneSepFirstInternal(3,e)},r.prototype.AT_LEAST_ONE_SEP4=function(e){this.atLeastOneSepFirstInternal(4,e)},r.prototype.AT_LEAST_ONE_SEP5=function(e){this.atLeastOneSepFirstInternal(5,e)},r.prototype.AT_LEAST_ONE_SEP6=function(e){this.atLeastOneSepFirstInternal(6,e)},r.prototype.AT_LEAST_ONE_SEP7=function(e){this.atLeastOneSepFirstInternal(7,e)},r.prototype.AT_LEAST_ONE_SEP8=function(e){this.atLeastOneSepFirstInternal(8,e)},r.prototype.AT_LEAST_ONE_SEP9=function(e){this.atLeastOneSepFirstInternal(9,e)},r.prototype.RULE=function(e,t,i){if(i===void 0&&(i=Ax.DEFAULT_RULE_CONFIG),(0,Lq.contains)(this.definedRulesNames,e)){var n=Bye.defaultGrammarValidatorErrorProvider.buildDuplicateRuleNameError({topLevelRule:e,grammarName:this.className}),s={message:n,type:Ax.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:e};this.definitionErrors.push(s)}this.definedRulesNames.push(e);var o=this.defineRule(e,t,i);return this[e]=o,o},r.prototype.OVERRIDE_RULE=function(e,t,i){i===void 0&&(i=Ax.DEFAULT_RULE_CONFIG);var n=[];n=n.concat((0,Qye.validateRuleIsOverridden)(e,this.definedRulesNames,this.className)),this.definitionErrors=this.definitionErrors.concat(n);var s=this.defineRule(e,t,i);return this[e]=s,s},r.prototype.BACKTRACK=function(e,t){return function(){this.isBackTrackingStack.push(1);var i=this.saveRecogState();try{return e.apply(this,t),!0}catch(n){if((0,wye.isRecognitionException)(n))return!1;throw n}finally{this.reloadRecogState(i),this.isBackTrackingStack.pop()}}},r.prototype.getGAstProductions=function(){return this.gastProductionsCache},r.prototype.getSerializedGastProductions=function(){return(0,bye.serializeGrammar)((0,Lq.values)(this.gastProductionsCache))},r}();yy.RecognizerApi=Sye});var Hq=w(By=>{\"use strict\";Object.defineProperty(By,\"__esModule\",{value:!0});By.RecognizerEngine=void 0;var Pr=Gt(),qn=Cy(),wy=nf(),Mq=kd(),of=Dd(),Kq=jn(),vye=sx(),Uq=LA(),Td=_g(),xye=ox(),Pye=function(){function r(){}return r.prototype.initRecognizerEngine=function(e,t){if(this.className=(0,xye.classNameFromInstance)(this),this.shortRuleNameToFull={},this.fullRuleNameToShort={},this.ruleShortNameIdx=256,this.tokenMatcher=Td.tokenStructuredMatcherNoCategories,this.definedRulesNames=[],this.tokensMap={},this.isBackTrackingStack=[],this.RULE_STACK=[],this.RULE_OCCURRENCE_STACK=[],this.gastProductionsCache={},(0,Pr.has)(t,\"serializedGrammar\"))throw Error(`The Parser's configuration can no longer contain a <serializedGrammar> property.\n\tSee: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_6-0-0\n\tFor Further details.`);if((0,Pr.isArray)(e)){if((0,Pr.isEmpty)(e))throw Error(`A Token Vocabulary cannot be empty.\n\tNote that the first argument for the parser constructor\n\tis no longer a Token vector (since v4.0).`);if(typeof e[0].startOffset==\"number\")throw Error(`The Parser constructor no longer accepts a token vector as the first argument.\n\tSee: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_4-0-0\n\tFor Further details.`)}if((0,Pr.isArray)(e))this.tokensMap=(0,Pr.reduce)(e,function(o,a){return o[a.name]=a,o},{});else if((0,Pr.has)(e,\"modes\")&&(0,Pr.every)((0,Pr.flatten)((0,Pr.values)(e.modes)),Td.isTokenType)){var i=(0,Pr.flatten)((0,Pr.values)(e.modes)),n=(0,Pr.uniq)(i);this.tokensMap=(0,Pr.reduce)(n,function(o,a){return o[a.name]=a,o},{})}else if((0,Pr.isObject)(e))this.tokensMap=(0,Pr.cloneObj)(e);else throw new Error(\"<tokensDictionary> argument must be An Array of Token constructors, A dictionary of Token constructors or an IMultiModeLexerDefinition\");this.tokensMap.EOF=Uq.EOF;var s=(0,Pr.every)((0,Pr.values)(e),function(o){return(0,Pr.isEmpty)(o.categoryMatches)});this.tokenMatcher=s?Td.tokenStructuredMatcherNoCategories:Td.tokenStructuredMatcher,(0,Td.augmentTokenTypes)((0,Pr.values)(this.tokensMap))},r.prototype.defineRule=function(e,t,i){if(this.selfAnalysisDone)throw Error(\"Grammar rule <\"+e+`> may not be defined after the 'performSelfAnalysis' method has been called'\nMake sure that all grammar rule definitions are done before 'performSelfAnalysis' is called.`);var n=(0,Pr.has)(i,\"resyncEnabled\")?i.resyncEnabled:Kq.DEFAULT_RULE_CONFIG.resyncEnabled,s=(0,Pr.has)(i,\"recoveryValueFunc\")?i.recoveryValueFunc:Kq.DEFAULT_RULE_CONFIG.recoveryValueFunc,o=this.ruleShortNameIdx<<qn.BITS_FOR_METHOD_TYPE+qn.BITS_FOR_OCCURRENCE_IDX;this.ruleShortNameIdx++,this.shortRuleNameToFull[o]=e,this.fullRuleNameToShort[e]=o;function a(u){try{if(this.outputCst===!0){t.apply(this,u);var g=this.CST_STACK[this.CST_STACK.length-1];return this.cstPostRule(g),g}else return t.apply(this,u)}catch(f){return this.invokeRuleCatch(f,n,s)}finally{this.ruleFinallyStateUpdate()}}var l=function(u,g){return u===void 0&&(u=0),this.ruleInvocationStateUpdate(o,e,u),a.call(this,g)},c=\"ruleName\";return l[c]=e,l.originalGrammarAction=t,l},r.prototype.invokeRuleCatch=function(e,t,i){var n=this.RULE_STACK.length===1,s=t&&!this.isBackTracking()&&this.recoveryEnabled;if((0,wy.isRecognitionException)(e)){var o=e;if(s){var a=this.findReSyncTokenType();if(this.isInCurrentRuleReSyncSet(a))if(o.resyncedTokens=this.reSyncTo(a),this.outputCst){var l=this.CST_STACK[this.CST_STACK.length-1];return l.recoveredNode=!0,l}else return i();else{if(this.outputCst){var l=this.CST_STACK[this.CST_STACK.length-1];l.recoveredNode=!0,o.partialCstResult=l}throw o}}else{if(n)return this.moveToTerminatedState(),i();throw o}}else throw e},r.prototype.optionInternal=function(e,t){var i=this.getKeyForAutomaticLookahead(qn.OPTION_IDX,t);return this.optionInternalLogic(e,t,i)},r.prototype.optionInternalLogic=function(e,t,i){var n=this,s=this.getLaFuncFromCache(i),o,a;if(e.DEF!==void 0){if(o=e.DEF,a=e.GATE,a!==void 0){var l=s;s=function(){return a.call(n)&&l.call(n)}}}else o=e;if(s.call(this)===!0)return o.call(this)},r.prototype.atLeastOneInternal=function(e,t){var i=this.getKeyForAutomaticLookahead(qn.AT_LEAST_ONE_IDX,e);return this.atLeastOneInternalLogic(e,t,i)},r.prototype.atLeastOneInternalLogic=function(e,t,i){var n=this,s=this.getLaFuncFromCache(i),o,a;if(t.DEF!==void 0){if(o=t.DEF,a=t.GATE,a!==void 0){var l=s;s=function(){return a.call(n)&&l.call(n)}}}else o=t;if(s.call(this)===!0)for(var c=this.doSingleRepetition(o);s.call(this)===!0&&c===!0;)c=this.doSingleRepetition(o);else throw this.raiseEarlyExitException(e,Mq.PROD_TYPE.REPETITION_MANDATORY,t.ERR_MSG);this.attemptInRepetitionRecovery(this.atLeastOneInternal,[e,t],s,qn.AT_LEAST_ONE_IDX,e,of.NextTerminalAfterAtLeastOneWalker)},r.prototype.atLeastOneSepFirstInternal=function(e,t){var i=this.getKeyForAutomaticLookahead(qn.AT_LEAST_ONE_SEP_IDX,e);this.atLeastOneSepFirstInternalLogic(e,t,i)},r.prototype.atLeastOneSepFirstInternalLogic=function(e,t,i){var n=this,s=t.DEF,o=t.SEP,a=this.getLaFuncFromCache(i);if(a.call(this)===!0){s.call(this);for(var l=function(){return n.tokenMatcher(n.LA(1),o)};this.tokenMatcher(this.LA(1),o)===!0;)this.CONSUME(o),s.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,o,l,s,of.NextTerminalAfterAtLeastOneSepWalker],l,qn.AT_LEAST_ONE_SEP_IDX,e,of.NextTerminalAfterAtLeastOneSepWalker)}else throw this.raiseEarlyExitException(e,Mq.PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR,t.ERR_MSG)},r.prototype.manyInternal=function(e,t){var i=this.getKeyForAutomaticLookahead(qn.MANY_IDX,e);return this.manyInternalLogic(e,t,i)},r.prototype.manyInternalLogic=function(e,t,i){var n=this,s=this.getLaFuncFromCache(i),o,a;if(t.DEF!==void 0){if(o=t.DEF,a=t.GATE,a!==void 0){var l=s;s=function(){return a.call(n)&&l.call(n)}}}else o=t;for(var c=!0;s.call(this)===!0&&c===!0;)c=this.doSingleRepetition(o);this.attemptInRepetitionRecovery(this.manyInternal,[e,t],s,qn.MANY_IDX,e,of.NextTerminalAfterManyWalker,c)},r.prototype.manySepFirstInternal=function(e,t){var i=this.getKeyForAutomaticLookahead(qn.MANY_SEP_IDX,e);this.manySepFirstInternalLogic(e,t,i)},r.prototype.manySepFirstInternalLogic=function(e,t,i){var n=this,s=t.DEF,o=t.SEP,a=this.getLaFuncFromCache(i);if(a.call(this)===!0){s.call(this);for(var l=function(){return n.tokenMatcher(n.LA(1),o)};this.tokenMatcher(this.LA(1),o)===!0;)this.CONSUME(o),s.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,o,l,s,of.NextTerminalAfterManySepWalker],l,qn.MANY_SEP_IDX,e,of.NextTerminalAfterManySepWalker)}},r.prototype.repetitionSepSecondInternal=function(e,t,i,n,s){for(;i();)this.CONSUME(t),n.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,t,i,n,s],i,qn.AT_LEAST_ONE_SEP_IDX,e,s)},r.prototype.doSingleRepetition=function(e){var t=this.getLexerPosition();e.call(this);var i=this.getLexerPosition();return i>t},r.prototype.orInternal=function(e,t){var i=this.getKeyForAutomaticLookahead(qn.OR_IDX,t),n=(0,Pr.isArray)(e)?e:e.DEF,s=this.getLaFuncFromCache(i),o=s.call(this,n);if(o!==void 0){var a=n[o];return a.ALT.call(this)}this.raiseNoAltException(t,e.ERR_MSG)},r.prototype.ruleFinallyStateUpdate=function(){if(this.RULE_STACK.pop(),this.RULE_OCCURRENCE_STACK.pop(),this.cstFinallyStateUpdate(),this.RULE_STACK.length===0&&this.isAtEndOfInput()===!1){var e=this.LA(1),t=this.errorMessageProvider.buildNotAllInputParsedMessage({firstRedundant:e,ruleName:this.getCurrRuleFullName()});this.SAVE_ERROR(new wy.NotAllInputParsedException(t,e))}},r.prototype.subruleInternal=function(e,t,i){var n;try{var s=i!==void 0?i.ARGS:void 0;return n=e.call(this,t,s),this.cstPostNonTerminal(n,i!==void 0&&i.LABEL!==void 0?i.LABEL:e.ruleName),n}catch(o){this.subruleInternalError(o,i,e.ruleName)}},r.prototype.subruleInternalError=function(e,t,i){throw(0,wy.isRecognitionException)(e)&&e.partialCstResult!==void 0&&(this.cstPostNonTerminal(e.partialCstResult,t!==void 0&&t.LABEL!==void 0?t.LABEL:i),delete e.partialCstResult),e},r.prototype.consumeInternal=function(e,t,i){var n;try{var s=this.LA(1);this.tokenMatcher(s,e)===!0?(this.consumeToken(),n=s):this.consumeInternalError(e,s,i)}catch(o){n=this.consumeInternalRecovery(e,t,o)}return this.cstPostTerminal(i!==void 0&&i.LABEL!==void 0?i.LABEL:e.name,n),n},r.prototype.consumeInternalError=function(e,t,i){var n,s=this.LA(0);throw i!==void 0&&i.ERR_MSG?n=i.ERR_MSG:n=this.errorMessageProvider.buildMismatchTokenMessage({expected:e,actual:t,previous:s,ruleName:this.getCurrRuleFullName()}),this.SAVE_ERROR(new wy.MismatchedTokenException(n,t,s))},r.prototype.consumeInternalRecovery=function(e,t,i){if(this.recoveryEnabled&&i.name===\"MismatchedTokenException\"&&!this.isBackTracking()){var n=this.getFollowsForInRuleRecovery(e,t);try{return this.tryInRuleRecovery(e,n)}catch(s){throw s.name===vye.IN_RULE_RECOVERY_EXCEPTION?i:s}}else throw i},r.prototype.saveRecogState=function(){var e=this.errors,t=(0,Pr.cloneArr)(this.RULE_STACK);return{errors:e,lexerState:this.exportLexerState(),RULE_STACK:t,CST_STACK:this.CST_STACK}},r.prototype.reloadRecogState=function(e){this.errors=e.errors,this.importLexerState(e.lexerState),this.RULE_STACK=e.RULE_STACK},r.prototype.ruleInvocationStateUpdate=function(e,t,i){this.RULE_OCCURRENCE_STACK.push(i),this.RULE_STACK.push(e),this.cstInvocationStateUpdate(t,e)},r.prototype.isBackTracking=function(){return this.isBackTrackingStack.length!==0},r.prototype.getCurrRuleFullName=function(){var e=this.getLastExplicitRuleShortName();return this.shortRuleNameToFull[e]},r.prototype.shortRuleNameToFullName=function(e){return this.shortRuleNameToFull[e]},r.prototype.isAtEndOfInput=function(){return this.tokenMatcher(this.LA(1),Uq.EOF)},r.prototype.reset=function(){this.resetLexerState(),this.isBackTrackingStack=[],this.errors=[],this.RULE_STACK=[],this.CST_STACK=[],this.RULE_OCCURRENCE_STACK=[]},r}();By.RecognizerEngine=Pye});var Yq=w(Qy=>{\"use strict\";Object.defineProperty(Qy,\"__esModule\",{value:!0});Qy.ErrorHandler=void 0;var lx=nf(),cx=Gt(),Gq=kd(),Dye=jn(),kye=function(){function r(){}return r.prototype.initErrorHandler=function(e){this._errors=[],this.errorMessageProvider=(0,cx.has)(e,\"errorMessageProvider\")?e.errorMessageProvider:Dye.DEFAULT_PARSER_CONFIG.errorMessageProvider},r.prototype.SAVE_ERROR=function(e){if((0,lx.isRecognitionException)(e))return e.context={ruleStack:this.getHumanReadableRuleStack(),ruleOccurrenceStack:(0,cx.cloneArr)(this.RULE_OCCURRENCE_STACK)},this._errors.push(e),e;throw Error(\"Trying to save an Error which is not a RecognitionException\")},Object.defineProperty(r.prototype,\"errors\",{get:function(){return(0,cx.cloneArr)(this._errors)},set:function(e){this._errors=e},enumerable:!1,configurable:!0}),r.prototype.raiseEarlyExitException=function(e,t,i){for(var n=this.getCurrRuleFullName(),s=this.getGAstProductions()[n],o=(0,Gq.getLookaheadPathsForOptionalProd)(e,s,t,this.maxLookahead),a=o[0],l=[],c=1;c<=this.maxLookahead;c++)l.push(this.LA(c));var u=this.errorMessageProvider.buildEarlyExitMessage({expectedIterationPaths:a,actual:l,previous:this.LA(0),customUserDescription:i,ruleName:n});throw this.SAVE_ERROR(new lx.EarlyExitException(u,this.LA(1),this.LA(0)))},r.prototype.raiseNoAltException=function(e,t){for(var i=this.getCurrRuleFullName(),n=this.getGAstProductions()[i],s=(0,Gq.getLookaheadPathsForOr)(e,n,this.maxLookahead),o=[],a=1;a<=this.maxLookahead;a++)o.push(this.LA(a));var l=this.LA(0),c=this.errorMessageProvider.buildNoViableAltMessage({expectedPathsPerAlt:s,actual:o,previous:l,customUserDescription:t,ruleName:this.getCurrRuleFullName()});throw this.SAVE_ERROR(new lx.NoViableAltException(c,this.LA(1),l))},r}();Qy.ErrorHandler=kye});var Jq=w(by=>{\"use strict\";Object.defineProperty(by,\"__esModule\",{value:!0});by.ContentAssist=void 0;var jq=Dd(),qq=Gt(),Rye=function(){function r(){}return r.prototype.initContentAssist=function(){},r.prototype.computeContentAssist=function(e,t){var i=this.gastProductionsCache[e];if((0,qq.isUndefined)(i))throw Error(\"Rule ->\"+e+\"<- does not exist in this grammar.\");return(0,jq.nextPossibleTokensAfter)([i],t,this.tokenMatcher,this.maxLookahead)},r.prototype.getNextPossibleTokenTypes=function(e){var t=(0,qq.first)(e.ruleStack),i=this.getGAstProductions(),n=i[t],s=new jq.NextAfterTokenWalker(n,e).startWalking();return s},r}();by.ContentAssist=Rye});var eJ=w(xy=>{\"use strict\";Object.defineProperty(xy,\"__esModule\",{value:!0});xy.GastRecorder=void 0;var yn=Gt(),Lo=mn(),Fye=Bd(),Xq=_g(),Zq=LA(),Nye=jn(),Tye=Cy(),vy={description:\"This Object indicates the Parser is during Recording Phase\"};Object.freeze(vy);var Wq=!0,zq=Math.pow(2,Tye.BITS_FOR_OCCURRENCE_IDX)-1,_q=(0,Zq.createToken)({name:\"RECORDING_PHASE_TOKEN\",pattern:Fye.Lexer.NA});(0,Xq.augmentTokenTypes)([_q]);var $q=(0,Zq.createTokenInstance)(_q,`This IToken indicates the Parser is in Recording Phase\n\tSee: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,-1,-1,-1,-1,-1,-1);Object.freeze($q);var Lye={name:`This CSTNode indicates the Parser is in Recording Phase\n\tSee: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,children:{}},Oye=function(){function r(){}return r.prototype.initGastRecorder=function(e){this.recordingProdStack=[],this.RECORDING_PHASE=!1},r.prototype.enableRecording=function(){var e=this;this.RECORDING_PHASE=!0,this.TRACE_INIT(\"Enable Recording\",function(){for(var t=function(n){var s=n>0?n:\"\";e[\"CONSUME\"+s]=function(o,a){return this.consumeInternalRecord(o,n,a)},e[\"SUBRULE\"+s]=function(o,a){return this.subruleInternalRecord(o,n,a)},e[\"OPTION\"+s]=function(o){return this.optionInternalRecord(o,n)},e[\"OR\"+s]=function(o){return this.orInternalRecord(o,n)},e[\"MANY\"+s]=function(o){this.manyInternalRecord(n,o)},e[\"MANY_SEP\"+s]=function(o){this.manySepFirstInternalRecord(n,o)},e[\"AT_LEAST_ONE\"+s]=function(o){this.atLeastOneInternalRecord(n,o)},e[\"AT_LEAST_ONE_SEP\"+s]=function(o){this.atLeastOneSepFirstInternalRecord(n,o)}},i=0;i<10;i++)t(i);e.consume=function(n,s,o){return this.consumeInternalRecord(s,n,o)},e.subrule=function(n,s,o){return this.subruleInternalRecord(s,n,o)},e.option=function(n,s){return this.optionInternalRecord(s,n)},e.or=function(n,s){return this.orInternalRecord(s,n)},e.many=function(n,s){this.manyInternalRecord(n,s)},e.atLeastOne=function(n,s){this.atLeastOneInternalRecord(n,s)},e.ACTION=e.ACTION_RECORD,e.BACKTRACK=e.BACKTRACK_RECORD,e.LA=e.LA_RECORD})},r.prototype.disableRecording=function(){var e=this;this.RECORDING_PHASE=!1,this.TRACE_INIT(\"Deleting Recording methods\",function(){for(var t=0;t<10;t++){var i=t>0?t:\"\";delete e[\"CONSUME\"+i],delete e[\"SUBRULE\"+i],delete e[\"OPTION\"+i],delete e[\"OR\"+i],delete e[\"MANY\"+i],delete e[\"MANY_SEP\"+i],delete e[\"AT_LEAST_ONE\"+i],delete e[\"AT_LEAST_ONE_SEP\"+i]}delete e.consume,delete e.subrule,delete e.option,delete e.or,delete e.many,delete e.atLeastOne,delete e.ACTION,delete e.BACKTRACK,delete e.LA})},r.prototype.ACTION_RECORD=function(e){},r.prototype.BACKTRACK_RECORD=function(e,t){return function(){return!0}},r.prototype.LA_RECORD=function(e){return Nye.END_OF_FILE},r.prototype.topLevelRuleRecord=function(e,t){try{var i=new Lo.Rule({definition:[],name:e});return i.name=e,this.recordingProdStack.push(i),t.call(this),this.recordingProdStack.pop(),i}catch(n){if(n.KNOWN_RECORDER_ERROR!==!0)try{n.message=n.message+`\n\t This error was thrown during the \"grammar recording phase\" For more info see:\n\thttps://chevrotain.io/docs/guide/internals.html#grammar-recording`}catch{throw n}throw n}},r.prototype.optionInternalRecord=function(e,t){return Ld.call(this,Lo.Option,e,t)},r.prototype.atLeastOneInternalRecord=function(e,t){Ld.call(this,Lo.RepetitionMandatory,t,e)},r.prototype.atLeastOneSepFirstInternalRecord=function(e,t){Ld.call(this,Lo.RepetitionMandatoryWithSeparator,t,e,Wq)},r.prototype.manyInternalRecord=function(e,t){Ld.call(this,Lo.Repetition,t,e)},r.prototype.manySepFirstInternalRecord=function(e,t){Ld.call(this,Lo.RepetitionWithSeparator,t,e,Wq)},r.prototype.orInternalRecord=function(e,t){return Mye.call(this,e,t)},r.prototype.subruleInternalRecord=function(e,t,i){if(Sy(t),!e||(0,yn.has)(e,\"ruleName\")===!1){var n=new Error(\"<SUBRULE\"+Vq(t)+\"> argument is invalid\"+(\" expecting a Parser method reference but got: <\"+JSON.stringify(e)+\">\")+(`\n inside top level rule: <`+this.recordingProdStack[0].name+\">\"));throw n.KNOWN_RECORDER_ERROR=!0,n}var s=(0,yn.peek)(this.recordingProdStack),o=e.ruleName,a=new Lo.NonTerminal({idx:t,nonTerminalName:o,label:i==null?void 0:i.LABEL,referencedRule:void 0});return s.definition.push(a),this.outputCst?Lye:vy},r.prototype.consumeInternalRecord=function(e,t,i){if(Sy(t),!(0,Xq.hasShortKeyProperty)(e)){var n=new Error(\"<CONSUME\"+Vq(t)+\"> argument is invalid\"+(\" expecting a TokenType reference but got: <\"+JSON.stringify(e)+\">\")+(`\n inside top level rule: <`+this.recordingProdStack[0].name+\">\"));throw n.KNOWN_RECORDER_ERROR=!0,n}var s=(0,yn.peek)(this.recordingProdStack),o=new Lo.Terminal({idx:t,terminalType:e,label:i==null?void 0:i.LABEL});return s.definition.push(o),$q},r}();xy.GastRecorder=Oye;function Ld(r,e,t,i){i===void 0&&(i=!1),Sy(t);var n=(0,yn.peek)(this.recordingProdStack),s=(0,yn.isFunction)(e)?e:e.DEF,o=new r({definition:[],idx:t});return i&&(o.separator=e.SEP),(0,yn.has)(e,\"MAX_LOOKAHEAD\")&&(o.maxLookahead=e.MAX_LOOKAHEAD),this.recordingProdStack.push(o),s.call(this),n.definition.push(o),this.recordingProdStack.pop(),vy}function Mye(r,e){var t=this;Sy(e);var i=(0,yn.peek)(this.recordingProdStack),n=(0,yn.isArray)(r)===!1,s=n===!1?r:r.DEF,o=new Lo.Alternation({definition:[],idx:e,ignoreAmbiguities:n&&r.IGNORE_AMBIGUITIES===!0});(0,yn.has)(r,\"MAX_LOOKAHEAD\")&&(o.maxLookahead=r.MAX_LOOKAHEAD);var a=(0,yn.some)(s,function(l){return(0,yn.isFunction)(l.GATE)});return o.hasPredicates=a,i.definition.push(o),(0,yn.forEach)(s,function(l){var c=new Lo.Alternative({definition:[]});o.definition.push(c),(0,yn.has)(l,\"IGNORE_AMBIGUITIES\")?c.ignoreAmbiguities=l.IGNORE_AMBIGUITIES:(0,yn.has)(l,\"GATE\")&&(c.ignoreAmbiguities=!0),t.recordingProdStack.push(c),l.ALT.call(t),t.recordingProdStack.pop()}),vy}function Vq(r){return r===0?\"\":\"\"+r}function Sy(r){if(r<0||r>zq){var e=new Error(\"Invalid DSL Method idx value: <\"+r+`>\n\t`+(\"Idx value must be a none negative value smaller than \"+(zq+1)));throw e.KNOWN_RECORDER_ERROR=!0,e}}});var rJ=w(Py=>{\"use strict\";Object.defineProperty(Py,\"__esModule\",{value:!0});Py.PerformanceTracer=void 0;var tJ=Gt(),Kye=jn(),Uye=function(){function r(){}return r.prototype.initPerformanceTracer=function(e){if((0,tJ.has)(e,\"traceInitPerf\")){var t=e.traceInitPerf,i=typeof t==\"number\";this.traceInitMaxIdent=i?t:1/0,this.traceInitPerf=i?t>0:t}else this.traceInitMaxIdent=0,this.traceInitPerf=Kye.DEFAULT_PARSER_CONFIG.traceInitPerf;this.traceInitIndent=-1},r.prototype.TRACE_INIT=function(e,t){if(this.traceInitPerf===!0){this.traceInitIndent++;var i=new Array(this.traceInitIndent+1).join(\"\t\");this.traceInitIndent<this.traceInitMaxIdent&&console.log(i+\"--> <\"+e+\">\");var n=(0,tJ.timer)(t),s=n.time,o=n.value,a=s>10?console.warn:console.log;return this.traceInitIndent<this.traceInitMaxIdent&&a(i+\"<-- <\"+e+\"> time: \"+s+\"ms\"),this.traceInitIndent--,o}else return t()},r}();Py.PerformanceTracer=Uye});var iJ=w(Dy=>{\"use strict\";Object.defineProperty(Dy,\"__esModule\",{value:!0});Dy.applyMixins=void 0;function Hye(r,e){e.forEach(function(t){var i=t.prototype;Object.getOwnPropertyNames(i).forEach(function(n){if(n!==\"constructor\"){var s=Object.getOwnPropertyDescriptor(i,n);s&&(s.get||s.set)?Object.defineProperty(r.prototype,n,s):r.prototype[n]=t.prototype[n]}})})}Dy.applyMixins=Hye});var jn=w(dr=>{\"use strict\";var oJ=dr&&dr.__extends||function(){var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},r(e,t)};return function(e,t){if(typeof t!=\"function\"&&t!==null)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");r(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}();Object.defineProperty(dr,\"__esModule\",{value:!0});dr.EmbeddedActionsParser=dr.CstParser=dr.Parser=dr.EMPTY_ALT=dr.ParserDefinitionErrorType=dr.DEFAULT_RULE_CONFIG=dr.DEFAULT_PARSER_CONFIG=dr.END_OF_FILE=void 0;var en=Gt(),Gye=Yj(),nJ=LA(),aJ=xd(),sJ=pq(),Yye=sx(),jye=Bq(),qye=Fq(),Jye=Tq(),Wye=Oq(),zye=Hq(),Vye=Yq(),Xye=Jq(),Zye=eJ(),_ye=rJ(),$ye=iJ();dr.END_OF_FILE=(0,nJ.createTokenInstance)(nJ.EOF,\"\",NaN,NaN,NaN,NaN,NaN,NaN);Object.freeze(dr.END_OF_FILE);dr.DEFAULT_PARSER_CONFIG=Object.freeze({recoveryEnabled:!1,maxLookahead:3,dynamicTokensEnabled:!1,outputCst:!0,errorMessageProvider:aJ.defaultParserErrorProvider,nodeLocationTracking:\"none\",traceInitPerf:!1,skipValidations:!1});dr.DEFAULT_RULE_CONFIG=Object.freeze({recoveryValueFunc:function(){},resyncEnabled:!0});var ewe;(function(r){r[r.INVALID_RULE_NAME=0]=\"INVALID_RULE_NAME\",r[r.DUPLICATE_RULE_NAME=1]=\"DUPLICATE_RULE_NAME\",r[r.INVALID_RULE_OVERRIDE=2]=\"INVALID_RULE_OVERRIDE\",r[r.DUPLICATE_PRODUCTIONS=3]=\"DUPLICATE_PRODUCTIONS\",r[r.UNRESOLVED_SUBRULE_REF=4]=\"UNRESOLVED_SUBRULE_REF\",r[r.LEFT_RECURSION=5]=\"LEFT_RECURSION\",r[r.NONE_LAST_EMPTY_ALT=6]=\"NONE_LAST_EMPTY_ALT\",r[r.AMBIGUOUS_ALTS=7]=\"AMBIGUOUS_ALTS\",r[r.CONFLICT_TOKENS_RULES_NAMESPACE=8]=\"CONFLICT_TOKENS_RULES_NAMESPACE\",r[r.INVALID_TOKEN_NAME=9]=\"INVALID_TOKEN_NAME\",r[r.NO_NON_EMPTY_LOOKAHEAD=10]=\"NO_NON_EMPTY_LOOKAHEAD\",r[r.AMBIGUOUS_PREFIX_ALTS=11]=\"AMBIGUOUS_PREFIX_ALTS\",r[r.TOO_MANY_ALTS=12]=\"TOO_MANY_ALTS\"})(ewe=dr.ParserDefinitionErrorType||(dr.ParserDefinitionErrorType={}));function twe(r){return r===void 0&&(r=void 0),function(){return r}}dr.EMPTY_ALT=twe;var ky=function(){function r(e,t){this.definitionErrors=[],this.selfAnalysisDone=!1;var i=this;if(i.initErrorHandler(t),i.initLexerAdapter(),i.initLooksAhead(t),i.initRecognizerEngine(e,t),i.initRecoverable(t),i.initTreeBuilder(t),i.initContentAssist(),i.initGastRecorder(t),i.initPerformanceTracer(t),(0,en.has)(t,\"ignoredIssues\"))throw new Error(`The <ignoredIssues> IParserConfig property has been deprecated.\n\tPlease use the <IGNORE_AMBIGUITIES> flag on the relevant DSL method instead.\n\tSee: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#IGNORING_AMBIGUITIES\n\tFor further details.`);this.skipValidations=(0,en.has)(t,\"skipValidations\")?t.skipValidations:dr.DEFAULT_PARSER_CONFIG.skipValidations}return r.performSelfAnalysis=function(e){throw Error(\"The **static** `performSelfAnalysis` method has been deprecated.\t\\nUse the **instance** method with the same name instead.\")},r.prototype.performSelfAnalysis=function(){var e=this;this.TRACE_INIT(\"performSelfAnalysis\",function(){var t;e.selfAnalysisDone=!0;var i=e.className;e.TRACE_INIT(\"toFastProps\",function(){(0,en.toFastProperties)(e)}),e.TRACE_INIT(\"Grammar Recording\",function(){try{e.enableRecording(),(0,en.forEach)(e.definedRulesNames,function(s){var o=e[s],a=o.originalGrammarAction,l=void 0;e.TRACE_INIT(s+\" Rule\",function(){l=e.topLevelRuleRecord(s,a)}),e.gastProductionsCache[s]=l})}finally{e.disableRecording()}});var n=[];if(e.TRACE_INIT(\"Grammar Resolving\",function(){n=(0,sJ.resolveGrammar)({rules:(0,en.values)(e.gastProductionsCache)}),e.definitionErrors=e.definitionErrors.concat(n)}),e.TRACE_INIT(\"Grammar Validations\",function(){if((0,en.isEmpty)(n)&&e.skipValidations===!1){var s=(0,sJ.validateGrammar)({rules:(0,en.values)(e.gastProductionsCache),maxLookahead:e.maxLookahead,tokenTypes:(0,en.values)(e.tokensMap),errMsgProvider:aJ.defaultGrammarValidatorErrorProvider,grammarName:i});e.definitionErrors=e.definitionErrors.concat(s)}}),(0,en.isEmpty)(e.definitionErrors)&&(e.recoveryEnabled&&e.TRACE_INIT(\"computeAllProdsFollows\",function(){var s=(0,Gye.computeAllProdsFollows)((0,en.values)(e.gastProductionsCache));e.resyncFollows=s}),e.TRACE_INIT(\"ComputeLookaheadFunctions\",function(){e.preComputeLookaheadFunctions((0,en.values)(e.gastProductionsCache))})),!r.DEFER_DEFINITION_ERRORS_HANDLING&&!(0,en.isEmpty)(e.definitionErrors))throw t=(0,en.map)(e.definitionErrors,function(s){return s.message}),new Error(`Parser Definition Errors detected:\n `+t.join(`\n-------------------------------\n`))})},r.DEFER_DEFINITION_ERRORS_HANDLING=!1,r}();dr.Parser=ky;(0,$ye.applyMixins)(ky,[Yye.Recoverable,jye.LooksAhead,qye.TreeBuilder,Jye.LexerAdapter,zye.RecognizerEngine,Wye.RecognizerApi,Vye.ErrorHandler,Xye.ContentAssist,Zye.GastRecorder,_ye.PerformanceTracer]);var rwe=function(r){oJ(e,r);function e(t,i){i===void 0&&(i=dr.DEFAULT_PARSER_CONFIG);var n=this,s=(0,en.cloneObj)(i);return s.outputCst=!0,n=r.call(this,t,s)||this,n}return e}(ky);dr.CstParser=rwe;var iwe=function(r){oJ(e,r);function e(t,i){i===void 0&&(i=dr.DEFAULT_PARSER_CONFIG);var n=this,s=(0,en.cloneObj)(i);return s.outputCst=!1,n=r.call(this,t,s)||this,n}return e}(ky);dr.EmbeddedActionsParser=iwe});var lJ=w(Ry=>{\"use strict\";Object.defineProperty(Ry,\"__esModule\",{value:!0});Ry.createSyntaxDiagramsCode=void 0;var AJ=Dv();function nwe(r,e){var t=e===void 0?{}:e,i=t.resourceBase,n=i===void 0?\"https://unpkg.com/chevrotain@\"+AJ.VERSION+\"/diagrams/\":i,s=t.css,o=s===void 0?\"https://unpkg.com/chevrotain@\"+AJ.VERSION+\"/diagrams/diagrams.css\":s,a=`\n<!-- This is a generated file -->\n<!DOCTYPE html>\n<meta charset=\"utf-8\">\n<style>\n  body {\n    background-color: hsl(30, 20%, 95%)\n  }\n</style>\n\n`,l=`\n<link rel='stylesheet' href='`+o+`'>\n`,c=`\n<script src='`+n+`vendor/railroad-diagrams.js'><\\/script>\n<script src='`+n+`src/diagrams_builder.js'><\\/script>\n<script src='`+n+`src/diagrams_behavior.js'><\\/script>\n<script src='`+n+`src/main.js'><\\/script>\n`,u=`\n<div id=\"diagrams\" align=\"center\"></div>    \n`,g=`\n<script>\n    window.serializedGrammar = `+JSON.stringify(r,null,\"  \")+`;\n<\\/script>\n`,f=`\n<script>\n    var diagramsDiv = document.getElementById(\"diagrams\");\n    main.drawDiagramsFromSerializedGrammar(serializedGrammar, diagramsDiv);\n<\\/script>\n`;return a+l+c+u+g+f}Ry.createSyntaxDiagramsCode=nwe});var gJ=w(We=>{\"use strict\";Object.defineProperty(We,\"__esModule\",{value:!0});We.Parser=We.createSyntaxDiagramsCode=We.clearCache=We.GAstVisitor=We.serializeProduction=We.serializeGrammar=We.Terminal=We.Rule=We.RepetitionWithSeparator=We.RepetitionMandatoryWithSeparator=We.RepetitionMandatory=We.Repetition=We.Option=We.NonTerminal=We.Alternative=We.Alternation=We.defaultLexerErrorProvider=We.NoViableAltException=We.NotAllInputParsedException=We.MismatchedTokenException=We.isRecognitionException=We.EarlyExitException=We.defaultParserErrorProvider=We.tokenName=We.tokenMatcher=We.tokenLabel=We.EOF=We.createTokenInstance=We.createToken=We.LexerDefinitionErrorType=We.Lexer=We.EMPTY_ALT=We.ParserDefinitionErrorType=We.EmbeddedActionsParser=We.CstParser=We.VERSION=void 0;var swe=Dv();Object.defineProperty(We,\"VERSION\",{enumerable:!0,get:function(){return swe.VERSION}});var Fy=jn();Object.defineProperty(We,\"CstParser\",{enumerable:!0,get:function(){return Fy.CstParser}});Object.defineProperty(We,\"EmbeddedActionsParser\",{enumerable:!0,get:function(){return Fy.EmbeddedActionsParser}});Object.defineProperty(We,\"ParserDefinitionErrorType\",{enumerable:!0,get:function(){return Fy.ParserDefinitionErrorType}});Object.defineProperty(We,\"EMPTY_ALT\",{enumerable:!0,get:function(){return Fy.EMPTY_ALT}});var cJ=Bd();Object.defineProperty(We,\"Lexer\",{enumerable:!0,get:function(){return cJ.Lexer}});Object.defineProperty(We,\"LexerDefinitionErrorType\",{enumerable:!0,get:function(){return cJ.LexerDefinitionErrorType}});var af=LA();Object.defineProperty(We,\"createToken\",{enumerable:!0,get:function(){return af.createToken}});Object.defineProperty(We,\"createTokenInstance\",{enumerable:!0,get:function(){return af.createTokenInstance}});Object.defineProperty(We,\"EOF\",{enumerable:!0,get:function(){return af.EOF}});Object.defineProperty(We,\"tokenLabel\",{enumerable:!0,get:function(){return af.tokenLabel}});Object.defineProperty(We,\"tokenMatcher\",{enumerable:!0,get:function(){return af.tokenMatcher}});Object.defineProperty(We,\"tokenName\",{enumerable:!0,get:function(){return af.tokenName}});var owe=xd();Object.defineProperty(We,\"defaultParserErrorProvider\",{enumerable:!0,get:function(){return owe.defaultParserErrorProvider}});var Od=nf();Object.defineProperty(We,\"EarlyExitException\",{enumerable:!0,get:function(){return Od.EarlyExitException}});Object.defineProperty(We,\"isRecognitionException\",{enumerable:!0,get:function(){return Od.isRecognitionException}});Object.defineProperty(We,\"MismatchedTokenException\",{enumerable:!0,get:function(){return Od.MismatchedTokenException}});Object.defineProperty(We,\"NotAllInputParsedException\",{enumerable:!0,get:function(){return Od.NotAllInputParsedException}});Object.defineProperty(We,\"NoViableAltException\",{enumerable:!0,get:function(){return Od.NoViableAltException}});var awe=Uv();Object.defineProperty(We,\"defaultLexerErrorProvider\",{enumerable:!0,get:function(){return awe.defaultLexerErrorProvider}});var Oo=mn();Object.defineProperty(We,\"Alternation\",{enumerable:!0,get:function(){return Oo.Alternation}});Object.defineProperty(We,\"Alternative\",{enumerable:!0,get:function(){return Oo.Alternative}});Object.defineProperty(We,\"NonTerminal\",{enumerable:!0,get:function(){return Oo.NonTerminal}});Object.defineProperty(We,\"Option\",{enumerable:!0,get:function(){return Oo.Option}});Object.defineProperty(We,\"Repetition\",{enumerable:!0,get:function(){return Oo.Repetition}});Object.defineProperty(We,\"RepetitionMandatory\",{enumerable:!0,get:function(){return Oo.RepetitionMandatory}});Object.defineProperty(We,\"RepetitionMandatoryWithSeparator\",{enumerable:!0,get:function(){return Oo.RepetitionMandatoryWithSeparator}});Object.defineProperty(We,\"RepetitionWithSeparator\",{enumerable:!0,get:function(){return Oo.RepetitionWithSeparator}});Object.defineProperty(We,\"Rule\",{enumerable:!0,get:function(){return Oo.Rule}});Object.defineProperty(We,\"Terminal\",{enumerable:!0,get:function(){return Oo.Terminal}});var uJ=mn();Object.defineProperty(We,\"serializeGrammar\",{enumerable:!0,get:function(){return uJ.serializeGrammar}});Object.defineProperty(We,\"serializeProduction\",{enumerable:!0,get:function(){return uJ.serializeProduction}});var Awe=$g();Object.defineProperty(We,\"GAstVisitor\",{enumerable:!0,get:function(){return Awe.GAstVisitor}});function lwe(){console.warn(`The clearCache function was 'soft' removed from the Chevrotain API.\n\t It performs no action other than printing this message.\n\t Please avoid using it as it will be completely removed in the future`)}We.clearCache=lwe;var cwe=lJ();Object.defineProperty(We,\"createSyntaxDiagramsCode\",{enumerable:!0,get:function(){return cwe.createSyntaxDiagramsCode}});var uwe=function(){function r(){throw new Error(`The Parser class has been deprecated, use CstParser or EmbeddedActionsParser instead.\t\nSee: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_7-0-0`)}return r}();We.Parser=uwe});var pJ=w((jet,hJ)=>{var Ny=gJ(),Fa=Ny.createToken,fJ=Ny.tokenMatcher,ux=Ny.Lexer,gwe=Ny.EmbeddedActionsParser;hJ.exports=r=>{let e=Fa({name:\"LogicalOperator\",pattern:ux.NA}),t=Fa({name:\"Or\",pattern:/\\|/,categories:e}),i=Fa({name:\"Xor\",pattern:/\\^/,categories:e}),n=Fa({name:\"And\",pattern:/&/,categories:e}),s=Fa({name:\"Not\",pattern:/!/}),o=Fa({name:\"LParen\",pattern:/\\(/}),a=Fa({name:\"RParen\",pattern:/\\)/}),l=Fa({name:\"Query\",pattern:r}),u=[Fa({name:\"WhiteSpace\",pattern:/\\s+/,group:ux.SKIPPED}),t,i,n,o,a,s,e,l],g=new ux(u);class f extends gwe{constructor(p){super(u),this.RULE(\"expression\",()=>this.SUBRULE(this.logicalExpression)),this.RULE(\"logicalExpression\",()=>{let y=this.SUBRULE(this.atomicExpression);return this.MANY(()=>{let B=y,v=this.CONSUME(e),D=this.SUBRULE2(this.atomicExpression);fJ(v,t)?y=T=>B(T)||D(T):fJ(v,i)?y=T=>!!(B(T)^D(T)):y=T=>B(T)&&D(T)}),y}),this.RULE(\"atomicExpression\",()=>this.OR([{ALT:()=>this.SUBRULE(this.parenthesisExpression)},{ALT:()=>{let{image:C}=this.CONSUME(l);return y=>y(C)}},{ALT:()=>{this.CONSUME(s);let C=this.SUBRULE(this.atomicExpression);return y=>!C(y)}}])),this.RULE(\"parenthesisExpression\",()=>{let C;return this.CONSUME(o),C=this.SUBRULE(this.expression),this.CONSUME(a),C}),this.performSelfAnalysis()}}return{TinylogicLexer:g,TinylogicParser:f}}});var dJ=w(Ty=>{var fwe=pJ();Ty.makeParser=(r=/[a-z]+/)=>{let{TinylogicLexer:e,TinylogicParser:t}=fwe(r),i=new t;return(n,s)=>{let o=e.tokenize(n);return i.input=o.tokens,i.expression()(s)}};Ty.parse=Ty.makeParser()});var mJ=w((Jet,CJ)=>{\"use strict\";CJ.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}});var gx=w((Wet,IJ)=>{var Md=mJ(),EJ={};for(let r of Object.keys(Md))EJ[Md[r]]=r;var st={rgb:{channels:3,labels:\"rgb\"},hsl:{channels:3,labels:\"hsl\"},hsv:{channels:3,labels:\"hsv\"},hwb:{channels:3,labels:\"hwb\"},cmyk:{channels:4,labels:\"cmyk\"},xyz:{channels:3,labels:\"xyz\"},lab:{channels:3,labels:\"lab\"},lch:{channels:3,labels:\"lch\"},hex:{channels:1,labels:[\"hex\"]},keyword:{channels:1,labels:[\"keyword\"]},ansi16:{channels:1,labels:[\"ansi16\"]},ansi256:{channels:1,labels:[\"ansi256\"]},hcg:{channels:3,labels:[\"h\",\"c\",\"g\"]},apple:{channels:3,labels:[\"r16\",\"g16\",\"b16\"]},gray:{channels:1,labels:[\"gray\"]}};IJ.exports=st;for(let r of Object.keys(st)){if(!(\"channels\"in st[r]))throw new Error(\"missing channels property: \"+r);if(!(\"labels\"in st[r]))throw new Error(\"missing channel labels property: \"+r);if(st[r].labels.length!==st[r].channels)throw new Error(\"channel and label counts mismatch: \"+r);let{channels:e,labels:t}=st[r];delete st[r].channels,delete st[r].labels,Object.defineProperty(st[r],\"channels\",{value:e}),Object.defineProperty(st[r],\"labels\",{value:t})}st.rgb.hsl=function(r){let e=r[0]/255,t=r[1]/255,i=r[2]/255,n=Math.min(e,t,i),s=Math.max(e,t,i),o=s-n,a,l;s===n?a=0:e===s?a=(t-i)/o:t===s?a=2+(i-e)/o:i===s&&(a=4+(e-t)/o),a=Math.min(a*60,360),a<0&&(a+=360);let c=(n+s)/2;return s===n?l=0:c<=.5?l=o/(s+n):l=o/(2-s-n),[a,l*100,c*100]};st.rgb.hsv=function(r){let e,t,i,n,s,o=r[0]/255,a=r[1]/255,l=r[2]/255,c=Math.max(o,a,l),u=c-Math.min(o,a,l),g=function(f){return(c-f)/6/u+1/2};return u===0?(n=0,s=0):(s=u/c,e=g(o),t=g(a),i=g(l),o===c?n=i-t:a===c?n=1/3+e-i:l===c&&(n=2/3+t-e),n<0?n+=1:n>1&&(n-=1)),[n*360,s*100,c*100]};st.rgb.hwb=function(r){let e=r[0],t=r[1],i=r[2],n=st.rgb.hsl(r)[0],s=1/255*Math.min(e,Math.min(t,i));return i=1-1/255*Math.max(e,Math.max(t,i)),[n,s*100,i*100]};st.rgb.cmyk=function(r){let e=r[0]/255,t=r[1]/255,i=r[2]/255,n=Math.min(1-e,1-t,1-i),s=(1-e-n)/(1-n)||0,o=(1-t-n)/(1-n)||0,a=(1-i-n)/(1-n)||0;return[s*100,o*100,a*100,n*100]};function hwe(r,e){return(r[0]-e[0])**2+(r[1]-e[1])**2+(r[2]-e[2])**2}st.rgb.keyword=function(r){let e=EJ[r];if(e)return e;let t=1/0,i;for(let n of Object.keys(Md)){let s=Md[n],o=hwe(r,s);o<t&&(t=o,i=n)}return i};st.keyword.rgb=function(r){return Md[r]};st.rgb.xyz=function(r){let e=r[0]/255,t=r[1]/255,i=r[2]/255;e=e>.04045?((e+.055)/1.055)**2.4:e/12.92,t=t>.04045?((t+.055)/1.055)**2.4:t/12.92,i=i>.04045?((i+.055)/1.055)**2.4:i/12.92;let n=e*.4124+t*.3576+i*.1805,s=e*.2126+t*.7152+i*.0722,o=e*.0193+t*.1192+i*.9505;return[n*100,s*100,o*100]};st.rgb.lab=function(r){let e=st.rgb.xyz(r),t=e[0],i=e[1],n=e[2];t/=95.047,i/=100,n/=108.883,t=t>.008856?t**(1/3):7.787*t+16/116,i=i>.008856?i**(1/3):7.787*i+16/116,n=n>.008856?n**(1/3):7.787*n+16/116;let s=116*i-16,o=500*(t-i),a=200*(i-n);return[s,o,a]};st.hsl.rgb=function(r){let e=r[0]/360,t=r[1]/100,i=r[2]/100,n,s,o;if(t===0)return o=i*255,[o,o,o];i<.5?n=i*(1+t):n=i+t-i*t;let a=2*i-n,l=[0,0,0];for(let c=0;c<3;c++)s=e+1/3*-(c-1),s<0&&s++,s>1&&s--,6*s<1?o=a+(n-a)*6*s:2*s<1?o=n:3*s<2?o=a+(n-a)*(2/3-s)*6:o=a,l[c]=o*255;return l};st.hsl.hsv=function(r){let e=r[0],t=r[1]/100,i=r[2]/100,n=t,s=Math.max(i,.01);i*=2,t*=i<=1?i:2-i,n*=s<=1?s:2-s;let o=(i+t)/2,a=i===0?2*n/(s+n):2*t/(i+t);return[e,a*100,o*100]};st.hsv.rgb=function(r){let e=r[0]/60,t=r[1]/100,i=r[2]/100,n=Math.floor(e)%6,s=e-Math.floor(e),o=255*i*(1-t),a=255*i*(1-t*s),l=255*i*(1-t*(1-s));switch(i*=255,n){case 0:return[i,l,o];case 1:return[a,i,o];case 2:return[o,i,l];case 3:return[o,a,i];case 4:return[l,o,i];case 5:return[i,o,a]}};st.hsv.hsl=function(r){let e=r[0],t=r[1]/100,i=r[2]/100,n=Math.max(i,.01),s,o;o=(2-t)*i;let a=(2-t)*n;return s=t*n,s/=a<=1?a:2-a,s=s||0,o/=2,[e,s*100,o*100]};st.hwb.rgb=function(r){let e=r[0]/360,t=r[1]/100,i=r[2]/100,n=t+i,s;n>1&&(t/=n,i/=n);let o=Math.floor(6*e),a=1-i;s=6*e-o,(o&1)!==0&&(s=1-s);let l=t+s*(a-t),c,u,g;switch(o){default:case 6:case 0:c=a,u=l,g=t;break;case 1:c=l,u=a,g=t;break;case 2:c=t,u=a,g=l;break;case 3:c=t,u=l,g=a;break;case 4:c=l,u=t,g=a;break;case 5:c=a,u=t,g=l;break}return[c*255,u*255,g*255]};st.cmyk.rgb=function(r){let e=r[0]/100,t=r[1]/100,i=r[2]/100,n=r[3]/100,s=1-Math.min(1,e*(1-n)+n),o=1-Math.min(1,t*(1-n)+n),a=1-Math.min(1,i*(1-n)+n);return[s*255,o*255,a*255]};st.xyz.rgb=function(r){let e=r[0]/100,t=r[1]/100,i=r[2]/100,n,s,o;return n=e*3.2406+t*-1.5372+i*-.4986,s=e*-.9689+t*1.8758+i*.0415,o=e*.0557+t*-.204+i*1.057,n=n>.0031308?1.055*n**(1/2.4)-.055:n*12.92,s=s>.0031308?1.055*s**(1/2.4)-.055:s*12.92,o=o>.0031308?1.055*o**(1/2.4)-.055:o*12.92,n=Math.min(Math.max(0,n),1),s=Math.min(Math.max(0,s),1),o=Math.min(Math.max(0,o),1),[n*255,s*255,o*255]};st.xyz.lab=function(r){let e=r[0],t=r[1],i=r[2];e/=95.047,t/=100,i/=108.883,e=e>.008856?e**(1/3):7.787*e+16/116,t=t>.008856?t**(1/3):7.787*t+16/116,i=i>.008856?i**(1/3):7.787*i+16/116;let n=116*t-16,s=500*(e-t),o=200*(t-i);return[n,s,o]};st.lab.xyz=function(r){let e=r[0],t=r[1],i=r[2],n,s,o;s=(e+16)/116,n=t/500+s,o=s-i/200;let a=s**3,l=n**3,c=o**3;return s=a>.008856?a:(s-16/116)/7.787,n=l>.008856?l:(n-16/116)/7.787,o=c>.008856?c:(o-16/116)/7.787,n*=95.047,s*=100,o*=108.883,[n,s,o]};st.lab.lch=function(r){let e=r[0],t=r[1],i=r[2],n;n=Math.atan2(i,t)*360/2/Math.PI,n<0&&(n+=360);let o=Math.sqrt(t*t+i*i);return[e,o,n]};st.lch.lab=function(r){let e=r[0],t=r[1],n=r[2]/360*2*Math.PI,s=t*Math.cos(n),o=t*Math.sin(n);return[e,s,o]};st.rgb.ansi16=function(r,e=null){let[t,i,n]=r,s=e===null?st.rgb.hsv(r)[2]:e;if(s=Math.round(s/50),s===0)return 30;let o=30+(Math.round(n/255)<<2|Math.round(i/255)<<1|Math.round(t/255));return s===2&&(o+=60),o};st.hsv.ansi16=function(r){return st.rgb.ansi16(st.hsv.rgb(r),r[2])};st.rgb.ansi256=function(r){let e=r[0],t=r[1],i=r[2];return e===t&&t===i?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(t/255*5)+Math.round(i/255*5)};st.ansi16.rgb=function(r){let e=r%10;if(e===0||e===7)return r>50&&(e+=3.5),e=e/10.5*255,[e,e,e];let t=(~~(r>50)+1)*.5,i=(e&1)*t*255,n=(e>>1&1)*t*255,s=(e>>2&1)*t*255;return[i,n,s]};st.ansi256.rgb=function(r){if(r>=232){let s=(r-232)*10+8;return[s,s,s]}r-=16;let e,t=Math.floor(r/36)/5*255,i=Math.floor((e=r%36)/6)/5*255,n=e%6/5*255;return[t,i,n]};st.rgb.hex=function(r){let t=(((Math.round(r[0])&255)<<16)+((Math.round(r[1])&255)<<8)+(Math.round(r[2])&255)).toString(16).toUpperCase();return\"000000\".substring(t.length)+t};st.hex.rgb=function(r){let e=r.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!e)return[0,0,0];let t=e[0];e[0].length===3&&(t=t.split(\"\").map(a=>a+a).join(\"\"));let i=parseInt(t,16),n=i>>16&255,s=i>>8&255,o=i&255;return[n,s,o]};st.rgb.hcg=function(r){let e=r[0]/255,t=r[1]/255,i=r[2]/255,n=Math.max(Math.max(e,t),i),s=Math.min(Math.min(e,t),i),o=n-s,a,l;return o<1?a=s/(1-o):a=0,o<=0?l=0:n===e?l=(t-i)/o%6:n===t?l=2+(i-e)/o:l=4+(e-t)/o,l/=6,l%=1,[l*360,o*100,a*100]};st.hsl.hcg=function(r){let e=r[1]/100,t=r[2]/100,i=t<.5?2*e*t:2*e*(1-t),n=0;return i<1&&(n=(t-.5*i)/(1-i)),[r[0],i*100,n*100]};st.hsv.hcg=function(r){let e=r[1]/100,t=r[2]/100,i=e*t,n=0;return i<1&&(n=(t-i)/(1-i)),[r[0],i*100,n*100]};st.hcg.rgb=function(r){let e=r[0]/360,t=r[1]/100,i=r[2]/100;if(t===0)return[i*255,i*255,i*255];let n=[0,0,0],s=e%1*6,o=s%1,a=1-o,l=0;switch(Math.floor(s)){case 0:n[0]=1,n[1]=o,n[2]=0;break;case 1:n[0]=a,n[1]=1,n[2]=0;break;case 2:n[0]=0,n[1]=1,n[2]=o;break;case 3:n[0]=0,n[1]=a,n[2]=1;break;case 4:n[0]=o,n[1]=0,n[2]=1;break;default:n[0]=1,n[1]=0,n[2]=a}return l=(1-t)*i,[(t*n[0]+l)*255,(t*n[1]+l)*255,(t*n[2]+l)*255]};st.hcg.hsv=function(r){let e=r[1]/100,t=r[2]/100,i=e+t*(1-e),n=0;return i>0&&(n=e/i),[r[0],n*100,i*100]};st.hcg.hsl=function(r){let e=r[1]/100,i=r[2]/100*(1-e)+.5*e,n=0;return i>0&&i<.5?n=e/(2*i):i>=.5&&i<1&&(n=e/(2*(1-i))),[r[0],n*100,i*100]};st.hcg.hwb=function(r){let e=r[1]/100,t=r[2]/100,i=e+t*(1-e);return[r[0],(i-e)*100,(1-i)*100]};st.hwb.hcg=function(r){let e=r[1]/100,i=1-r[2]/100,n=i-e,s=0;return n<1&&(s=(i-n)/(1-n)),[r[0],n*100,s*100]};st.apple.rgb=function(r){return[r[0]/65535*255,r[1]/65535*255,r[2]/65535*255]};st.rgb.apple=function(r){return[r[0]/255*65535,r[1]/255*65535,r[2]/255*65535]};st.gray.rgb=function(r){return[r[0]/100*255,r[0]/100*255,r[0]/100*255]};st.gray.hsl=function(r){return[0,0,r[0]]};st.gray.hsv=st.gray.hsl;st.gray.hwb=function(r){return[0,100,r[0]]};st.gray.cmyk=function(r){return[0,0,0,r[0]]};st.gray.lab=function(r){return[r[0],0,0]};st.gray.hex=function(r){let e=Math.round(r[0]/100*255)&255,i=((e<<16)+(e<<8)+e).toString(16).toUpperCase();return\"000000\".substring(i.length)+i};st.rgb.gray=function(r){return[(r[0]+r[1]+r[2])/3/255*100]}});var wJ=w((zet,yJ)=>{var Ly=gx();function pwe(){let r={},e=Object.keys(Ly);for(let t=e.length,i=0;i<t;i++)r[e[i]]={distance:-1,parent:null};return r}function dwe(r){let e=pwe(),t=[r];for(e[r].distance=0;t.length;){let i=t.pop(),n=Object.keys(Ly[i]);for(let s=n.length,o=0;o<s;o++){let a=n[o],l=e[a];l.distance===-1&&(l.distance=e[i].distance+1,l.parent=i,t.unshift(a))}}return e}function Cwe(r,e){return function(t){return e(r(t))}}function mwe(r,e){let t=[e[r].parent,r],i=Ly[e[r].parent][r],n=e[r].parent;for(;e[n].parent;)t.unshift(e[n].parent),i=Cwe(Ly[e[n].parent][n],i),n=e[n].parent;return i.conversion=t,i}yJ.exports=function(r){let e=dwe(r),t={},i=Object.keys(e);for(let n=i.length,s=0;s<n;s++){let o=i[s];e[o].parent!==null&&(t[o]=mwe(o,e))}return t}});var QJ=w((Vet,BJ)=>{var fx=gx(),Ewe=wJ(),Af={},Iwe=Object.keys(fx);function ywe(r){let e=function(...t){let i=t[0];return i==null?i:(i.length>1&&(t=i),r(t))};return\"conversion\"in r&&(e.conversion=r.conversion),e}function wwe(r){let e=function(...t){let i=t[0];if(i==null)return i;i.length>1&&(t=i);let n=r(t);if(typeof n==\"object\")for(let s=n.length,o=0;o<s;o++)n[o]=Math.round(n[o]);return n};return\"conversion\"in r&&(e.conversion=r.conversion),e}Iwe.forEach(r=>{Af[r]={},Object.defineProperty(Af[r],\"channels\",{value:fx[r].channels}),Object.defineProperty(Af[r],\"labels\",{value:fx[r].labels});let e=Ewe(r);Object.keys(e).forEach(i=>{let n=e[i];Af[r][i]=wwe(n),Af[r][i].raw=ywe(n)})});BJ.exports=Af});var DJ=w((Xet,PJ)=>{\"use strict\";var bJ=(r,e)=>(...t)=>`\\x1B[${r(...t)+e}m`,SJ=(r,e)=>(...t)=>{let i=r(...t);return`\\x1B[${38+e};5;${i}m`},vJ=(r,e)=>(...t)=>{let i=r(...t);return`\\x1B[${38+e};2;${i[0]};${i[1]};${i[2]}m`},Oy=r=>r,xJ=(r,e,t)=>[r,e,t],lf=(r,e,t)=>{Object.defineProperty(r,e,{get:()=>{let i=t();return Object.defineProperty(r,e,{value:i,enumerable:!0,configurable:!0}),i},enumerable:!0,configurable:!0})},hx,cf=(r,e,t,i)=>{hx===void 0&&(hx=QJ());let n=i?10:0,s={};for(let[o,a]of Object.entries(hx)){let l=o===\"ansi16\"?\"ansi\":o;o===e?s[l]=r(t,n):typeof a==\"object\"&&(s[l]=r(a[e],n))}return s};function Bwe(){let r=new Map,e={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};e.color.gray=e.color.blackBright,e.bgColor.bgGray=e.bgColor.bgBlackBright,e.color.grey=e.color.blackBright,e.bgColor.bgGrey=e.bgColor.bgBlackBright;for(let[t,i]of Object.entries(e)){for(let[n,s]of Object.entries(i))e[n]={open:`\\x1B[${s[0]}m`,close:`\\x1B[${s[1]}m`},i[n]=e[n],r.set(s[0],s[1]);Object.defineProperty(e,t,{value:i,enumerable:!1})}return Object.defineProperty(e,\"codes\",{value:r,enumerable:!1}),e.color.close=\"\\x1B[39m\",e.bgColor.close=\"\\x1B[49m\",lf(e.color,\"ansi\",()=>cf(bJ,\"ansi16\",Oy,!1)),lf(e.color,\"ansi256\",()=>cf(SJ,\"ansi256\",Oy,!1)),lf(e.color,\"ansi16m\",()=>cf(vJ,\"rgb\",xJ,!1)),lf(e.bgColor,\"ansi\",()=>cf(bJ,\"ansi16\",Oy,!0)),lf(e.bgColor,\"ansi256\",()=>cf(SJ,\"ansi256\",Oy,!0)),lf(e.bgColor,\"ansi16m\",()=>cf(vJ,\"rgb\",xJ,!0)),e}Object.defineProperty(PJ,\"exports\",{enumerable:!0,get:Bwe})});var RJ=w((Zet,kJ)=>{\"use strict\";kJ.exports=(r,e=process.argv)=>{let t=r.startsWith(\"-\")?\"\":r.length===1?\"-\":\"--\",i=e.indexOf(t+r),n=e.indexOf(\"--\");return i!==-1&&(n===-1||i<n)}});var TJ=w((_et,NJ)=>{\"use strict\";var Qwe=J(\"os\"),FJ=J(\"tty\"),ds=RJ(),{env:ai}=process,UA;ds(\"no-color\")||ds(\"no-colors\")||ds(\"color=false\")||ds(\"color=never\")?UA=0:(ds(\"color\")||ds(\"colors\")||ds(\"color=true\")||ds(\"color=always\"))&&(UA=1);\"FORCE_COLOR\"in ai&&(ai.FORCE_COLOR===\"true\"?UA=1:ai.FORCE_COLOR===\"false\"?UA=0:UA=ai.FORCE_COLOR.length===0?1:Math.min(parseInt(ai.FORCE_COLOR,10),3));function px(r){return r===0?!1:{level:r,hasBasic:!0,has256:r>=2,has16m:r>=3}}function dx(r,e){if(UA===0)return 0;if(ds(\"color=16m\")||ds(\"color=full\")||ds(\"color=truecolor\"))return 3;if(ds(\"color=256\"))return 2;if(r&&!e&&UA===void 0)return 0;let t=UA||0;if(ai.TERM===\"dumb\")return t;if(process.platform===\"win32\"){let i=Qwe.release().split(\".\");return Number(i[0])>=10&&Number(i[2])>=10586?Number(i[2])>=14931?3:2:1}if(\"CI\"in ai)return[\"TRAVIS\",\"CIRCLECI\",\"APPVEYOR\",\"GITLAB_CI\"].some(i=>i in ai)||ai.CI_NAME===\"codeship\"?1:t;if(\"TEAMCITY_VERSION\"in ai)return/^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(ai.TEAMCITY_VERSION)?1:0;if(\"GITHUB_ACTIONS\"in ai)return 1;if(ai.COLORTERM===\"truecolor\")return 3;if(\"TERM_PROGRAM\"in ai){let i=parseInt((ai.TERM_PROGRAM_VERSION||\"\").split(\".\")[0],10);switch(ai.TERM_PROGRAM){case\"iTerm.app\":return i>=3?3:2;case\"Apple_Terminal\":return 2}}return/-256(color)?$/i.test(ai.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(ai.TERM)||\"COLORTERM\"in ai?1:t}function bwe(r){let e=dx(r,r&&r.isTTY);return px(e)}NJ.exports={supportsColor:bwe,stdout:px(dx(!0,FJ.isatty(1))),stderr:px(dx(!0,FJ.isatty(2)))}});var OJ=w(($et,LJ)=>{\"use strict\";var Swe=(r,e,t)=>{let i=r.indexOf(e);if(i===-1)return r;let n=e.length,s=0,o=\"\";do o+=r.substr(s,i-s)+e+t,s=i+n,i=r.indexOf(e,s);while(i!==-1);return o+=r.substr(s),o},vwe=(r,e,t,i)=>{let n=0,s=\"\";do{let o=r[i-1]===\"\\r\";s+=r.substr(n,(o?i-1:i)-n)+e+(o?`\\r\n`:`\n`)+t,n=i+1,i=r.indexOf(`\n`,n)}while(i!==-1);return s+=r.substr(n),s};LJ.exports={stringReplaceAll:Swe,stringEncaseCRLFWithFirstIndex:vwe}});var GJ=w((ett,HJ)=>{\"use strict\";var xwe=/(?:\\\\(u(?:[a-f\\d]{4}|\\{[a-f\\d]{1,6}\\})|x[a-f\\d]{2}|.))|(?:\\{(~)?(\\w+(?:\\([^)]*\\))?(?:\\.\\w+(?:\\([^)]*\\))?)*)(?:[ \\t]|(?=\\r?\\n)))|(\\})|((?:.|[\\r\\n\\f])+?)/gi,MJ=/(?:^|\\.)(\\w+)(?:\\(([^)]*)\\))?/g,Pwe=/^(['\"])((?:\\\\.|(?!\\1)[^\\\\])*)\\1$/,Dwe=/\\\\(u(?:[a-f\\d]{4}|\\{[a-f\\d]{1,6}\\})|x[a-f\\d]{2}|.)|([^\\\\])/gi,kwe=new Map([[\"n\",`\n`],[\"r\",\"\\r\"],[\"t\",\"\t\"],[\"b\",\"\\b\"],[\"f\",\"\\f\"],[\"v\",\"\\v\"],[\"0\",\"\\0\"],[\"\\\\\",\"\\\\\"],[\"e\",\"\\x1B\"],[\"a\",\"\\x07\"]]);function UJ(r){let e=r[0]===\"u\",t=r[1]===\"{\";return e&&!t&&r.length===5||r[0]===\"x\"&&r.length===3?String.fromCharCode(parseInt(r.slice(1),16)):e&&t?String.fromCodePoint(parseInt(r.slice(2,-1),16)):kwe.get(r)||r}function Rwe(r,e){let t=[],i=e.trim().split(/\\s*,\\s*/g),n;for(let s of i){let o=Number(s);if(!Number.isNaN(o))t.push(o);else if(n=s.match(Pwe))t.push(n[2].replace(Dwe,(a,l,c)=>l?UJ(l):c));else throw new Error(`Invalid Chalk template style argument: ${s} (in style '${r}')`)}return t}function Fwe(r){MJ.lastIndex=0;let e=[],t;for(;(t=MJ.exec(r))!==null;){let i=t[1];if(t[2]){let n=Rwe(i,t[2]);e.push([i].concat(n))}else e.push([i])}return e}function KJ(r,e){let t={};for(let n of e)for(let s of n.styles)t[s[0]]=n.inverse?null:s.slice(1);let i=r;for(let[n,s]of Object.entries(t))if(!!Array.isArray(s)){if(!(n in i))throw new Error(`Unknown Chalk style: ${n}`);i=s.length>0?i[n](...s):i[n]}return i}HJ.exports=(r,e)=>{let t=[],i=[],n=[];if(e.replace(xwe,(s,o,a,l,c,u)=>{if(o)n.push(UJ(o));else if(l){let g=n.join(\"\");n=[],i.push(t.length===0?g:KJ(r,t)(g)),t.push({inverse:a,styles:Fwe(l)})}else if(c){if(t.length===0)throw new Error(\"Found extraneous } in Chalk template literal\");i.push(KJ(r,t)(n.join(\"\"))),n=[],t.pop()}else n.push(u)}),i.push(n.join(\"\")),t.length>0){let s=`Chalk template literal is missing ${t.length} closing bracket${t.length===1?\"\":\"s\"} (\\`}\\`)`;throw new Error(s)}return i.join(\"\")}});var wx=w((ttt,JJ)=>{\"use strict\";var Kd=DJ(),{stdout:mx,stderr:Ex}=TJ(),{stringReplaceAll:Nwe,stringEncaseCRLFWithFirstIndex:Twe}=OJ(),YJ=[\"ansi\",\"ansi\",\"ansi256\",\"ansi16m\"],uf=Object.create(null),Lwe=(r,e={})=>{if(e.level>3||e.level<0)throw new Error(\"The `level` option should be an integer from 0 to 3\");let t=mx?mx.level:0;r.level=e.level===void 0?t:e.level},Ix=class{constructor(e){return jJ(e)}},jJ=r=>{let e={};return Lwe(e,r),e.template=(...t)=>Kwe(e.template,...t),Object.setPrototypeOf(e,My.prototype),Object.setPrototypeOf(e.template,e),e.template.constructor=()=>{throw new Error(\"`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.\")},e.template.Instance=Ix,e.template};function My(r){return jJ(r)}for(let[r,e]of Object.entries(Kd))uf[r]={get(){let t=Ky(this,yx(e.open,e.close,this._styler),this._isEmpty);return Object.defineProperty(this,r,{value:t}),t}};uf.visible={get(){let r=Ky(this,this._styler,!0);return Object.defineProperty(this,\"visible\",{value:r}),r}};var qJ=[\"rgb\",\"hex\",\"keyword\",\"hsl\",\"hsv\",\"hwb\",\"ansi\",\"ansi256\"];for(let r of qJ)uf[r]={get(){let{level:e}=this;return function(...t){let i=yx(Kd.color[YJ[e]][r](...t),Kd.color.close,this._styler);return Ky(this,i,this._isEmpty)}}};for(let r of qJ){let e=\"bg\"+r[0].toUpperCase()+r.slice(1);uf[e]={get(){let{level:t}=this;return function(...i){let n=yx(Kd.bgColor[YJ[t]][r](...i),Kd.bgColor.close,this._styler);return Ky(this,n,this._isEmpty)}}}}var Owe=Object.defineProperties(()=>{},{...uf,level:{enumerable:!0,get(){return this._generator.level},set(r){this._generator.level=r}}}),yx=(r,e,t)=>{let i,n;return t===void 0?(i=r,n=e):(i=t.openAll+r,n=e+t.closeAll),{open:r,close:e,openAll:i,closeAll:n,parent:t}},Ky=(r,e,t)=>{let i=(...n)=>Mwe(i,n.length===1?\"\"+n[0]:n.join(\" \"));return i.__proto__=Owe,i._generator=r,i._styler=e,i._isEmpty=t,i},Mwe=(r,e)=>{if(r.level<=0||!e)return r._isEmpty?\"\":e;let t=r._styler;if(t===void 0)return e;let{openAll:i,closeAll:n}=t;if(e.indexOf(\"\\x1B\")!==-1)for(;t!==void 0;)e=Nwe(e,t.close,t.open),t=t.parent;let s=e.indexOf(`\n`);return s!==-1&&(e=Twe(e,n,i,s)),i+e+n},Cx,Kwe=(r,...e)=>{let[t]=e;if(!Array.isArray(t))return e.join(\" \");let i=e.slice(1),n=[t.raw[0]];for(let s=1;s<t.length;s++)n.push(String(i[s-1]).replace(/[{}\\\\]/g,\"\\\\$&\"),String(t.raw[s]));return Cx===void 0&&(Cx=GJ()),Cx(r,n.join(\"\"))};Object.defineProperties(My.prototype,uf);var Ud=My();Ud.supportsColor=mx;Ud.stderr=My({level:Ex?Ex.level:0});Ud.stderr.supportsColor=Ex;Ud.Level={None:0,Basic:1,Ansi256:2,TrueColor:3,0:\"None\",1:\"Basic\",2:\"Ansi256\",3:\"TrueColor\"};JJ.exports=Ud});var Uy=w(Cs=>{\"use strict\";Cs.isInteger=r=>typeof r==\"number\"?Number.isInteger(r):typeof r==\"string\"&&r.trim()!==\"\"?Number.isInteger(Number(r)):!1;Cs.find=(r,e)=>r.nodes.find(t=>t.type===e);Cs.exceedsLimit=(r,e,t=1,i)=>i===!1||!Cs.isInteger(r)||!Cs.isInteger(e)?!1:(Number(e)-Number(r))/Number(t)>=i;Cs.escapeNode=(r,e=0,t)=>{let i=r.nodes[e];!i||(t&&i.type===t||i.type===\"open\"||i.type===\"close\")&&i.escaped!==!0&&(i.value=\"\\\\\"+i.value,i.escaped=!0)};Cs.encloseBrace=r=>r.type!==\"brace\"?!1:r.commas>>0+r.ranges>>0===0?(r.invalid=!0,!0):!1;Cs.isInvalidBrace=r=>r.type!==\"brace\"?!1:r.invalid===!0||r.dollar?!0:r.commas>>0+r.ranges>>0===0||r.open!==!0||r.close!==!0?(r.invalid=!0,!0):!1;Cs.isOpenOrClose=r=>r.type===\"open\"||r.type===\"close\"?!0:r.open===!0||r.close===!0;Cs.reduce=r=>r.reduce((e,t)=>(t.type===\"text\"&&e.push(t.value),t.type===\"range\"&&(t.type=\"text\"),e),[]);Cs.flatten=(...r)=>{let e=[],t=i=>{for(let n=0;n<i.length;n++){let s=i[n];Array.isArray(s)?t(s,e):s!==void 0&&e.push(s)}return e};return t(r),e}});var Hy=w((itt,zJ)=>{\"use strict\";var WJ=Uy();zJ.exports=(r,e={})=>{let t=(i,n={})=>{let s=e.escapeInvalid&&WJ.isInvalidBrace(n),o=i.invalid===!0&&e.escapeInvalid===!0,a=\"\";if(i.value)return(s||o)&&WJ.isOpenOrClose(i)?\"\\\\\"+i.value:i.value;if(i.value)return i.value;if(i.nodes)for(let l of i.nodes)a+=t(l);return a};return t(r)}});var XJ=w((ntt,VJ)=>{\"use strict\";VJ.exports=function(r){return typeof r==\"number\"?r-r===0:typeof r==\"string\"&&r.trim()!==\"\"?Number.isFinite?Number.isFinite(+r):isFinite(+r):!1}});var s3=w((stt,n3)=>{\"use strict\";var ZJ=XJ(),Ic=(r,e,t)=>{if(ZJ(r)===!1)throw new TypeError(\"toRegexRange: expected the first argument to be a number\");if(e===void 0||r===e)return String(r);if(ZJ(e)===!1)throw new TypeError(\"toRegexRange: expected the second argument to be a number.\");let i={relaxZeros:!0,...t};typeof i.strictZeros==\"boolean\"&&(i.relaxZeros=i.strictZeros===!1);let n=String(i.relaxZeros),s=String(i.shorthand),o=String(i.capture),a=String(i.wrap),l=r+\":\"+e+\"=\"+n+s+o+a;if(Ic.cache.hasOwnProperty(l))return Ic.cache[l].result;let c=Math.min(r,e),u=Math.max(r,e);if(Math.abs(c-u)===1){let C=r+\"|\"+e;return i.capture?`(${C})`:i.wrap===!1?C:`(?:${C})`}let g=i3(r)||i3(e),f={min:r,max:e,a:c,b:u},h=[],p=[];if(g&&(f.isPadded=g,f.maxLen=String(f.max).length),c<0){let C=u<0?Math.abs(u):1;p=_J(C,Math.abs(c),f,i),c=f.a=0}return u>=0&&(h=_J(c,u,f,i)),f.negatives=p,f.positives=h,f.result=Uwe(p,h,i),i.capture===!0?f.result=`(${f.result})`:i.wrap!==!1&&h.length+p.length>1&&(f.result=`(?:${f.result})`),Ic.cache[l]=f,f.result};function Uwe(r,e,t){let i=Bx(r,e,\"-\",!1,t)||[],n=Bx(e,r,\"\",!1,t)||[],s=Bx(r,e,\"-?\",!0,t)||[];return i.concat(s).concat(n).join(\"|\")}function Hwe(r,e){let t=1,i=1,n=e3(r,t),s=new Set([e]);for(;r<=n&&n<=e;)s.add(n),t+=1,n=e3(r,t);for(n=t3(e+1,i)-1;r<n&&n<=e;)s.add(n),i+=1,n=t3(e+1,i)-1;return s=[...s],s.sort(jwe),s}function Gwe(r,e,t){if(r===e)return{pattern:r,count:[],digits:0};let i=Ywe(r,e),n=i.length,s=\"\",o=0;for(let a=0;a<n;a++){let[l,c]=i[a];l===c?s+=l:l!==\"0\"||c!==\"9\"?s+=qwe(l,c,t):o++}return o&&(s+=t.shorthand===!0?\"\\\\d\":\"[0-9]\"),{pattern:s,count:[o],digits:n}}function _J(r,e,t,i){let n=Hwe(r,e),s=[],o=r,a;for(let l=0;l<n.length;l++){let c=n[l],u=Gwe(String(o),String(c),i),g=\"\";if(!t.isPadded&&a&&a.pattern===u.pattern){a.count.length>1&&a.count.pop(),a.count.push(u.count[0]),a.string=a.pattern+r3(a.count),o=c+1;continue}t.isPadded&&(g=Jwe(c,t,i)),u.string=g+u.pattern+r3(u.count),s.push(u),o=c+1,a=u}return s}function Bx(r,e,t,i,n){let s=[];for(let o of r){let{string:a}=o;!i&&!$J(e,\"string\",a)&&s.push(t+a),i&&$J(e,\"string\",a)&&s.push(t+a)}return s}function Ywe(r,e){let t=[];for(let i=0;i<r.length;i++)t.push([r[i],e[i]]);return t}function jwe(r,e){return r>e?1:e>r?-1:0}function $J(r,e,t){return r.some(i=>i[e]===t)}function e3(r,e){return Number(String(r).slice(0,-e)+\"9\".repeat(e))}function t3(r,e){return r-r%Math.pow(10,e)}function r3(r){let[e=0,t=\"\"]=r;return t||e>1?`{${e+(t?\",\"+t:\"\")}}`:\"\"}function qwe(r,e,t){return`[${r}${e-r===1?\"\":\"-\"}${e}]`}function i3(r){return/^-?(0+)\\d/.test(r)}function Jwe(r,e,t){if(!e.isPadded)return r;let i=Math.abs(e.maxLen-String(r).length),n=t.relaxZeros!==!1;switch(i){case 0:return\"\";case 1:return n?\"0?\":\"0\";case 2:return n?\"0{0,2}\":\"00\";default:return n?`0{0,${i}}`:`0{${i}}`}}Ic.cache={};Ic.clearCache=()=>Ic.cache={};n3.exports=Ic});var Sx=w((ott,f3)=>{\"use strict\";var Wwe=J(\"util\"),A3=s3(),o3=r=>r!==null&&typeof r==\"object\"&&!Array.isArray(r),zwe=r=>e=>r===!0?Number(e):String(e),Qx=r=>typeof r==\"number\"||typeof r==\"string\"&&r!==\"\",Hd=r=>Number.isInteger(+r),bx=r=>{let e=`${r}`,t=-1;if(e[0]===\"-\"&&(e=e.slice(1)),e===\"0\")return!1;for(;e[++t]===\"0\";);return t>0},Vwe=(r,e,t)=>typeof r==\"string\"||typeof e==\"string\"?!0:t.stringify===!0,Xwe=(r,e,t)=>{if(e>0){let i=r[0]===\"-\"?\"-\":\"\";i&&(r=r.slice(1)),r=i+r.padStart(i?e-1:e,\"0\")}return t===!1?String(r):r},a3=(r,e)=>{let t=r[0]===\"-\"?\"-\":\"\";for(t&&(r=r.slice(1),e--);r.length<e;)r=\"0\"+r;return t?\"-\"+r:r},Zwe=(r,e)=>{r.negatives.sort((o,a)=>o<a?-1:o>a?1:0),r.positives.sort((o,a)=>o<a?-1:o>a?1:0);let t=e.capture?\"\":\"?:\",i=\"\",n=\"\",s;return r.positives.length&&(i=r.positives.join(\"|\")),r.negatives.length&&(n=`-(${t}${r.negatives.join(\"|\")})`),i&&n?s=`${i}|${n}`:s=i||n,e.wrap?`(${t}${s})`:s},l3=(r,e,t,i)=>{if(t)return A3(r,e,{wrap:!1,...i});let n=String.fromCharCode(r);if(r===e)return n;let s=String.fromCharCode(e);return`[${n}-${s}]`},c3=(r,e,t)=>{if(Array.isArray(r)){let i=t.wrap===!0,n=t.capture?\"\":\"?:\";return i?`(${n}${r.join(\"|\")})`:r.join(\"|\")}return A3(r,e,t)},u3=(...r)=>new RangeError(\"Invalid range arguments: \"+Wwe.inspect(...r)),g3=(r,e,t)=>{if(t.strictRanges===!0)throw u3([r,e]);return[]},_we=(r,e)=>{if(e.strictRanges===!0)throw new TypeError(`Expected step \"${r}\" to be a number`);return[]},$we=(r,e,t=1,i={})=>{let n=Number(r),s=Number(e);if(!Number.isInteger(n)||!Number.isInteger(s)){if(i.strictRanges===!0)throw u3([r,e]);return[]}n===0&&(n=0),s===0&&(s=0);let o=n>s,a=String(r),l=String(e),c=String(t);t=Math.max(Math.abs(t),1);let u=bx(a)||bx(l)||bx(c),g=u?Math.max(a.length,l.length,c.length):0,f=u===!1&&Vwe(r,e,i)===!1,h=i.transform||zwe(f);if(i.toRegex&&t===1)return l3(a3(r,g),a3(e,g),!0,i);let p={negatives:[],positives:[]},C=v=>p[v<0?\"negatives\":\"positives\"].push(Math.abs(v)),y=[],B=0;for(;o?n>=s:n<=s;)i.toRegex===!0&&t>1?C(n):y.push(Xwe(h(n,B),g,f)),n=o?n-t:n+t,B++;return i.toRegex===!0?t>1?Zwe(p,i):c3(y,null,{wrap:!1,...i}):y},eBe=(r,e,t=1,i={})=>{if(!Hd(r)&&r.length>1||!Hd(e)&&e.length>1)return g3(r,e,i);let n=i.transform||(f=>String.fromCharCode(f)),s=`${r}`.charCodeAt(0),o=`${e}`.charCodeAt(0),a=s>o,l=Math.min(s,o),c=Math.max(s,o);if(i.toRegex&&t===1)return l3(l,c,!1,i);let u=[],g=0;for(;a?s>=o:s<=o;)u.push(n(s,g)),s=a?s-t:s+t,g++;return i.toRegex===!0?c3(u,null,{wrap:!1,options:i}):u},Gy=(r,e,t,i={})=>{if(e==null&&Qx(r))return[r];if(!Qx(r)||!Qx(e))return g3(r,e,i);if(typeof t==\"function\")return Gy(r,e,1,{transform:t});if(o3(t))return Gy(r,e,0,t);let n={...i};return n.capture===!0&&(n.wrap=!0),t=t||n.step||1,Hd(t)?Hd(r)&&Hd(e)?$we(r,e,t,n):eBe(r,e,Math.max(Math.abs(t),1),n):t!=null&&!o3(t)?_we(t,n):Gy(r,e,1,t)};f3.exports=Gy});var d3=w((att,p3)=>{\"use strict\";var tBe=Sx(),h3=Uy(),rBe=(r,e={})=>{let t=(i,n={})=>{let s=h3.isInvalidBrace(n),o=i.invalid===!0&&e.escapeInvalid===!0,a=s===!0||o===!0,l=e.escapeInvalid===!0?\"\\\\\":\"\",c=\"\";if(i.isOpen===!0||i.isClose===!0)return l+i.value;if(i.type===\"open\")return a?l+i.value:\"(\";if(i.type===\"close\")return a?l+i.value:\")\";if(i.type===\"comma\")return i.prev.type===\"comma\"?\"\":a?i.value:\"|\";if(i.value)return i.value;if(i.nodes&&i.ranges>0){let u=h3.reduce(i.nodes),g=tBe(...u,{...e,wrap:!1,toRegex:!0});if(g.length!==0)return u.length>1&&g.length>1?`(${g})`:g}if(i.nodes)for(let u of i.nodes)c+=t(u,i);return c};return t(r)};p3.exports=rBe});var E3=w((Att,m3)=>{\"use strict\";var iBe=Sx(),C3=Hy(),gf=Uy(),yc=(r=\"\",e=\"\",t=!1)=>{let i=[];if(r=[].concat(r),e=[].concat(e),!e.length)return r;if(!r.length)return t?gf.flatten(e).map(n=>`{${n}}`):e;for(let n of r)if(Array.isArray(n))for(let s of n)i.push(yc(s,e,t));else for(let s of e)t===!0&&typeof s==\"string\"&&(s=`{${s}}`),i.push(Array.isArray(s)?yc(n,s,t):n+s);return gf.flatten(i)},nBe=(r,e={})=>{let t=e.rangeLimit===void 0?1e3:e.rangeLimit,i=(n,s={})=>{n.queue=[];let o=s,a=s.queue;for(;o.type!==\"brace\"&&o.type!==\"root\"&&o.parent;)o=o.parent,a=o.queue;if(n.invalid||n.dollar){a.push(yc(a.pop(),C3(n,e)));return}if(n.type===\"brace\"&&n.invalid!==!0&&n.nodes.length===2){a.push(yc(a.pop(),[\"{}\"]));return}if(n.nodes&&n.ranges>0){let g=gf.reduce(n.nodes);if(gf.exceedsLimit(...g,e.step,t))throw new RangeError(\"expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.\");let f=iBe(...g,e);f.length===0&&(f=C3(n,e)),a.push(yc(a.pop(),f)),n.nodes=[];return}let l=gf.encloseBrace(n),c=n.queue,u=n;for(;u.type!==\"brace\"&&u.type!==\"root\"&&u.parent;)u=u.parent,c=u.queue;for(let g=0;g<n.nodes.length;g++){let f=n.nodes[g];if(f.type===\"comma\"&&n.type===\"brace\"){g===1&&c.push(\"\"),c.push(\"\");continue}if(f.type===\"close\"){a.push(yc(a.pop(),c,l));continue}if(f.value&&f.type!==\"open\"){c.push(yc(c.pop(),f.value));continue}f.nodes&&i(f,n)}return c};return gf.flatten(i(r))};m3.exports=nBe});var y3=w((ltt,I3)=>{\"use strict\";I3.exports={MAX_LENGTH:1024*64,CHAR_0:\"0\",CHAR_9:\"9\",CHAR_UPPERCASE_A:\"A\",CHAR_LOWERCASE_A:\"a\",CHAR_UPPERCASE_Z:\"Z\",CHAR_LOWERCASE_Z:\"z\",CHAR_LEFT_PARENTHESES:\"(\",CHAR_RIGHT_PARENTHESES:\")\",CHAR_ASTERISK:\"*\",CHAR_AMPERSAND:\"&\",CHAR_AT:\"@\",CHAR_BACKSLASH:\"\\\\\",CHAR_BACKTICK:\"`\",CHAR_CARRIAGE_RETURN:\"\\r\",CHAR_CIRCUMFLEX_ACCENT:\"^\",CHAR_COLON:\":\",CHAR_COMMA:\",\",CHAR_DOLLAR:\"$\",CHAR_DOT:\".\",CHAR_DOUBLE_QUOTE:'\"',CHAR_EQUAL:\"=\",CHAR_EXCLAMATION_MARK:\"!\",CHAR_FORM_FEED:\"\\f\",CHAR_FORWARD_SLASH:\"/\",CHAR_HASH:\"#\",CHAR_HYPHEN_MINUS:\"-\",CHAR_LEFT_ANGLE_BRACKET:\"<\",CHAR_LEFT_CURLY_BRACE:\"{\",CHAR_LEFT_SQUARE_BRACKET:\"[\",CHAR_LINE_FEED:`\n`,CHAR_NO_BREAK_SPACE:\"\\xA0\",CHAR_PERCENT:\"%\",CHAR_PLUS:\"+\",CHAR_QUESTION_MARK:\"?\",CHAR_RIGHT_ANGLE_BRACKET:\">\",CHAR_RIGHT_CURLY_BRACE:\"}\",CHAR_RIGHT_SQUARE_BRACKET:\"]\",CHAR_SEMICOLON:\";\",CHAR_SINGLE_QUOTE:\"'\",CHAR_SPACE:\" \",CHAR_TAB:\"\t\",CHAR_UNDERSCORE:\"_\",CHAR_VERTICAL_LINE:\"|\",CHAR_ZERO_WIDTH_NOBREAK_SPACE:\"\\uFEFF\"}});var S3=w((ctt,b3)=>{\"use strict\";var sBe=Hy(),{MAX_LENGTH:w3,CHAR_BACKSLASH:vx,CHAR_BACKTICK:oBe,CHAR_COMMA:aBe,CHAR_DOT:ABe,CHAR_LEFT_PARENTHESES:lBe,CHAR_RIGHT_PARENTHESES:cBe,CHAR_LEFT_CURLY_BRACE:uBe,CHAR_RIGHT_CURLY_BRACE:gBe,CHAR_LEFT_SQUARE_BRACKET:B3,CHAR_RIGHT_SQUARE_BRACKET:Q3,CHAR_DOUBLE_QUOTE:fBe,CHAR_SINGLE_QUOTE:hBe,CHAR_NO_BREAK_SPACE:pBe,CHAR_ZERO_WIDTH_NOBREAK_SPACE:dBe}=y3(),CBe=(r,e={})=>{if(typeof r!=\"string\")throw new TypeError(\"Expected a string\");let t=e||{},i=typeof t.maxLength==\"number\"?Math.min(w3,t.maxLength):w3;if(r.length>i)throw new SyntaxError(`Input length (${r.length}), exceeds max characters (${i})`);let n={type:\"root\",input:r,nodes:[]},s=[n],o=n,a=n,l=0,c=r.length,u=0,g=0,f,h={},p=()=>r[u++],C=y=>{if(y.type===\"text\"&&a.type===\"dot\"&&(a.type=\"text\"),a&&a.type===\"text\"&&y.type===\"text\"){a.value+=y.value;return}return o.nodes.push(y),y.parent=o,y.prev=a,a=y,y};for(C({type:\"bos\"});u<c;)if(o=s[s.length-1],f=p(),!(f===dBe||f===pBe)){if(f===vx){C({type:\"text\",value:(e.keepEscaping?f:\"\")+p()});continue}if(f===Q3){C({type:\"text\",value:\"\\\\\"+f});continue}if(f===B3){l++;let y=!0,B;for(;u<c&&(B=p());){if(f+=B,B===B3){l++;continue}if(B===vx){f+=p();continue}if(B===Q3&&(l--,l===0))break}C({type:\"text\",value:f});continue}if(f===lBe){o=C({type:\"paren\",nodes:[]}),s.push(o),C({type:\"text\",value:f});continue}if(f===cBe){if(o.type!==\"paren\"){C({type:\"text\",value:f});continue}o=s.pop(),C({type:\"text\",value:f}),o=s[s.length-1];continue}if(f===fBe||f===hBe||f===oBe){let y=f,B;for(e.keepQuotes!==!0&&(f=\"\");u<c&&(B=p());){if(B===vx){f+=B+p();continue}if(B===y){e.keepQuotes===!0&&(f+=B);break}f+=B}C({type:\"text\",value:f});continue}if(f===uBe){g++;let B={type:\"brace\",open:!0,close:!1,dollar:a.value&&a.value.slice(-1)===\"$\"||o.dollar===!0,depth:g,commas:0,ranges:0,nodes:[]};o=C(B),s.push(o),C({type:\"open\",value:f});continue}if(f===gBe){if(o.type!==\"brace\"){C({type:\"text\",value:f});continue}let y=\"close\";o=s.pop(),o.close=!0,C({type:y,value:f}),g--,o=s[s.length-1];continue}if(f===aBe&&g>0){if(o.ranges>0){o.ranges=0;let y=o.nodes.shift();o.nodes=[y,{type:\"text\",value:sBe(o)}]}C({type:\"comma\",value:f}),o.commas++;continue}if(f===ABe&&g>0&&o.commas===0){let y=o.nodes;if(g===0||y.length===0){C({type:\"text\",value:f});continue}if(a.type===\"dot\"){if(o.range=[],a.value+=f,a.type=\"range\",o.nodes.length!==3&&o.nodes.length!==5){o.invalid=!0,o.ranges=0,a.type=\"text\";continue}o.ranges++,o.args=[];continue}if(a.type===\"range\"){y.pop();let B=y[y.length-1];B.value+=a.value+f,a=B,o.ranges--;continue}C({type:\"dot\",value:f});continue}C({type:\"text\",value:f})}do if(o=s.pop(),o.type!==\"root\"){o.nodes.forEach(v=>{v.nodes||(v.type===\"open\"&&(v.isOpen=!0),v.type===\"close\"&&(v.isClose=!0),v.nodes||(v.type=\"text\"),v.invalid=!0)});let y=s[s.length-1],B=y.nodes.indexOf(o);y.nodes.splice(B,1,...o.nodes)}while(s.length>0);return C({type:\"eos\"}),n};b3.exports=CBe});var P3=w((utt,x3)=>{\"use strict\";var v3=Hy(),mBe=d3(),EBe=E3(),IBe=S3(),Jn=(r,e={})=>{let t=[];if(Array.isArray(r))for(let i of r){let n=Jn.create(i,e);Array.isArray(n)?t.push(...n):t.push(n)}else t=[].concat(Jn.create(r,e));return e&&e.expand===!0&&e.nodupes===!0&&(t=[...new Set(t)]),t};Jn.parse=(r,e={})=>IBe(r,e);Jn.stringify=(r,e={})=>v3(typeof r==\"string\"?Jn.parse(r,e):r,e);Jn.compile=(r,e={})=>(typeof r==\"string\"&&(r=Jn.parse(r,e)),mBe(r,e));Jn.expand=(r,e={})=>{typeof r==\"string\"&&(r=Jn.parse(r,e));let t=EBe(r,e);return e.noempty===!0&&(t=t.filter(Boolean)),e.nodupes===!0&&(t=[...new Set(t)]),t};Jn.create=(r,e={})=>r===\"\"||r.length<3?[r]:e.expand!==!0?Jn.compile(r,e):Jn.expand(r,e);x3.exports=Jn});var Gd=w((gtt,N3)=>{\"use strict\";var yBe=J(\"path\"),Mo=\"\\\\\\\\/\",D3=`[^${Mo}]`,Na=\"\\\\.\",wBe=\"\\\\+\",BBe=\"\\\\?\",Yy=\"\\\\/\",QBe=\"(?=.)\",k3=\"[^/]\",xx=`(?:${Yy}|$)`,R3=`(?:^|${Yy})`,Px=`${Na}{1,2}${xx}`,bBe=`(?!${Na})`,SBe=`(?!${R3}${Px})`,vBe=`(?!${Na}{0,1}${xx})`,xBe=`(?!${Px})`,PBe=`[^.${Yy}]`,DBe=`${k3}*?`,F3={DOT_LITERAL:Na,PLUS_LITERAL:wBe,QMARK_LITERAL:BBe,SLASH_LITERAL:Yy,ONE_CHAR:QBe,QMARK:k3,END_ANCHOR:xx,DOTS_SLASH:Px,NO_DOT:bBe,NO_DOTS:SBe,NO_DOT_SLASH:vBe,NO_DOTS_SLASH:xBe,QMARK_NO_DOT:PBe,STAR:DBe,START_ANCHOR:R3},kBe={...F3,SLASH_LITERAL:`[${Mo}]`,QMARK:D3,STAR:`${D3}*?`,DOTS_SLASH:`${Na}{1,2}(?:[${Mo}]|$)`,NO_DOT:`(?!${Na})`,NO_DOTS:`(?!(?:^|[${Mo}])${Na}{1,2}(?:[${Mo}]|$))`,NO_DOT_SLASH:`(?!${Na}{0,1}(?:[${Mo}]|$))`,NO_DOTS_SLASH:`(?!${Na}{1,2}(?:[${Mo}]|$))`,QMARK_NO_DOT:`[^.${Mo}]`,START_ANCHOR:`(?:^|[${Mo}])`,END_ANCHOR:`(?:[${Mo}]|$)`},RBe={alnum:\"a-zA-Z0-9\",alpha:\"a-zA-Z\",ascii:\"\\\\x00-\\\\x7F\",blank:\" \\\\t\",cntrl:\"\\\\x00-\\\\x1F\\\\x7F\",digit:\"0-9\",graph:\"\\\\x21-\\\\x7E\",lower:\"a-z\",print:\"\\\\x20-\\\\x7E \",punct:\"\\\\-!\\\"#$%&'()\\\\*+,./:;<=>?@[\\\\]^_`{|}~\",space:\" \\\\t\\\\r\\\\n\\\\v\\\\f\",upper:\"A-Z\",word:\"A-Za-z0-9_\",xdigit:\"A-Fa-f0-9\"};N3.exports={MAX_LENGTH:1024*64,POSIX_REGEX_SOURCE:RBe,REGEX_BACKSLASH:/\\\\(?![*+?^${}(|)[\\]])/g,REGEX_NON_SPECIAL_CHARS:/^[^@![\\].,$*+?^{}()|\\\\/]+/,REGEX_SPECIAL_CHARS:/[-*+?.^${}(|)[\\]]/,REGEX_SPECIAL_CHARS_BACKREF:/(\\\\?)((\\W)(\\3*))/g,REGEX_SPECIAL_CHARS_GLOBAL:/([-*+?.^${}(|)[\\]])/g,REGEX_REMOVE_BACKSLASH:/(?:\\[.*?[^\\\\]\\]|\\\\(?=.))/g,REPLACEMENTS:{\"***\":\"*\",\"**/**\":\"**\",\"**/**/**\":\"**\"},CHAR_0:48,CHAR_9:57,CHAR_UPPERCASE_A:65,CHAR_LOWERCASE_A:97,CHAR_UPPERCASE_Z:90,CHAR_LOWERCASE_Z:122,CHAR_LEFT_PARENTHESES:40,CHAR_RIGHT_PARENTHESES:41,CHAR_ASTERISK:42,CHAR_AMPERSAND:38,CHAR_AT:64,CHAR_BACKWARD_SLASH:92,CHAR_CARRIAGE_RETURN:13,CHAR_CIRCUMFLEX_ACCENT:94,CHAR_COLON:58,CHAR_COMMA:44,CHAR_DOT:46,CHAR_DOUBLE_QUOTE:34,CHAR_EQUAL:61,CHAR_EXCLAMATION_MARK:33,CHAR_FORM_FEED:12,CHAR_FORWARD_SLASH:47,CHAR_GRAVE_ACCENT:96,CHAR_HASH:35,CHAR_HYPHEN_MINUS:45,CHAR_LEFT_ANGLE_BRACKET:60,CHAR_LEFT_CURLY_BRACE:123,CHAR_LEFT_SQUARE_BRACKET:91,CHAR_LINE_FEED:10,CHAR_NO_BREAK_SPACE:160,CHAR_PERCENT:37,CHAR_PLUS:43,CHAR_QUESTION_MARK:63,CHAR_RIGHT_ANGLE_BRACKET:62,CHAR_RIGHT_CURLY_BRACE:125,CHAR_RIGHT_SQUARE_BRACKET:93,CHAR_SEMICOLON:59,CHAR_SINGLE_QUOTE:39,CHAR_SPACE:32,CHAR_TAB:9,CHAR_UNDERSCORE:95,CHAR_VERTICAL_LINE:124,CHAR_ZERO_WIDTH_NOBREAK_SPACE:65279,SEP:yBe.sep,extglobChars(r){return{\"!\":{type:\"negate\",open:\"(?:(?!(?:\",close:`))${r.STAR})`},\"?\":{type:\"qmark\",open:\"(?:\",close:\")?\"},\"+\":{type:\"plus\",open:\"(?:\",close:\")+\"},\"*\":{type:\"star\",open:\"(?:\",close:\")*\"},\"@\":{type:\"at\",open:\"(?:\",close:\")\"}}},globChars(r){return r===!0?kBe:F3}}});var Yd=w(wn=>{\"use strict\";var FBe=J(\"path\"),NBe=process.platform===\"win32\",{REGEX_BACKSLASH:TBe,REGEX_REMOVE_BACKSLASH:LBe,REGEX_SPECIAL_CHARS:OBe,REGEX_SPECIAL_CHARS_GLOBAL:MBe}=Gd();wn.isObject=r=>r!==null&&typeof r==\"object\"&&!Array.isArray(r);wn.hasRegexChars=r=>OBe.test(r);wn.isRegexChar=r=>r.length===1&&wn.hasRegexChars(r);wn.escapeRegex=r=>r.replace(MBe,\"\\\\$1\");wn.toPosixSlashes=r=>r.replace(TBe,\"/\");wn.removeBackslashes=r=>r.replace(LBe,e=>e===\"\\\\\"?\"\":e);wn.supportsLookbehinds=()=>{let r=process.version.slice(1).split(\".\").map(Number);return r.length===3&&r[0]>=9||r[0]===8&&r[1]>=10};wn.isWindows=r=>r&&typeof r.windows==\"boolean\"?r.windows:NBe===!0||FBe.sep===\"\\\\\";wn.escapeLast=(r,e,t)=>{let i=r.lastIndexOf(e,t);return i===-1?r:r[i-1]===\"\\\\\"?wn.escapeLast(r,e,i-1):`${r.slice(0,i)}\\\\${r.slice(i)}`};wn.removePrefix=(r,e={})=>{let t=r;return t.startsWith(\"./\")&&(t=t.slice(2),e.prefix=\"./\"),t};wn.wrapOutput=(r,e={},t={})=>{let i=t.contains?\"\":\"^\",n=t.contains?\"\":\"$\",s=`${i}(?:${r})${n}`;return e.negated===!0&&(s=`(?:^(?!${s}).*$)`),s}});var G3=w((htt,H3)=>{\"use strict\";var T3=Yd(),{CHAR_ASTERISK:Dx,CHAR_AT:KBe,CHAR_BACKWARD_SLASH:jd,CHAR_COMMA:UBe,CHAR_DOT:kx,CHAR_EXCLAMATION_MARK:Rx,CHAR_FORWARD_SLASH:U3,CHAR_LEFT_CURLY_BRACE:Fx,CHAR_LEFT_PARENTHESES:Nx,CHAR_LEFT_SQUARE_BRACKET:HBe,CHAR_PLUS:GBe,CHAR_QUESTION_MARK:L3,CHAR_RIGHT_CURLY_BRACE:YBe,CHAR_RIGHT_PARENTHESES:O3,CHAR_RIGHT_SQUARE_BRACKET:jBe}=Gd(),M3=r=>r===U3||r===jd,K3=r=>{r.isPrefix!==!0&&(r.depth=r.isGlobstar?1/0:1)},qBe=(r,e)=>{let t=e||{},i=r.length-1,n=t.parts===!0||t.scanToEnd===!0,s=[],o=[],a=[],l=r,c=-1,u=0,g=0,f=!1,h=!1,p=!1,C=!1,y=!1,B=!1,v=!1,D=!1,T=!1,H=!1,j=0,$,V,W={value:\"\",depth:0,isGlob:!1},_=()=>c>=i,A=()=>l.charCodeAt(c+1),Ae=()=>($=V,l.charCodeAt(++c));for(;c<i;){V=Ae();let ue;if(V===jd){v=W.backslashes=!0,V=Ae(),V===Fx&&(B=!0);continue}if(B===!0||V===Fx){for(j++;_()!==!0&&(V=Ae());){if(V===jd){v=W.backslashes=!0,Ae();continue}if(V===Fx){j++;continue}if(B!==!0&&V===kx&&(V=Ae())===kx){if(f=W.isBrace=!0,p=W.isGlob=!0,H=!0,n===!0)continue;break}if(B!==!0&&V===UBe){if(f=W.isBrace=!0,p=W.isGlob=!0,H=!0,n===!0)continue;break}if(V===YBe&&(j--,j===0)){B=!1,f=W.isBrace=!0,H=!0;break}}if(n===!0)continue;break}if(V===U3){if(s.push(c),o.push(W),W={value:\"\",depth:0,isGlob:!1},H===!0)continue;if($===kx&&c===u+1){u+=2;continue}g=c+1;continue}if(t.noext!==!0&&(V===GBe||V===KBe||V===Dx||V===L3||V===Rx)===!0&&A()===Nx){if(p=W.isGlob=!0,C=W.isExtglob=!0,H=!0,V===Rx&&c===u&&(T=!0),n===!0){for(;_()!==!0&&(V=Ae());){if(V===jd){v=W.backslashes=!0,V=Ae();continue}if(V===O3){p=W.isGlob=!0,H=!0;break}}continue}break}if(V===Dx){if($===Dx&&(y=W.isGlobstar=!0),p=W.isGlob=!0,H=!0,n===!0)continue;break}if(V===L3){if(p=W.isGlob=!0,H=!0,n===!0)continue;break}if(V===HBe){for(;_()!==!0&&(ue=Ae());){if(ue===jd){v=W.backslashes=!0,Ae();continue}if(ue===jBe){h=W.isBracket=!0,p=W.isGlob=!0,H=!0;break}}if(n===!0)continue;break}if(t.nonegate!==!0&&V===Rx&&c===u){D=W.negated=!0,u++;continue}if(t.noparen!==!0&&V===Nx){if(p=W.isGlob=!0,n===!0){for(;_()!==!0&&(V=Ae());){if(V===Nx){v=W.backslashes=!0,V=Ae();continue}if(V===O3){H=!0;break}}continue}break}if(p===!0){if(H=!0,n===!0)continue;break}}t.noext===!0&&(C=!1,p=!1);let ge=l,re=\"\",O=\"\";u>0&&(re=l.slice(0,u),l=l.slice(u),g-=u),ge&&p===!0&&g>0?(ge=l.slice(0,g),O=l.slice(g)):p===!0?(ge=\"\",O=l):ge=l,ge&&ge!==\"\"&&ge!==\"/\"&&ge!==l&&M3(ge.charCodeAt(ge.length-1))&&(ge=ge.slice(0,-1)),t.unescape===!0&&(O&&(O=T3.removeBackslashes(O)),ge&&v===!0&&(ge=T3.removeBackslashes(ge)));let F={prefix:re,input:r,start:u,base:ge,glob:O,isBrace:f,isBracket:h,isGlob:p,isExtglob:C,isGlobstar:y,negated:D,negatedExtglob:T};if(t.tokens===!0&&(F.maxDepth=0,M3(V)||o.push(W),F.tokens=o),t.parts===!0||t.tokens===!0){let ue;for(let pe=0;pe<s.length;pe++){let ke=ue?ue+1:u,Fe=s[pe],Ne=r.slice(ke,Fe);t.tokens&&(pe===0&&u!==0?(o[pe].isPrefix=!0,o[pe].value=re):o[pe].value=Ne,K3(o[pe]),F.maxDepth+=o[pe].depth),(pe!==0||Ne!==\"\")&&a.push(Ne),ue=Fe}if(ue&&ue+1<r.length){let pe=r.slice(ue+1);a.push(pe),t.tokens&&(o[o.length-1].value=pe,K3(o[o.length-1]),F.maxDepth+=o[o.length-1].depth)}F.slashes=s,F.parts=a}return F};H3.exports=qBe});var q3=w((ptt,j3)=>{\"use strict\";var jy=Gd(),Wn=Yd(),{MAX_LENGTH:qy,POSIX_REGEX_SOURCE:JBe,REGEX_NON_SPECIAL_CHARS:WBe,REGEX_SPECIAL_CHARS_BACKREF:zBe,REPLACEMENTS:Y3}=jy,VBe=(r,e)=>{if(typeof e.expandRange==\"function\")return e.expandRange(...r,e);r.sort();let t=`[${r.join(\"-\")}]`;try{new RegExp(t)}catch{return r.map(n=>Wn.escapeRegex(n)).join(\"..\")}return t},ff=(r,e)=>`Missing ${r}: \"${e}\" - use \"\\\\\\\\${e}\" to match literal characters`,Tx=(r,e)=>{if(typeof r!=\"string\")throw new TypeError(\"Expected a string\");r=Y3[r]||r;let t={...e},i=typeof t.maxLength==\"number\"?Math.min(qy,t.maxLength):qy,n=r.length;if(n>i)throw new SyntaxError(`Input length: ${n}, exceeds maximum allowed length: ${i}`);let s={type:\"bos\",value:\"\",output:t.prepend||\"\"},o=[s],a=t.capture?\"\":\"?:\",l=Wn.isWindows(e),c=jy.globChars(l),u=jy.extglobChars(c),{DOT_LITERAL:g,PLUS_LITERAL:f,SLASH_LITERAL:h,ONE_CHAR:p,DOTS_SLASH:C,NO_DOT:y,NO_DOT_SLASH:B,NO_DOTS_SLASH:v,QMARK:D,QMARK_NO_DOT:T,STAR:H,START_ANCHOR:j}=c,$=Y=>`(${a}(?:(?!${j}${Y.dot?C:g}).)*?)`,V=t.dot?\"\":y,W=t.dot?D:T,_=t.bash===!0?$(t):H;t.capture&&(_=`(${_})`),typeof t.noext==\"boolean\"&&(t.noextglob=t.noext);let A={input:r,index:-1,start:0,dot:t.dot===!0,consumed:\"\",output:\"\",prefix:\"\",backtrack:!1,negated:!1,brackets:0,braces:0,parens:0,quotes:0,globstar:!1,tokens:o};r=Wn.removePrefix(r,A),n=r.length;let Ae=[],ge=[],re=[],O=s,F,ue=()=>A.index===n-1,pe=A.peek=(Y=1)=>r[A.index+Y],ke=A.advance=()=>r[++A.index]||\"\",Fe=()=>r.slice(A.index+1),Ne=(Y=\"\",he=0)=>{A.consumed+=Y,A.index+=he},oe=Y=>{A.output+=Y.output!=null?Y.output:Y.value,Ne(Y.value)},le=()=>{let Y=1;for(;pe()===\"!\"&&(pe(2)!==\"(\"||pe(3)===\"?\");)ke(),A.start++,Y++;return Y%2===0?!1:(A.negated=!0,A.start++,!0)},Be=Y=>{A[Y]++,re.push(Y)},fe=Y=>{A[Y]--,re.pop()},ae=Y=>{if(O.type===\"globstar\"){let he=A.braces>0&&(Y.type===\"comma\"||Y.type===\"brace\"),ie=Y.extglob===!0||Ae.length&&(Y.type===\"pipe\"||Y.type===\"paren\");Y.type!==\"slash\"&&Y.type!==\"paren\"&&!he&&!ie&&(A.output=A.output.slice(0,-O.output.length),O.type=\"star\",O.value=\"*\",O.output=_,A.output+=O.output)}if(Ae.length&&Y.type!==\"paren\"&&(Ae[Ae.length-1].inner+=Y.value),(Y.value||Y.output)&&oe(Y),O&&O.type===\"text\"&&Y.type===\"text\"){O.value+=Y.value,O.output=(O.output||\"\")+Y.value;return}Y.prev=O,o.push(Y),O=Y},qe=(Y,he)=>{let ie={...u[he],conditions:1,inner:\"\"};ie.prev=O,ie.parens=A.parens,ie.output=A.output;let de=(t.capture?\"(\":\"\")+ie.open;Be(\"parens\"),ae({type:Y,value:he,output:A.output?\"\":p}),ae({type:\"paren\",extglob:!0,value:ke(),output:de}),Ae.push(ie)},ne=Y=>{let he=Y.close+(t.capture?\")\":\"\"),ie;if(Y.type===\"negate\"){let de=_;if(Y.inner&&Y.inner.length>1&&Y.inner.includes(\"/\")&&(de=$(t)),(de!==_||ue()||/^\\)+$/.test(Fe()))&&(he=Y.close=`)$))${de}`),Y.inner.includes(\"*\")&&(ie=Fe())&&/^\\.[^\\\\/.]+$/.test(ie)){let _e=Tx(ie,{...e,fastpaths:!1}).output;he=Y.close=`)${_e})${de})`}Y.prev.type===\"bos\"&&(A.negatedExtglob=!0)}ae({type:\"paren\",extglob:!0,value:F,output:he}),fe(\"parens\")};if(t.fastpaths!==!1&&!/(^[*!]|[/()[\\]{}\"])/.test(r)){let Y=!1,he=r.replace(zBe,(ie,de,_e,Pt,It,Or)=>Pt===\"\\\\\"?(Y=!0,ie):Pt===\"?\"?de?de+Pt+(It?D.repeat(It.length):\"\"):Or===0?W+(It?D.repeat(It.length):\"\"):D.repeat(_e.length):Pt===\".\"?g.repeat(_e.length):Pt===\"*\"?de?de+Pt+(It?_:\"\"):_:de?ie:`\\\\${ie}`);return Y===!0&&(t.unescape===!0?he=he.replace(/\\\\/g,\"\"):he=he.replace(/\\\\+/g,ie=>ie.length%2===0?\"\\\\\\\\\":ie?\"\\\\\":\"\")),he===r&&t.contains===!0?(A.output=r,A):(A.output=Wn.wrapOutput(he,A,e),A)}for(;!ue();){if(F=ke(),F===\"\\0\")continue;if(F===\"\\\\\"){let ie=pe();if(ie===\"/\"&&t.bash!==!0||ie===\".\"||ie===\";\")continue;if(!ie){F+=\"\\\\\",ae({type:\"text\",value:F});continue}let de=/^\\\\+/.exec(Fe()),_e=0;if(de&&de[0].length>2&&(_e=de[0].length,A.index+=_e,_e%2!==0&&(F+=\"\\\\\")),t.unescape===!0?F=ke():F+=ke(),A.brackets===0){ae({type:\"text\",value:F});continue}}if(A.brackets>0&&(F!==\"]\"||O.value===\"[\"||O.value===\"[^\")){if(t.posix!==!1&&F===\":\"){let ie=O.value.slice(1);if(ie.includes(\"[\")&&(O.posix=!0,ie.includes(\":\"))){let de=O.value.lastIndexOf(\"[\"),_e=O.value.slice(0,de),Pt=O.value.slice(de+2),It=JBe[Pt];if(It){O.value=_e+It,A.backtrack=!0,ke(),!s.output&&o.indexOf(O)===1&&(s.output=p);continue}}}(F===\"[\"&&pe()!==\":\"||F===\"-\"&&pe()===\"]\")&&(F=`\\\\${F}`),F===\"]\"&&(O.value===\"[\"||O.value===\"[^\")&&(F=`\\\\${F}`),t.posix===!0&&F===\"!\"&&O.value===\"[\"&&(F=\"^\"),O.value+=F,oe({value:F});continue}if(A.quotes===1&&F!=='\"'){F=Wn.escapeRegex(F),O.value+=F,oe({value:F});continue}if(F==='\"'){A.quotes=A.quotes===1?0:1,t.keepQuotes===!0&&ae({type:\"text\",value:F});continue}if(F===\"(\"){Be(\"parens\"),ae({type:\"paren\",value:F});continue}if(F===\")\"){if(A.parens===0&&t.strictBrackets===!0)throw new SyntaxError(ff(\"opening\",\"(\"));let ie=Ae[Ae.length-1];if(ie&&A.parens===ie.parens+1){ne(Ae.pop());continue}ae({type:\"paren\",value:F,output:A.parens?\")\":\"\\\\)\"}),fe(\"parens\");continue}if(F===\"[\"){if(t.nobracket===!0||!Fe().includes(\"]\")){if(t.nobracket!==!0&&t.strictBrackets===!0)throw new SyntaxError(ff(\"closing\",\"]\"));F=`\\\\${F}`}else Be(\"brackets\");ae({type:\"bracket\",value:F});continue}if(F===\"]\"){if(t.nobracket===!0||O&&O.type===\"bracket\"&&O.value.length===1){ae({type:\"text\",value:F,output:`\\\\${F}`});continue}if(A.brackets===0){if(t.strictBrackets===!0)throw new SyntaxError(ff(\"opening\",\"[\"));ae({type:\"text\",value:F,output:`\\\\${F}`});continue}fe(\"brackets\");let ie=O.value.slice(1);if(O.posix!==!0&&ie[0]===\"^\"&&!ie.includes(\"/\")&&(F=`/${F}`),O.value+=F,oe({value:F}),t.literalBrackets===!1||Wn.hasRegexChars(ie))continue;let de=Wn.escapeRegex(O.value);if(A.output=A.output.slice(0,-O.value.length),t.literalBrackets===!0){A.output+=de,O.value=de;continue}O.value=`(${a}${de}|${O.value})`,A.output+=O.value;continue}if(F===\"{\"&&t.nobrace!==!0){Be(\"braces\");let ie={type:\"brace\",value:F,output:\"(\",outputIndex:A.output.length,tokensIndex:A.tokens.length};ge.push(ie),ae(ie);continue}if(F===\"}\"){let ie=ge[ge.length-1];if(t.nobrace===!0||!ie){ae({type:\"text\",value:F,output:F});continue}let de=\")\";if(ie.dots===!0){let _e=o.slice(),Pt=[];for(let It=_e.length-1;It>=0&&(o.pop(),_e[It].type!==\"brace\");It--)_e[It].type!==\"dots\"&&Pt.unshift(_e[It].value);de=VBe(Pt,t),A.backtrack=!0}if(ie.comma!==!0&&ie.dots!==!0){let _e=A.output.slice(0,ie.outputIndex),Pt=A.tokens.slice(ie.tokensIndex);ie.value=ie.output=\"\\\\{\",F=de=\"\\\\}\",A.output=_e;for(let It of Pt)A.output+=It.output||It.value}ae({type:\"brace\",value:F,output:de}),fe(\"braces\"),ge.pop();continue}if(F===\"|\"){Ae.length>0&&Ae[Ae.length-1].conditions++,ae({type:\"text\",value:F});continue}if(F===\",\"){let ie=F,de=ge[ge.length-1];de&&re[re.length-1]===\"braces\"&&(de.comma=!0,ie=\"|\"),ae({type:\"comma\",value:F,output:ie});continue}if(F===\"/\"){if(O.type===\"dot\"&&A.index===A.start+1){A.start=A.index+1,A.consumed=\"\",A.output=\"\",o.pop(),O=s;continue}ae({type:\"slash\",value:F,output:h});continue}if(F===\".\"){if(A.braces>0&&O.type===\"dot\"){O.value===\".\"&&(O.output=g);let ie=ge[ge.length-1];O.type=\"dots\",O.output+=F,O.value+=F,ie.dots=!0;continue}if(A.braces+A.parens===0&&O.type!==\"bos\"&&O.type!==\"slash\"){ae({type:\"text\",value:F,output:g});continue}ae({type:\"dot\",value:F,output:g});continue}if(F===\"?\"){if(!(O&&O.value===\"(\")&&t.noextglob!==!0&&pe()===\"(\"&&pe(2)!==\"?\"){qe(\"qmark\",F);continue}if(O&&O.type===\"paren\"){let de=pe(),_e=F;if(de===\"<\"&&!Wn.supportsLookbehinds())throw new Error(\"Node.js v10 or higher is required for regex lookbehinds\");(O.value===\"(\"&&!/[!=<:]/.test(de)||de===\"<\"&&!/<([!=]|\\w+>)/.test(Fe()))&&(_e=`\\\\${F}`),ae({type:\"text\",value:F,output:_e});continue}if(t.dot!==!0&&(O.type===\"slash\"||O.type===\"bos\")){ae({type:\"qmark\",value:F,output:T});continue}ae({type:\"qmark\",value:F,output:D});continue}if(F===\"!\"){if(t.noextglob!==!0&&pe()===\"(\"&&(pe(2)!==\"?\"||!/[!=<:]/.test(pe(3)))){qe(\"negate\",F);continue}if(t.nonegate!==!0&&A.index===0){le();continue}}if(F===\"+\"){if(t.noextglob!==!0&&pe()===\"(\"&&pe(2)!==\"?\"){qe(\"plus\",F);continue}if(O&&O.value===\"(\"||t.regex===!1){ae({type:\"plus\",value:F,output:f});continue}if(O&&(O.type===\"bracket\"||O.type===\"paren\"||O.type===\"brace\")||A.parens>0){ae({type:\"plus\",value:F});continue}ae({type:\"plus\",value:f});continue}if(F===\"@\"){if(t.noextglob!==!0&&pe()===\"(\"&&pe(2)!==\"?\"){ae({type:\"at\",extglob:!0,value:F,output:\"\"});continue}ae({type:\"text\",value:F});continue}if(F!==\"*\"){(F===\"$\"||F===\"^\")&&(F=`\\\\${F}`);let ie=WBe.exec(Fe());ie&&(F+=ie[0],A.index+=ie[0].length),ae({type:\"text\",value:F});continue}if(O&&(O.type===\"globstar\"||O.star===!0)){O.type=\"star\",O.star=!0,O.value+=F,O.output=_,A.backtrack=!0,A.globstar=!0,Ne(F);continue}let Y=Fe();if(t.noextglob!==!0&&/^\\([^?]/.test(Y)){qe(\"star\",F);continue}if(O.type===\"star\"){if(t.noglobstar===!0){Ne(F);continue}let ie=O.prev,de=ie.prev,_e=ie.type===\"slash\"||ie.type===\"bos\",Pt=de&&(de.type===\"star\"||de.type===\"globstar\");if(t.bash===!0&&(!_e||Y[0]&&Y[0]!==\"/\")){ae({type:\"star\",value:F,output:\"\"});continue}let It=A.braces>0&&(ie.type===\"comma\"||ie.type===\"brace\"),Or=Ae.length&&(ie.type===\"pipe\"||ie.type===\"paren\");if(!_e&&ie.type!==\"paren\"&&!It&&!Or){ae({type:\"star\",value:F,output:\"\"});continue}for(;Y.slice(0,3)===\"/**\";){let ii=r[A.index+4];if(ii&&ii!==\"/\")break;Y=Y.slice(3),Ne(\"/**\",3)}if(ie.type===\"bos\"&&ue()){O.type=\"globstar\",O.value+=F,O.output=$(t),A.output=O.output,A.globstar=!0,Ne(F);continue}if(ie.type===\"slash\"&&ie.prev.type!==\"bos\"&&!Pt&&ue()){A.output=A.output.slice(0,-(ie.output+O.output).length),ie.output=`(?:${ie.output}`,O.type=\"globstar\",O.output=$(t)+(t.strictSlashes?\")\":\"|$)\"),O.value+=F,A.globstar=!0,A.output+=ie.output+O.output,Ne(F);continue}if(ie.type===\"slash\"&&ie.prev.type!==\"bos\"&&Y[0]===\"/\"){let ii=Y[1]!==void 0?\"|$\":\"\";A.output=A.output.slice(0,-(ie.output+O.output).length),ie.output=`(?:${ie.output}`,O.type=\"globstar\",O.output=`${$(t)}${h}|${h}${ii})`,O.value+=F,A.output+=ie.output+O.output,A.globstar=!0,Ne(F+ke()),ae({type:\"slash\",value:\"/\",output:\"\"});continue}if(ie.type===\"bos\"&&Y[0]===\"/\"){O.type=\"globstar\",O.value+=F,O.output=`(?:^|${h}|${$(t)}${h})`,A.output=O.output,A.globstar=!0,Ne(F+ke()),ae({type:\"slash\",value:\"/\",output:\"\"});continue}A.output=A.output.slice(0,-O.output.length),O.type=\"globstar\",O.output=$(t),O.value+=F,A.output+=O.output,A.globstar=!0,Ne(F);continue}let he={type:\"star\",value:F,output:_};if(t.bash===!0){he.output=\".*?\",(O.type===\"bos\"||O.type===\"slash\")&&(he.output=V+he.output),ae(he);continue}if(O&&(O.type===\"bracket\"||O.type===\"paren\")&&t.regex===!0){he.output=F,ae(he);continue}(A.index===A.start||O.type===\"slash\"||O.type===\"dot\")&&(O.type===\"dot\"?(A.output+=B,O.output+=B):t.dot===!0?(A.output+=v,O.output+=v):(A.output+=V,O.output+=V),pe()!==\"*\"&&(A.output+=p,O.output+=p)),ae(he)}for(;A.brackets>0;){if(t.strictBrackets===!0)throw new SyntaxError(ff(\"closing\",\"]\"));A.output=Wn.escapeLast(A.output,\"[\"),fe(\"brackets\")}for(;A.parens>0;){if(t.strictBrackets===!0)throw new SyntaxError(ff(\"closing\",\")\"));A.output=Wn.escapeLast(A.output,\"(\"),fe(\"parens\")}for(;A.braces>0;){if(t.strictBrackets===!0)throw new SyntaxError(ff(\"closing\",\"}\"));A.output=Wn.escapeLast(A.output,\"{\"),fe(\"braces\")}if(t.strictSlashes!==!0&&(O.type===\"star\"||O.type===\"bracket\")&&ae({type:\"maybe_slash\",value:\"\",output:`${h}?`}),A.backtrack===!0){A.output=\"\";for(let Y of A.tokens)A.output+=Y.output!=null?Y.output:Y.value,Y.suffix&&(A.output+=Y.suffix)}return A};Tx.fastpaths=(r,e)=>{let t={...e},i=typeof t.maxLength==\"number\"?Math.min(qy,t.maxLength):qy,n=r.length;if(n>i)throw new SyntaxError(`Input length: ${n}, exceeds maximum allowed length: ${i}`);r=Y3[r]||r;let s=Wn.isWindows(e),{DOT_LITERAL:o,SLASH_LITERAL:a,ONE_CHAR:l,DOTS_SLASH:c,NO_DOT:u,NO_DOTS:g,NO_DOTS_SLASH:f,STAR:h,START_ANCHOR:p}=jy.globChars(s),C=t.dot?g:u,y=t.dot?f:u,B=t.capture?\"\":\"?:\",v={negated:!1,prefix:\"\"},D=t.bash===!0?\".*?\":h;t.capture&&(D=`(${D})`);let T=V=>V.noglobstar===!0?D:`(${B}(?:(?!${p}${V.dot?c:o}).)*?)`,H=V=>{switch(V){case\"*\":return`${C}${l}${D}`;case\".*\":return`${o}${l}${D}`;case\"*.*\":return`${C}${D}${o}${l}${D}`;case\"*/*\":return`${C}${D}${a}${l}${y}${D}`;case\"**\":return C+T(t);case\"**/*\":return`(?:${C}${T(t)}${a})?${y}${l}${D}`;case\"**/*.*\":return`(?:${C}${T(t)}${a})?${y}${D}${o}${l}${D}`;case\"**/.*\":return`(?:${C}${T(t)}${a})?${o}${l}${D}`;default:{let W=/^(.*?)\\.(\\w+)$/.exec(V);if(!W)return;let _=H(W[1]);return _?_+o+W[2]:void 0}}},j=Wn.removePrefix(r,v),$=H(j);return $&&t.strictSlashes!==!0&&($+=`${a}?`),$};j3.exports=Tx});var W3=w((dtt,J3)=>{\"use strict\";var XBe=J(\"path\"),ZBe=G3(),Lx=q3(),Ox=Yd(),_Be=Gd(),$Be=r=>r&&typeof r==\"object\"&&!Array.isArray(r),Yr=(r,e,t=!1)=>{if(Array.isArray(r)){let u=r.map(f=>Yr(f,e,t));return f=>{for(let h of u){let p=h(f);if(p)return p}return!1}}let i=$Be(r)&&r.tokens&&r.input;if(r===\"\"||typeof r!=\"string\"&&!i)throw new TypeError(\"Expected pattern to be a non-empty string\");let n=e||{},s=Ox.isWindows(e),o=i?Yr.compileRe(r,e):Yr.makeRe(r,e,!1,!0),a=o.state;delete o.state;let l=()=>!1;if(n.ignore){let u={...e,ignore:null,onMatch:null,onResult:null};l=Yr(n.ignore,u,t)}let c=(u,g=!1)=>{let{isMatch:f,match:h,output:p}=Yr.test(u,o,e,{glob:r,posix:s}),C={glob:r,state:a,regex:o,posix:s,input:u,output:p,match:h,isMatch:f};return typeof n.onResult==\"function\"&&n.onResult(C),f===!1?(C.isMatch=!1,g?C:!1):l(u)?(typeof n.onIgnore==\"function\"&&n.onIgnore(C),C.isMatch=!1,g?C:!1):(typeof n.onMatch==\"function\"&&n.onMatch(C),g?C:!0)};return t&&(c.state=a),c};Yr.test=(r,e,t,{glob:i,posix:n}={})=>{if(typeof r!=\"string\")throw new TypeError(\"Expected input to be a string\");if(r===\"\")return{isMatch:!1,output:\"\"};let s=t||{},o=s.format||(n?Ox.toPosixSlashes:null),a=r===i,l=a&&o?o(r):r;return a===!1&&(l=o?o(r):r,a=l===i),(a===!1||s.capture===!0)&&(s.matchBase===!0||s.basename===!0?a=Yr.matchBase(r,e,t,n):a=e.exec(l)),{isMatch:Boolean(a),match:a,output:l}};Yr.matchBase=(r,e,t,i=Ox.isWindows(t))=>(e instanceof RegExp?e:Yr.makeRe(e,t)).test(XBe.basename(r));Yr.isMatch=(r,e,t)=>Yr(e,t)(r);Yr.parse=(r,e)=>Array.isArray(r)?r.map(t=>Yr.parse(t,e)):Lx(r,{...e,fastpaths:!1});Yr.scan=(r,e)=>ZBe(r,e);Yr.compileRe=(r,e,t=!1,i=!1)=>{if(t===!0)return r.output;let n=e||{},s=n.contains?\"\":\"^\",o=n.contains?\"\":\"$\",a=`${s}(?:${r.output})${o}`;r&&r.negated===!0&&(a=`^(?!${a}).*$`);let l=Yr.toRegex(a,e);return i===!0&&(l.state=r),l};Yr.makeRe=(r,e={},t=!1,i=!1)=>{if(!r||typeof r!=\"string\")throw new TypeError(\"Expected a non-empty string\");let n={negated:!1,fastpaths:!0};return e.fastpaths!==!1&&(r[0]===\".\"||r[0]===\"*\")&&(n.output=Lx.fastpaths(r,e)),n.output||(n=Lx(r,e)),Yr.compileRe(n,e,t,i)};Yr.toRegex=(r,e)=>{try{let t=e||{};return new RegExp(r,t.flags||(t.nocase?\"i\":\"\"))}catch(t){if(e&&e.debug===!0)throw t;return/$^/}};Yr.constants=_Be;J3.exports=Yr});var Mx=w((Ctt,z3)=>{\"use strict\";z3.exports=W3()});var Bn=w((mtt,_3)=>{\"use strict\";var X3=J(\"util\"),Z3=P3(),Ko=Mx(),Kx=Yd(),V3=r=>r===\"\"||r===\"./\",Sr=(r,e,t)=>{e=[].concat(e),r=[].concat(r);let i=new Set,n=new Set,s=new Set,o=0,a=u=>{s.add(u.output),t&&t.onResult&&t.onResult(u)};for(let u=0;u<e.length;u++){let g=Ko(String(e[u]),{...t,onResult:a},!0),f=g.state.negated||g.state.negatedExtglob;f&&o++;for(let h of r){let p=g(h,!0);!(f?!p.isMatch:p.isMatch)||(f?i.add(p.output):(i.delete(p.output),n.add(p.output)))}}let c=(o===e.length?[...s]:[...n]).filter(u=>!i.has(u));if(t&&c.length===0){if(t.failglob===!0)throw new Error(`No matches found for \"${e.join(\", \")}\"`);if(t.nonull===!0||t.nullglob===!0)return t.unescape?e.map(u=>u.replace(/\\\\/g,\"\")):e}return c};Sr.match=Sr;Sr.matcher=(r,e)=>Ko(r,e);Sr.isMatch=(r,e,t)=>Ko(e,t)(r);Sr.any=Sr.isMatch;Sr.not=(r,e,t={})=>{e=[].concat(e).map(String);let i=new Set,n=[],o=Sr(r,e,{...t,onResult:a=>{t.onResult&&t.onResult(a),n.push(a.output)}});for(let a of n)o.includes(a)||i.add(a);return[...i]};Sr.contains=(r,e,t)=>{if(typeof r!=\"string\")throw new TypeError(`Expected a string: \"${X3.inspect(r)}\"`);if(Array.isArray(e))return e.some(i=>Sr.contains(r,i,t));if(typeof e==\"string\"){if(V3(r)||V3(e))return!1;if(r.includes(e)||r.startsWith(\"./\")&&r.slice(2).includes(e))return!0}return Sr.isMatch(r,e,{...t,contains:!0})};Sr.matchKeys=(r,e,t)=>{if(!Kx.isObject(r))throw new TypeError(\"Expected the first argument to be an object\");let i=Sr(Object.keys(r),e,t),n={};for(let s of i)n[s]=r[s];return n};Sr.some=(r,e,t)=>{let i=[].concat(r);for(let n of[].concat(e)){let s=Ko(String(n),t);if(i.some(o=>s(o)))return!0}return!1};Sr.every=(r,e,t)=>{let i=[].concat(r);for(let n of[].concat(e)){let s=Ko(String(n),t);if(!i.every(o=>s(o)))return!1}return!0};Sr.all=(r,e,t)=>{if(typeof r!=\"string\")throw new TypeError(`Expected a string: \"${X3.inspect(r)}\"`);return[].concat(e).every(i=>Ko(i,t)(r))};Sr.capture=(r,e,t)=>{let i=Kx.isWindows(t),s=Ko.makeRe(String(r),{...t,capture:!0}).exec(i?Kx.toPosixSlashes(e):e);if(s)return s.slice(1).map(o=>o===void 0?\"\":o)};Sr.makeRe=(...r)=>Ko.makeRe(...r);Sr.scan=(...r)=>Ko.scan(...r);Sr.parse=(r,e)=>{let t=[];for(let i of[].concat(r||[]))for(let n of Z3(String(i),e))t.push(Ko.parse(n,e));return t};Sr.braces=(r,e)=>{if(typeof r!=\"string\")throw new TypeError(\"Expected a string\");return e&&e.nobrace===!0||!/\\{.*\\}/.test(r)?[r]:Z3(r,e)};Sr.braceExpand=(r,e)=>{if(typeof r!=\"string\")throw new TypeError(\"Expected a string\");return Sr.braces(r,{...e,expand:!0})};_3.exports=Sr});var e4=w((Ett,$3)=>{\"use strict\";$3.exports=({onlyFirst:r=!1}={})=>{let e=[\"[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]+)*|[a-zA-Z\\\\d]+(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]*)*)?\\\\u0007)\",\"(?:(?:\\\\d{1,4}(?:;\\\\d{0,4})*)?[\\\\dA-PR-TZcf-ntqry=><~]))\"].join(\"|\");return new RegExp(e,r?void 0:\"g\")}});var r4=w((Itt,t4)=>{\"use strict\";var e0e=e4();t4.exports=r=>typeof r==\"string\"?r.replace(e0e(),\"\"):r});var d4=w((ktt,p4)=>{\"use strict\";p4.exports=(...r)=>[...new Set([].concat(...r))]});var sP=w((Rtt,E4)=>{\"use strict\";var f0e=J(\"stream\"),C4=f0e.PassThrough,h0e=Array.prototype.slice;E4.exports=p0e;function p0e(){let r=[],e=!1,t=h0e.call(arguments),i=t[t.length-1];i&&!Array.isArray(i)&&i.pipe==null?t.pop():i={};let n=i.end!==!1;i.objectMode==null&&(i.objectMode=!0),i.highWaterMark==null&&(i.highWaterMark=64*1024);let s=C4(i);function o(){for(let c=0,u=arguments.length;c<u;c++)r.push(m4(arguments[c],i));return a(),this}function a(){if(e)return;e=!0;let c=r.shift();if(!c){process.nextTick(l);return}Array.isArray(c)||(c=[c]);let u=c.length+1;function g(){--u>0||(e=!1,a())}function f(h){function p(){h.removeListener(\"merge2UnpipeEnd\",p),h.removeListener(\"end\",p),g()}if(h._readableState.endEmitted)return g();h.on(\"merge2UnpipeEnd\",p),h.on(\"end\",p),h.pipe(s,{end:!1}),h.resume()}for(let h=0;h<c.length;h++)f(c[h]);g()}function l(){return e=!1,s.emit(\"queueDrain\"),n&&s.end()}return s.setMaxListeners(0),s.add=o,s.on(\"unpipe\",function(c){c.emit(\"merge2UnpipeEnd\")}),t.length&&o.apply(null,t),s}function m4(r,e){if(Array.isArray(r))for(let t=0,i=r.length;t<i;t++)r[t]=m4(r[t],e);else{if(!r._readableState&&r.pipe&&(r=r.pipe(C4(e))),!r._readableState||!r.pause||!r.pipe)throw new Error(\"Only readable stream can be merged.\");r.pause()}return r}});var I4=w(Zy=>{\"use strict\";Object.defineProperty(Zy,\"__esModule\",{value:!0});function d0e(r){return r.reduce((e,t)=>[].concat(e,t),[])}Zy.flatten=d0e;function C0e(r,e){let t=[[]],i=0;for(let n of r)e(n)?(i++,t[i]=[]):t[i].push(n);return t}Zy.splitWhen=C0e});var y4=w(oP=>{\"use strict\";Object.defineProperty(oP,\"__esModule\",{value:!0});function m0e(r){return r.code===\"ENOENT\"}oP.isEnoentCodeError=m0e});var w4=w(AP=>{\"use strict\";Object.defineProperty(AP,\"__esModule\",{value:!0});var aP=class{constructor(e,t){this.name=e,this.isBlockDevice=t.isBlockDevice.bind(t),this.isCharacterDevice=t.isCharacterDevice.bind(t),this.isDirectory=t.isDirectory.bind(t),this.isFIFO=t.isFIFO.bind(t),this.isFile=t.isFile.bind(t),this.isSocket=t.isSocket.bind(t),this.isSymbolicLink=t.isSymbolicLink.bind(t)}};function E0e(r,e){return new aP(r,e)}AP.createDirentFromStats=E0e});var B4=w(yf=>{\"use strict\";Object.defineProperty(yf,\"__esModule\",{value:!0});var I0e=J(\"path\"),y0e=2,w0e=/(\\\\?)([()*?[\\]{|}]|^!|[!+@](?=\\())/g;function B0e(r){return r.replace(/\\\\/g,\"/\")}yf.unixify=B0e;function Q0e(r,e){return I0e.resolve(r,e)}yf.makeAbsolute=Q0e;function b0e(r){return r.replace(w0e,\"\\\\$2\")}yf.escape=b0e;function S0e(r){if(r.charAt(0)===\".\"){let e=r.charAt(1);if(e===\"/\"||e===\"\\\\\")return r.slice(y0e)}return r}yf.removeLeadingDotSegment=S0e});var b4=w((Ott,Q4)=>{Q4.exports=function(e){if(typeof e!=\"string\"||e===\"\")return!1;for(var t;t=/(\\\\).|([@?!+*]\\(.*\\))/g.exec(e);){if(t[2])return!0;e=e.slice(t.index+t[0].length)}return!1}});var x4=w((Mtt,v4)=>{var v0e=b4(),S4={\"{\":\"}\",\"(\":\")\",\"[\":\"]\"},x0e=function(r){if(r[0]===\"!\")return!0;for(var e=0,t=-2,i=-2,n=-2,s=-2,o=-2;e<r.length;){if(r[e]===\"*\"||r[e+1]===\"?\"&&/[\\].+)]/.test(r[e])||i!==-1&&r[e]===\"[\"&&r[e+1]!==\"]\"&&(i<e&&(i=r.indexOf(\"]\",e)),i>e&&(o===-1||o>i||(o=r.indexOf(\"\\\\\",e),o===-1||o>i)))||n!==-1&&r[e]===\"{\"&&r[e+1]!==\"}\"&&(n=r.indexOf(\"}\",e),n>e&&(o=r.indexOf(\"\\\\\",e),o===-1||o>n))||s!==-1&&r[e]===\"(\"&&r[e+1]===\"?\"&&/[:!=]/.test(r[e+2])&&r[e+3]!==\")\"&&(s=r.indexOf(\")\",e),s>e&&(o=r.indexOf(\"\\\\\",e),o===-1||o>s))||t!==-1&&r[e]===\"(\"&&r[e+1]!==\"|\"&&(t<e&&(t=r.indexOf(\"|\",e)),t!==-1&&r[t+1]!==\")\"&&(s=r.indexOf(\")\",t),s>t&&(o=r.indexOf(\"\\\\\",t),o===-1||o>s))))return!0;if(r[e]===\"\\\\\"){var a=r[e+1];e+=2;var l=S4[a];if(l){var c=r.indexOf(l,e);c!==-1&&(e=c+1)}if(r[e]===\"!\")return!0}else e++}return!1},P0e=function(r){if(r[0]===\"!\")return!0;for(var e=0;e<r.length;){if(/[*?{}()[\\]]/.test(r[e]))return!0;if(r[e]===\"\\\\\"){var t=r[e+1];e+=2;var i=S4[t];if(i){var n=r.indexOf(i,e);n!==-1&&(e=n+1)}if(r[e]===\"!\")return!0}else e++}return!1};v4.exports=function(e,t){if(typeof e!=\"string\"||e===\"\")return!1;if(v0e(e))return!0;var i=x0e;return t&&t.strict===!1&&(i=P0e),i(e)}});var D4=w((Ktt,P4)=>{\"use strict\";var D0e=x4(),k0e=J(\"path\").posix.dirname,R0e=J(\"os\").platform()===\"win32\",lP=\"/\",F0e=/\\\\/g,N0e=/[\\{\\[].*[\\}\\]]$/,T0e=/(^|[^\\\\])([\\{\\[]|\\([^\\)]+$)/,L0e=/\\\\([\\!\\*\\?\\|\\[\\]\\(\\)\\{\\}])/g;P4.exports=function(e,t){var i=Object.assign({flipBackslashes:!0},t);i.flipBackslashes&&R0e&&e.indexOf(lP)<0&&(e=e.replace(F0e,lP)),N0e.test(e)&&(e+=lP),e+=\"a\";do e=k0e(e);while(D0e(e)||T0e.test(e));return e.replace(L0e,\"$1\")}});var K4=w($r=>{\"use strict\";Object.defineProperty($r,\"__esModule\",{value:!0});var O0e=J(\"path\"),M0e=D4(),k4=Bn(),K0e=Mx(),R4=\"**\",U0e=\"\\\\\",H0e=/[*?]|^!/,G0e=/\\[.*]/,Y0e=/(?:^|[^!*+?@])\\(.*\\|.*\\)/,j0e=/[!*+?@]\\(.*\\)/,q0e=/{.*(?:,|\\.\\.).*}/;function F4(r,e={}){return!N4(r,e)}$r.isStaticPattern=F4;function N4(r,e={}){return!!(e.caseSensitiveMatch===!1||r.includes(U0e)||H0e.test(r)||G0e.test(r)||Y0e.test(r)||e.extglob!==!1&&j0e.test(r)||e.braceExpansion!==!1&&q0e.test(r))}$r.isDynamicPattern=N4;function J0e(r){return _y(r)?r.slice(1):r}$r.convertToPositivePattern=J0e;function W0e(r){return\"!\"+r}$r.convertToNegativePattern=W0e;function _y(r){return r.startsWith(\"!\")&&r[1]!==\"(\"}$r.isNegativePattern=_y;function T4(r){return!_y(r)}$r.isPositivePattern=T4;function z0e(r){return r.filter(_y)}$r.getNegativePatterns=z0e;function V0e(r){return r.filter(T4)}$r.getPositivePatterns=V0e;function X0e(r){return M0e(r,{flipBackslashes:!1})}$r.getBaseDirectory=X0e;function Z0e(r){return r.includes(R4)}$r.hasGlobStar=Z0e;function L4(r){return r.endsWith(\"/\"+R4)}$r.endsWithSlashGlobStar=L4;function _0e(r){let e=O0e.basename(r);return L4(r)||F4(e)}$r.isAffectDepthOfReadingPattern=_0e;function $0e(r){return r.reduce((e,t)=>e.concat(O4(t)),[])}$r.expandPatternsWithBraceExpansion=$0e;function O4(r){return k4.braces(r,{expand:!0,nodupes:!0})}$r.expandBraceExpansion=O4;function eQe(r,e){let t=K0e.scan(r,Object.assign(Object.assign({},e),{parts:!0}));return t.parts.length===0?[r]:t.parts}$r.getPatternParts=eQe;function M4(r,e){return k4.makeRe(r,e)}$r.makeRe=M4;function tQe(r,e){return r.map(t=>M4(t,e))}$r.convertPatternsToRe=tQe;function rQe(r,e){return e.some(t=>t.test(r))}$r.matchAny=rQe});var H4=w(cP=>{\"use strict\";Object.defineProperty(cP,\"__esModule\",{value:!0});var iQe=sP();function nQe(r){let e=iQe(r);return r.forEach(t=>{t.once(\"error\",i=>e.emit(\"error\",i))}),e.once(\"close\",()=>U4(r)),e.once(\"end\",()=>U4(r)),e}cP.merge=nQe;function U4(r){r.forEach(e=>e.emit(\"close\"))}});var G4=w($y=>{\"use strict\";Object.defineProperty($y,\"__esModule\",{value:!0});function sQe(r){return typeof r==\"string\"}$y.isString=sQe;function oQe(r){return r===\"\"}$y.isEmpty=oQe});var Oa=w(La=>{\"use strict\";Object.defineProperty(La,\"__esModule\",{value:!0});var aQe=I4();La.array=aQe;var AQe=y4();La.errno=AQe;var lQe=w4();La.fs=lQe;var cQe=B4();La.path=cQe;var uQe=K4();La.pattern=uQe;var gQe=H4();La.stream=gQe;var fQe=G4();La.string=fQe});var W4=w(Ma=>{\"use strict\";Object.defineProperty(Ma,\"__esModule\",{value:!0});var Qc=Oa();function hQe(r,e){let t=Y4(r),i=j4(r,e.ignore),n=t.filter(l=>Qc.pattern.isStaticPattern(l,e)),s=t.filter(l=>Qc.pattern.isDynamicPattern(l,e)),o=uP(n,i,!1),a=uP(s,i,!0);return o.concat(a)}Ma.generate=hQe;function uP(r,e,t){let i=q4(r);return\".\"in i?[gP(\".\",r,e,t)]:J4(i,e,t)}Ma.convertPatternsToTasks=uP;function Y4(r){return Qc.pattern.getPositivePatterns(r)}Ma.getPositivePatterns=Y4;function j4(r,e){return Qc.pattern.getNegativePatterns(r).concat(e).map(Qc.pattern.convertToPositivePattern)}Ma.getNegativePatternsAsPositive=j4;function q4(r){let e={};return r.reduce((t,i)=>{let n=Qc.pattern.getBaseDirectory(i);return n in t?t[n].push(i):t[n]=[i],t},e)}Ma.groupPatternsByBaseDirectory=q4;function J4(r,e,t){return Object.keys(r).map(i=>gP(i,r[i],e,t))}Ma.convertPatternGroupsToTasks=J4;function gP(r,e,t,i){return{dynamic:i,positive:e,negative:t,base:r,patterns:[].concat(e,t.map(Qc.pattern.convertToNegativePattern))}}Ma.convertPatternGroupToTask=gP});var V4=w(ew=>{\"use strict\";Object.defineProperty(ew,\"__esModule\",{value:!0});ew.read=void 0;function pQe(r,e,t){e.fs.lstat(r,(i,n)=>{if(i!==null){z4(t,i);return}if(!n.isSymbolicLink()||!e.followSymbolicLink){fP(t,n);return}e.fs.stat(r,(s,o)=>{if(s!==null){if(e.throwErrorOnBrokenSymbolicLink){z4(t,s);return}fP(t,n);return}e.markSymbolicLink&&(o.isSymbolicLink=()=>!0),fP(t,o)})})}ew.read=pQe;function z4(r,e){r(e)}function fP(r,e){r(null,e)}});var X4=w(tw=>{\"use strict\";Object.defineProperty(tw,\"__esModule\",{value:!0});tw.read=void 0;function dQe(r,e){let t=e.fs.lstatSync(r);if(!t.isSymbolicLink()||!e.followSymbolicLink)return t;try{let i=e.fs.statSync(r);return e.markSymbolicLink&&(i.isSymbolicLink=()=>!0),i}catch(i){if(!e.throwErrorOnBrokenSymbolicLink)return t;throw i}}tw.read=dQe});var Z4=w(HA=>{\"use strict\";Object.defineProperty(HA,\"__esModule\",{value:!0});HA.createFileSystemAdapter=HA.FILE_SYSTEM_ADAPTER=void 0;var rw=J(\"fs\");HA.FILE_SYSTEM_ADAPTER={lstat:rw.lstat,stat:rw.stat,lstatSync:rw.lstatSync,statSync:rw.statSync};function CQe(r){return r===void 0?HA.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},HA.FILE_SYSTEM_ADAPTER),r)}HA.createFileSystemAdapter=CQe});var _4=w(pP=>{\"use strict\";Object.defineProperty(pP,\"__esModule\",{value:!0});var mQe=Z4(),hP=class{constructor(e={}){this._options=e,this.followSymbolicLink=this._getValue(this._options.followSymbolicLink,!0),this.fs=mQe.createFileSystemAdapter(this._options.fs),this.markSymbolicLink=this._getValue(this._options.markSymbolicLink,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0)}_getValue(e,t){return e!=null?e:t}};pP.default=hP});var bc=w(GA=>{\"use strict\";Object.defineProperty(GA,\"__esModule\",{value:!0});GA.statSync=GA.stat=GA.Settings=void 0;var $4=V4(),EQe=X4(),dP=_4();GA.Settings=dP.default;function IQe(r,e,t){if(typeof e==\"function\"){$4.read(r,CP(),e);return}$4.read(r,CP(e),t)}GA.stat=IQe;function yQe(r,e){let t=CP(e);return EQe.read(r,t)}GA.statSync=yQe;function CP(r={}){return r instanceof dP.default?r:new dP.default(r)}});var tW=w((Xtt,eW)=>{eW.exports=wQe;function wQe(r,e){var t,i,n,s=!0;Array.isArray(r)?(t=[],i=r.length):(n=Object.keys(r),t={},i=n.length);function o(l){function c(){e&&e(l,t),e=null}s?process.nextTick(c):c()}function a(l,c,u){t[l]=u,(--i===0||c)&&o(c)}i?n?n.forEach(function(l){r[l](function(c,u){a(l,c,u)})}):r.forEach(function(l,c){l(function(u,g){a(c,u,g)})}):o(null),s=!1}});var mP=w(nw=>{\"use strict\";Object.defineProperty(nw,\"__esModule\",{value:!0});nw.IS_SUPPORT_READDIR_WITH_FILE_TYPES=void 0;var iw=process.versions.node.split(\".\");if(iw[0]===void 0||iw[1]===void 0)throw new Error(`Unexpected behavior. The 'process.versions.node' variable has invalid value: ${process.versions.node}`);var rW=Number.parseInt(iw[0],10),BQe=Number.parseInt(iw[1],10),iW=10,QQe=10,bQe=rW>iW,SQe=rW===iW&&BQe>=QQe;nw.IS_SUPPORT_READDIR_WITH_FILE_TYPES=bQe||SQe});var nW=w(sw=>{\"use strict\";Object.defineProperty(sw,\"__esModule\",{value:!0});sw.createDirentFromStats=void 0;var EP=class{constructor(e,t){this.name=e,this.isBlockDevice=t.isBlockDevice.bind(t),this.isCharacterDevice=t.isCharacterDevice.bind(t),this.isDirectory=t.isDirectory.bind(t),this.isFIFO=t.isFIFO.bind(t),this.isFile=t.isFile.bind(t),this.isSocket=t.isSocket.bind(t),this.isSymbolicLink=t.isSymbolicLink.bind(t)}};function vQe(r,e){return new EP(r,e)}sw.createDirentFromStats=vQe});var IP=w(ow=>{\"use strict\";Object.defineProperty(ow,\"__esModule\",{value:!0});ow.fs=void 0;var xQe=nW();ow.fs=xQe});var yP=w(aw=>{\"use strict\";Object.defineProperty(aw,\"__esModule\",{value:!0});aw.joinPathSegments=void 0;function PQe(r,e,t){return r.endsWith(t)?r+e:r+t+e}aw.joinPathSegments=PQe});var cW=w(YA=>{\"use strict\";Object.defineProperty(YA,\"__esModule\",{value:!0});YA.readdir=YA.readdirWithFileTypes=YA.read=void 0;var DQe=bc(),sW=tW(),kQe=mP(),oW=IP(),aW=yP();function RQe(r,e,t){if(!e.stats&&kQe.IS_SUPPORT_READDIR_WITH_FILE_TYPES){AW(r,e,t);return}lW(r,e,t)}YA.read=RQe;function AW(r,e,t){e.fs.readdir(r,{withFileTypes:!0},(i,n)=>{if(i!==null){Aw(t,i);return}let s=n.map(a=>({dirent:a,name:a.name,path:aW.joinPathSegments(r,a.name,e.pathSegmentSeparator)}));if(!e.followSymbolicLinks){wP(t,s);return}let o=s.map(a=>FQe(a,e));sW(o,(a,l)=>{if(a!==null){Aw(t,a);return}wP(t,l)})})}YA.readdirWithFileTypes=AW;function FQe(r,e){return t=>{if(!r.dirent.isSymbolicLink()){t(null,r);return}e.fs.stat(r.path,(i,n)=>{if(i!==null){if(e.throwErrorOnBrokenSymbolicLink){t(i);return}t(null,r);return}r.dirent=oW.fs.createDirentFromStats(r.name,n),t(null,r)})}}function lW(r,e,t){e.fs.readdir(r,(i,n)=>{if(i!==null){Aw(t,i);return}let s=n.map(o=>{let a=aW.joinPathSegments(r,o,e.pathSegmentSeparator);return l=>{DQe.stat(a,e.fsStatSettings,(c,u)=>{if(c!==null){l(c);return}let g={name:o,path:a,dirent:oW.fs.createDirentFromStats(o,u)};e.stats&&(g.stats=u),l(null,g)})}});sW(s,(o,a)=>{if(o!==null){Aw(t,o);return}wP(t,a)})})}YA.readdir=lW;function Aw(r,e){r(e)}function wP(r,e){r(null,e)}});var pW=w(jA=>{\"use strict\";Object.defineProperty(jA,\"__esModule\",{value:!0});jA.readdir=jA.readdirWithFileTypes=jA.read=void 0;var NQe=bc(),TQe=mP(),uW=IP(),gW=yP();function LQe(r,e){return!e.stats&&TQe.IS_SUPPORT_READDIR_WITH_FILE_TYPES?fW(r,e):hW(r,e)}jA.read=LQe;function fW(r,e){return e.fs.readdirSync(r,{withFileTypes:!0}).map(i=>{let n={dirent:i,name:i.name,path:gW.joinPathSegments(r,i.name,e.pathSegmentSeparator)};if(n.dirent.isSymbolicLink()&&e.followSymbolicLinks)try{let s=e.fs.statSync(n.path);n.dirent=uW.fs.createDirentFromStats(n.name,s)}catch(s){if(e.throwErrorOnBrokenSymbolicLink)throw s}return n})}jA.readdirWithFileTypes=fW;function hW(r,e){return e.fs.readdirSync(r).map(i=>{let n=gW.joinPathSegments(r,i,e.pathSegmentSeparator),s=NQe.statSync(n,e.fsStatSettings),o={name:i,path:n,dirent:uW.fs.createDirentFromStats(i,s)};return e.stats&&(o.stats=s),o})}jA.readdir=hW});var dW=w(qA=>{\"use strict\";Object.defineProperty(qA,\"__esModule\",{value:!0});qA.createFileSystemAdapter=qA.FILE_SYSTEM_ADAPTER=void 0;var wf=J(\"fs\");qA.FILE_SYSTEM_ADAPTER={lstat:wf.lstat,stat:wf.stat,lstatSync:wf.lstatSync,statSync:wf.statSync,readdir:wf.readdir,readdirSync:wf.readdirSync};function OQe(r){return r===void 0?qA.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},qA.FILE_SYSTEM_ADAPTER),r)}qA.createFileSystemAdapter=OQe});var CW=w(QP=>{\"use strict\";Object.defineProperty(QP,\"__esModule\",{value:!0});var MQe=J(\"path\"),KQe=bc(),UQe=dW(),BP=class{constructor(e={}){this._options=e,this.followSymbolicLinks=this._getValue(this._options.followSymbolicLinks,!1),this.fs=UQe.createFileSystemAdapter(this._options.fs),this.pathSegmentSeparator=this._getValue(this._options.pathSegmentSeparator,MQe.sep),this.stats=this._getValue(this._options.stats,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0),this.fsStatSettings=new KQe.Settings({followSymbolicLink:this.followSymbolicLinks,fs:this.fs,throwErrorOnBrokenSymbolicLink:this.throwErrorOnBrokenSymbolicLink})}_getValue(e,t){return e!=null?e:t}};QP.default=BP});var lw=w(JA=>{\"use strict\";Object.defineProperty(JA,\"__esModule\",{value:!0});JA.Settings=JA.scandirSync=JA.scandir=void 0;var mW=cW(),HQe=pW(),bP=CW();JA.Settings=bP.default;function GQe(r,e,t){if(typeof e==\"function\"){mW.read(r,SP(),e);return}mW.read(r,SP(e),t)}JA.scandir=GQe;function YQe(r,e){let t=SP(e);return HQe.read(r,t)}JA.scandirSync=YQe;function SP(r={}){return r instanceof bP.default?r:new bP.default(r)}});var IW=w((ort,EW)=>{\"use strict\";function jQe(r){var e=new r,t=e;function i(){var s=e;return s.next?e=s.next:(e=new r,t=e),s.next=null,s}function n(s){t.next=s,t=s}return{get:i,release:n}}EW.exports=jQe});var wW=w((art,vP)=>{\"use strict\";var qQe=IW();function yW(r,e,t){if(typeof r==\"function\"&&(t=e,e=r,r=null),t<1)throw new Error(\"fastqueue concurrency must be greater than 1\");var i=qQe(JQe),n=null,s=null,o=0,a=null,l={push:C,drain:Is,saturated:Is,pause:u,paused:!1,concurrency:t,running:c,resume:h,idle:p,length:g,getQueue:f,unshift:y,empty:Is,kill:v,killAndDrain:D,error:T};return l;function c(){return o}function u(){l.paused=!0}function g(){for(var H=n,j=0;H;)H=H.next,j++;return j}function f(){for(var H=n,j=[];H;)j.push(H.value),H=H.next;return j}function h(){if(!!l.paused){l.paused=!1;for(var H=0;H<l.concurrency;H++)o++,B()}}function p(){return o===0&&l.length()===0}function C(H,j){var $=i.get();$.context=r,$.release=B,$.value=H,$.callback=j||Is,$.errorHandler=a,o===l.concurrency||l.paused?s?(s.next=$,s=$):(n=$,s=$,l.saturated()):(o++,e.call(r,$.value,$.worked))}function y(H,j){var $=i.get();$.context=r,$.release=B,$.value=H,$.callback=j||Is,o===l.concurrency||l.paused?n?($.next=n,n=$):(n=$,s=$,l.saturated()):(o++,e.call(r,$.value,$.worked))}function B(H){H&&i.release(H);var j=n;j?l.paused?o--:(s===n&&(s=null),n=j.next,j.next=null,e.call(r,j.value,j.worked),s===null&&l.empty()):--o===0&&l.drain()}function v(){n=null,s=null,l.drain=Is}function D(){n=null,s=null,l.drain(),l.drain=Is}function T(H){a=H}}function Is(){}function JQe(){this.value=null,this.callback=Is,this.next=null,this.release=Is,this.context=null,this.errorHandler=null;var r=this;this.worked=function(t,i){var n=r.callback,s=r.errorHandler,o=r.value;r.value=null,r.callback=Is,r.errorHandler&&s(t,o),n.call(r.context,t,i),r.release(r)}}function WQe(r,e,t){typeof r==\"function\"&&(t=e,e=r,r=null);function i(u,g){e.call(this,u).then(function(f){g(null,f)},g)}var n=yW(r,i,t),s=n.push,o=n.unshift;return n.push=a,n.unshift=l,n.drained=c,n;function a(u){var g=new Promise(function(f,h){s(u,function(p,C){if(p){h(p);return}f(C)})});return g.catch(Is),g}function l(u){var g=new Promise(function(f,h){o(u,function(p,C){if(p){h(p);return}f(C)})});return g.catch(Is),g}function c(){var u=n.drain,g=new Promise(function(f){n.drain=function(){u(),f()}});return g}}vP.exports=yW;vP.exports.promise=WQe});var cw=w(Go=>{\"use strict\";Object.defineProperty(Go,\"__esModule\",{value:!0});Go.joinPathSegments=Go.replacePathSegmentSeparator=Go.isAppliedFilter=Go.isFatalError=void 0;function zQe(r,e){return r.errorFilter===null?!0:!r.errorFilter(e)}Go.isFatalError=zQe;function VQe(r,e){return r===null||r(e)}Go.isAppliedFilter=VQe;function XQe(r,e){return r.split(/[/\\\\]/).join(e)}Go.replacePathSegmentSeparator=XQe;function ZQe(r,e,t){return r===\"\"?e:r.endsWith(t)?r+e:r+t+e}Go.joinPathSegments=ZQe});var DP=w(PP=>{\"use strict\";Object.defineProperty(PP,\"__esModule\",{value:!0});var _Qe=cw(),xP=class{constructor(e,t){this._root=e,this._settings=t,this._root=_Qe.replacePathSegmentSeparator(e,t.pathSegmentSeparator)}};PP.default=xP});var FP=w(RP=>{\"use strict\";Object.defineProperty(RP,\"__esModule\",{value:!0});var $Qe=J(\"events\"),ebe=lw(),tbe=wW(),uw=cw(),rbe=DP(),kP=class extends rbe.default{constructor(e,t){super(e,t),this._settings=t,this._scandir=ebe.scandir,this._emitter=new $Qe.EventEmitter,this._queue=tbe(this._worker.bind(this),this._settings.concurrency),this._isFatalError=!1,this._isDestroyed=!1,this._queue.drain=()=>{this._isFatalError||this._emitter.emit(\"end\")}}read(){return this._isFatalError=!1,this._isDestroyed=!1,setImmediate(()=>{this._pushToQueue(this._root,this._settings.basePath)}),this._emitter}get isDestroyed(){return this._isDestroyed}destroy(){if(this._isDestroyed)throw new Error(\"The reader is already destroyed\");this._isDestroyed=!0,this._queue.killAndDrain()}onEntry(e){this._emitter.on(\"entry\",e)}onError(e){this._emitter.once(\"error\",e)}onEnd(e){this._emitter.once(\"end\",e)}_pushToQueue(e,t){let i={directory:e,base:t};this._queue.push(i,n=>{n!==null&&this._handleError(n)})}_worker(e,t){this._scandir(e.directory,this._settings.fsScandirSettings,(i,n)=>{if(i!==null){t(i,void 0);return}for(let s of n)this._handleEntry(s,e.base);t(null,void 0)})}_handleError(e){this._isDestroyed||!uw.isFatalError(this._settings,e)||(this._isFatalError=!0,this._isDestroyed=!0,this._emitter.emit(\"error\",e))}_handleEntry(e,t){if(this._isDestroyed||this._isFatalError)return;let i=e.path;t!==void 0&&(e.path=uw.joinPathSegments(t,e.name,this._settings.pathSegmentSeparator)),uw.isAppliedFilter(this._settings.entryFilter,e)&&this._emitEntry(e),e.dirent.isDirectory()&&uw.isAppliedFilter(this._settings.deepFilter,e)&&this._pushToQueue(i,e.path)}_emitEntry(e){this._emitter.emit(\"entry\",e)}};RP.default=kP});var BW=w(TP=>{\"use strict\";Object.defineProperty(TP,\"__esModule\",{value:!0});var ibe=FP(),NP=class{constructor(e,t){this._root=e,this._settings=t,this._reader=new ibe.default(this._root,this._settings),this._storage=new Set}read(e){this._reader.onError(t=>{nbe(e,t)}),this._reader.onEntry(t=>{this._storage.add(t)}),this._reader.onEnd(()=>{sbe(e,[...this._storage])}),this._reader.read()}};TP.default=NP;function nbe(r,e){r(e)}function sbe(r,e){r(null,e)}});var QW=w(OP=>{\"use strict\";Object.defineProperty(OP,\"__esModule\",{value:!0});var obe=J(\"stream\"),abe=FP(),LP=class{constructor(e,t){this._root=e,this._settings=t,this._reader=new abe.default(this._root,this._settings),this._stream=new obe.Readable({objectMode:!0,read:()=>{},destroy:()=>{this._reader.isDestroyed||this._reader.destroy()}})}read(){return this._reader.onError(e=>{this._stream.emit(\"error\",e)}),this._reader.onEntry(e=>{this._stream.push(e)}),this._reader.onEnd(()=>{this._stream.push(null)}),this._reader.read(),this._stream}};OP.default=LP});var bW=w(KP=>{\"use strict\";Object.defineProperty(KP,\"__esModule\",{value:!0});var Abe=lw(),gw=cw(),lbe=DP(),MP=class extends lbe.default{constructor(){super(...arguments),this._scandir=Abe.scandirSync,this._storage=new Set,this._queue=new Set}read(){return this._pushToQueue(this._root,this._settings.basePath),this._handleQueue(),[...this._storage]}_pushToQueue(e,t){this._queue.add({directory:e,base:t})}_handleQueue(){for(let e of this._queue.values())this._handleDirectory(e.directory,e.base)}_handleDirectory(e,t){try{let i=this._scandir(e,this._settings.fsScandirSettings);for(let n of i)this._handleEntry(n,t)}catch(i){this._handleError(i)}}_handleError(e){if(!!gw.isFatalError(this._settings,e))throw e}_handleEntry(e,t){let i=e.path;t!==void 0&&(e.path=gw.joinPathSegments(t,e.name,this._settings.pathSegmentSeparator)),gw.isAppliedFilter(this._settings.entryFilter,e)&&this._pushToStorage(e),e.dirent.isDirectory()&&gw.isAppliedFilter(this._settings.deepFilter,e)&&this._pushToQueue(i,e.path)}_pushToStorage(e){this._storage.add(e)}};KP.default=MP});var SW=w(HP=>{\"use strict\";Object.defineProperty(HP,\"__esModule\",{value:!0});var cbe=bW(),UP=class{constructor(e,t){this._root=e,this._settings=t,this._reader=new cbe.default(this._root,this._settings)}read(){return this._reader.read()}};HP.default=UP});var vW=w(YP=>{\"use strict\";Object.defineProperty(YP,\"__esModule\",{value:!0});var ube=J(\"path\"),gbe=lw(),GP=class{constructor(e={}){this._options=e,this.basePath=this._getValue(this._options.basePath,void 0),this.concurrency=this._getValue(this._options.concurrency,Number.POSITIVE_INFINITY),this.deepFilter=this._getValue(this._options.deepFilter,null),this.entryFilter=this._getValue(this._options.entryFilter,null),this.errorFilter=this._getValue(this._options.errorFilter,null),this.pathSegmentSeparator=this._getValue(this._options.pathSegmentSeparator,ube.sep),this.fsScandirSettings=new gbe.Settings({followSymbolicLinks:this._options.followSymbolicLinks,fs:this._options.fs,pathSegmentSeparator:this._options.pathSegmentSeparator,stats:this._options.stats,throwErrorOnBrokenSymbolicLink:this._options.throwErrorOnBrokenSymbolicLink})}_getValue(e,t){return e!=null?e:t}};YP.default=GP});var qP=w(Yo=>{\"use strict\";Object.defineProperty(Yo,\"__esModule\",{value:!0});Yo.Settings=Yo.walkStream=Yo.walkSync=Yo.walk=void 0;var xW=BW(),fbe=QW(),hbe=SW(),jP=vW();Yo.Settings=jP.default;function pbe(r,e,t){if(typeof e==\"function\"){new xW.default(r,fw()).read(e);return}new xW.default(r,fw(e)).read(t)}Yo.walk=pbe;function dbe(r,e){let t=fw(e);return new hbe.default(r,t).read()}Yo.walkSync=dbe;function Cbe(r,e){let t=fw(e);return new fbe.default(r,t).read()}Yo.walkStream=Cbe;function fw(r={}){return r instanceof jP.default?r:new jP.default(r)}});var zP=w(WP=>{\"use strict\";Object.defineProperty(WP,\"__esModule\",{value:!0});var mbe=J(\"path\"),Ebe=bc(),PW=Oa(),JP=class{constructor(e){this._settings=e,this._fsStatSettings=new Ebe.Settings({followSymbolicLink:this._settings.followSymbolicLinks,fs:this._settings.fs,throwErrorOnBrokenSymbolicLink:this._settings.followSymbolicLinks})}_getFullEntryPath(e){return mbe.resolve(this._settings.cwd,e)}_makeEntry(e,t){let i={name:t,path:t,dirent:PW.fs.createDirentFromStats(t,e)};return this._settings.stats&&(i.stats=e),i}_isFatalError(e){return!PW.errno.isEnoentCodeError(e)&&!this._settings.suppressErrors}};WP.default=JP});var ZP=w(XP=>{\"use strict\";Object.defineProperty(XP,\"__esModule\",{value:!0});var Ibe=J(\"stream\"),ybe=bc(),wbe=qP(),Bbe=zP(),VP=class extends Bbe.default{constructor(){super(...arguments),this._walkStream=wbe.walkStream,this._stat=ybe.stat}dynamic(e,t){return this._walkStream(e,t)}static(e,t){let i=e.map(this._getFullEntryPath,this),n=new Ibe.PassThrough({objectMode:!0});n._write=(s,o,a)=>this._getEntry(i[s],e[s],t).then(l=>{l!==null&&t.entryFilter(l)&&n.push(l),s===i.length-1&&n.end(),a()}).catch(a);for(let s=0;s<i.length;s++)n.write(s);return n}_getEntry(e,t,i){return this._getStat(e).then(n=>this._makeEntry(n,t)).catch(n=>{if(i.errorFilter(n))return null;throw n})}_getStat(e){return new Promise((t,i)=>{this._stat(e,this._fsStatSettings,(n,s)=>n===null?t(s):i(n))})}};XP.default=VP});var DW=w($P=>{\"use strict\";Object.defineProperty($P,\"__esModule\",{value:!0});var Bf=Oa(),_P=class{constructor(e,t,i){this._patterns=e,this._settings=t,this._micromatchOptions=i,this._storage=[],this._fillStorage()}_fillStorage(){let e=Bf.pattern.expandPatternsWithBraceExpansion(this._patterns);for(let t of e){let i=this._getPatternSegments(t),n=this._splitSegmentsIntoSections(i);this._storage.push({complete:n.length<=1,pattern:t,segments:i,sections:n})}}_getPatternSegments(e){return Bf.pattern.getPatternParts(e,this._micromatchOptions).map(i=>Bf.pattern.isDynamicPattern(i,this._settings)?{dynamic:!0,pattern:i,patternRe:Bf.pattern.makeRe(i,this._micromatchOptions)}:{dynamic:!1,pattern:i})}_splitSegmentsIntoSections(e){return Bf.array.splitWhen(e,t=>t.dynamic&&Bf.pattern.hasGlobStar(t.pattern))}};$P.default=_P});var kW=w(tD=>{\"use strict\";Object.defineProperty(tD,\"__esModule\",{value:!0});var Qbe=DW(),eD=class extends Qbe.default{match(e){let t=e.split(\"/\"),i=t.length,n=this._storage.filter(s=>!s.complete||s.segments.length>i);for(let s of n){let o=s.sections[0];if(!s.complete&&i>o.length||t.every((l,c)=>{let u=s.segments[c];return!!(u.dynamic&&u.patternRe.test(l)||!u.dynamic&&u.pattern===l)}))return!0}return!1}};tD.default=eD});var RW=w(iD=>{\"use strict\";Object.defineProperty(iD,\"__esModule\",{value:!0});var hw=Oa(),bbe=kW(),rD=class{constructor(e,t){this._settings=e,this._micromatchOptions=t}getFilter(e,t,i){let n=this._getMatcher(t),s=this._getNegativePatternsRe(i);return o=>this._filter(e,o,n,s)}_getMatcher(e){return new bbe.default(e,this._settings,this._micromatchOptions)}_getNegativePatternsRe(e){let t=e.filter(hw.pattern.isAffectDepthOfReadingPattern);return hw.pattern.convertPatternsToRe(t,this._micromatchOptions)}_filter(e,t,i,n){let s=this._getEntryLevel(e,t.path);if(this._isSkippedByDeep(s)||this._isSkippedSymbolicLink(t))return!1;let o=hw.path.removeLeadingDotSegment(t.path);return this._isSkippedByPositivePatterns(o,i)?!1:this._isSkippedByNegativePatterns(o,n)}_isSkippedByDeep(e){return e>=this._settings.deep}_isSkippedSymbolicLink(e){return!this._settings.followSymbolicLinks&&e.dirent.isSymbolicLink()}_getEntryLevel(e,t){let i=e.split(\"/\").length;return t.split(\"/\").length-(e===\"\"?0:i)}_isSkippedByPositivePatterns(e,t){return!this._settings.baseNameMatch&&!t.match(e)}_isSkippedByNegativePatterns(e,t){return!hw.pattern.matchAny(e,t)}};iD.default=rD});var FW=w(sD=>{\"use strict\";Object.defineProperty(sD,\"__esModule\",{value:!0});var Zd=Oa(),nD=class{constructor(e,t){this._settings=e,this._micromatchOptions=t,this.index=new Map}getFilter(e,t){let i=Zd.pattern.convertPatternsToRe(e,this._micromatchOptions),n=Zd.pattern.convertPatternsToRe(t,this._micromatchOptions);return s=>this._filter(s,i,n)}_filter(e,t,i){if(this._settings.unique){if(this._isDuplicateEntry(e))return!1;this._createIndexRecord(e)}if(this._onlyFileFilter(e)||this._onlyDirectoryFilter(e)||this._isSkippedByAbsoluteNegativePatterns(e,i))return!1;let n=this._settings.baseNameMatch?e.name:e.path;return this._isMatchToPatterns(n,t)&&!this._isMatchToPatterns(e.path,i)}_isDuplicateEntry(e){return this.index.has(e.path)}_createIndexRecord(e){this.index.set(e.path,void 0)}_onlyFileFilter(e){return this._settings.onlyFiles&&!e.dirent.isFile()}_onlyDirectoryFilter(e){return this._settings.onlyDirectories&&!e.dirent.isDirectory()}_isSkippedByAbsoluteNegativePatterns(e,t){if(!this._settings.absolute)return!1;let i=Zd.path.makeAbsolute(this._settings.cwd,e.path);return this._isMatchToPatterns(i,t)}_isMatchToPatterns(e,t){let i=Zd.path.removeLeadingDotSegment(e);return Zd.pattern.matchAny(i,t)}};sD.default=nD});var NW=w(aD=>{\"use strict\";Object.defineProperty(aD,\"__esModule\",{value:!0});var Sbe=Oa(),oD=class{constructor(e){this._settings=e}getFilter(){return e=>this._isNonFatalError(e)}_isNonFatalError(e){return Sbe.errno.isEnoentCodeError(e)||this._settings.suppressErrors}};aD.default=oD});var LW=w(lD=>{\"use strict\";Object.defineProperty(lD,\"__esModule\",{value:!0});var TW=Oa(),AD=class{constructor(e){this._settings=e}getTransformer(){return e=>this._transform(e)}_transform(e){let t=e.path;return this._settings.absolute&&(t=TW.path.makeAbsolute(this._settings.cwd,t),t=TW.path.unixify(t)),this._settings.markDirectories&&e.dirent.isDirectory()&&(t+=\"/\"),this._settings.objectMode?Object.assign(Object.assign({},e),{path:t}):t}};lD.default=AD});var pw=w(uD=>{\"use strict\";Object.defineProperty(uD,\"__esModule\",{value:!0});var vbe=J(\"path\"),xbe=RW(),Pbe=FW(),Dbe=NW(),kbe=LW(),cD=class{constructor(e){this._settings=e,this.errorFilter=new Dbe.default(this._settings),this.entryFilter=new Pbe.default(this._settings,this._getMicromatchOptions()),this.deepFilter=new xbe.default(this._settings,this._getMicromatchOptions()),this.entryTransformer=new kbe.default(this._settings)}_getRootDirectory(e){return vbe.resolve(this._settings.cwd,e.base)}_getReaderOptions(e){let t=e.base===\".\"?\"\":e.base;return{basePath:t,pathSegmentSeparator:\"/\",concurrency:this._settings.concurrency,deepFilter:this.deepFilter.getFilter(t,e.positive,e.negative),entryFilter:this.entryFilter.getFilter(e.positive,e.negative),errorFilter:this.errorFilter.getFilter(),followSymbolicLinks:this._settings.followSymbolicLinks,fs:this._settings.fs,stats:this._settings.stats,throwErrorOnBrokenSymbolicLink:this._settings.throwErrorOnBrokenSymbolicLink,transform:this.entryTransformer.getTransformer()}}_getMicromatchOptions(){return{dot:this._settings.dot,matchBase:this._settings.baseNameMatch,nobrace:!this._settings.braceExpansion,nocase:!this._settings.caseSensitiveMatch,noext:!this._settings.extglob,noglobstar:!this._settings.globstar,posix:!0,strictSlashes:!1}}};uD.default=cD});var OW=w(fD=>{\"use strict\";Object.defineProperty(fD,\"__esModule\",{value:!0});var Rbe=ZP(),Fbe=pw(),gD=class extends Fbe.default{constructor(){super(...arguments),this._reader=new Rbe.default(this._settings)}read(e){let t=this._getRootDirectory(e),i=this._getReaderOptions(e),n=[];return new Promise((s,o)=>{let a=this.api(t,e,i);a.once(\"error\",o),a.on(\"data\",l=>n.push(i.transform(l))),a.once(\"end\",()=>s(n))})}api(e,t,i){return t.dynamic?this._reader.dynamic(e,i):this._reader.static(t.patterns,i)}};fD.default=gD});var MW=w(pD=>{\"use strict\";Object.defineProperty(pD,\"__esModule\",{value:!0});var Nbe=J(\"stream\"),Tbe=ZP(),Lbe=pw(),hD=class extends Lbe.default{constructor(){super(...arguments),this._reader=new Tbe.default(this._settings)}read(e){let t=this._getRootDirectory(e),i=this._getReaderOptions(e),n=this.api(t,e,i),s=new Nbe.Readable({objectMode:!0,read:()=>{}});return n.once(\"error\",o=>s.emit(\"error\",o)).on(\"data\",o=>s.emit(\"data\",i.transform(o))).once(\"end\",()=>s.emit(\"end\")),s.once(\"close\",()=>n.destroy()),s}api(e,t,i){return t.dynamic?this._reader.dynamic(e,i):this._reader.static(t.patterns,i)}};pD.default=hD});var KW=w(CD=>{\"use strict\";Object.defineProperty(CD,\"__esModule\",{value:!0});var Obe=bc(),Mbe=qP(),Kbe=zP(),dD=class extends Kbe.default{constructor(){super(...arguments),this._walkSync=Mbe.walkSync,this._statSync=Obe.statSync}dynamic(e,t){return this._walkSync(e,t)}static(e,t){let i=[];for(let n of e){let s=this._getFullEntryPath(n),o=this._getEntry(s,n,t);o===null||!t.entryFilter(o)||i.push(o)}return i}_getEntry(e,t,i){try{let n=this._getStat(e);return this._makeEntry(n,t)}catch(n){if(i.errorFilter(n))return null;throw n}}_getStat(e){return this._statSync(e,this._fsStatSettings)}};CD.default=dD});var UW=w(ED=>{\"use strict\";Object.defineProperty(ED,\"__esModule\",{value:!0});var Ube=KW(),Hbe=pw(),mD=class extends Hbe.default{constructor(){super(...arguments),this._reader=new Ube.default(this._settings)}read(e){let t=this._getRootDirectory(e),i=this._getReaderOptions(e);return this.api(t,e,i).map(i.transform)}api(e,t,i){return t.dynamic?this._reader.dynamic(e,i):this._reader.static(t.patterns,i)}};ED.default=mD});var HW=w(_d=>{\"use strict\";Object.defineProperty(_d,\"__esModule\",{value:!0});var Qf=J(\"fs\"),Gbe=J(\"os\"),Ybe=Gbe.cpus().length;_d.DEFAULT_FILE_SYSTEM_ADAPTER={lstat:Qf.lstat,lstatSync:Qf.lstatSync,stat:Qf.stat,statSync:Qf.statSync,readdir:Qf.readdir,readdirSync:Qf.readdirSync};var ID=class{constructor(e={}){this._options=e,this.absolute=this._getValue(this._options.absolute,!1),this.baseNameMatch=this._getValue(this._options.baseNameMatch,!1),this.braceExpansion=this._getValue(this._options.braceExpansion,!0),this.caseSensitiveMatch=this._getValue(this._options.caseSensitiveMatch,!0),this.concurrency=this._getValue(this._options.concurrency,Ybe),this.cwd=this._getValue(this._options.cwd,process.cwd()),this.deep=this._getValue(this._options.deep,1/0),this.dot=this._getValue(this._options.dot,!1),this.extglob=this._getValue(this._options.extglob,!0),this.followSymbolicLinks=this._getValue(this._options.followSymbolicLinks,!0),this.fs=this._getFileSystemMethods(this._options.fs),this.globstar=this._getValue(this._options.globstar,!0),this.ignore=this._getValue(this._options.ignore,[]),this.markDirectories=this._getValue(this._options.markDirectories,!1),this.objectMode=this._getValue(this._options.objectMode,!1),this.onlyDirectories=this._getValue(this._options.onlyDirectories,!1),this.onlyFiles=this._getValue(this._options.onlyFiles,!0),this.stats=this._getValue(this._options.stats,!1),this.suppressErrors=this._getValue(this._options.suppressErrors,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!1),this.unique=this._getValue(this._options.unique,!0),this.onlyDirectories&&(this.onlyFiles=!1),this.stats&&(this.objectMode=!0)}_getValue(e,t){return e===void 0?t:e}_getFileSystemMethods(e={}){return Object.assign(Object.assign({},_d.DEFAULT_FILE_SYSTEM_ADAPTER),e)}};_d.default=ID});var dw=w((krt,YW)=>{\"use strict\";var GW=W4(),jbe=OW(),qbe=MW(),Jbe=UW(),yD=HW(),Sc=Oa();async function wD(r,e){bf(r);let t=BD(r,jbe.default,e),i=await Promise.all(t);return Sc.array.flatten(i)}(function(r){function e(o,a){bf(o);let l=BD(o,Jbe.default,a);return Sc.array.flatten(l)}r.sync=e;function t(o,a){bf(o);let l=BD(o,qbe.default,a);return Sc.stream.merge(l)}r.stream=t;function i(o,a){bf(o);let l=[].concat(o),c=new yD.default(a);return GW.generate(l,c)}r.generateTasks=i;function n(o,a){bf(o);let l=new yD.default(a);return Sc.pattern.isDynamicPattern(o,l)}r.isDynamicPattern=n;function s(o){return bf(o),Sc.path.escape(o)}r.escapePath=s})(wD||(wD={}));function BD(r,e,t){let i=[].concat(r),n=new yD.default(t),s=GW.generate(i,n),o=new e(n);return s.map(o.read,o)}function bf(r){if(![].concat(r).every(i=>Sc.string.isString(i)&&!Sc.string.isEmpty(i)))throw new TypeError(\"Patterns must be a string (non empty) or an array of strings\")}YW.exports=wD});var qW=w(vc=>{\"use strict\";var{promisify:Wbe}=J(\"util\"),jW=J(\"fs\");async function QD(r,e,t){if(typeof t!=\"string\")throw new TypeError(`Expected a string, got ${typeof t}`);try{return(await Wbe(jW[r])(t))[e]()}catch(i){if(i.code===\"ENOENT\")return!1;throw i}}function bD(r,e,t){if(typeof t!=\"string\")throw new TypeError(`Expected a string, got ${typeof t}`);try{return jW[r](t)[e]()}catch(i){if(i.code===\"ENOENT\")return!1;throw i}}vc.isFile=QD.bind(null,\"stat\",\"isFile\");vc.isDirectory=QD.bind(null,\"stat\",\"isDirectory\");vc.isSymlink=QD.bind(null,\"lstat\",\"isSymbolicLink\");vc.isFileSync=bD.bind(null,\"statSync\",\"isFile\");vc.isDirectorySync=bD.bind(null,\"statSync\",\"isDirectory\");vc.isSymlinkSync=bD.bind(null,\"lstatSync\",\"isSymbolicLink\")});var XW=w((Frt,SD)=>{\"use strict\";var xc=J(\"path\"),JW=qW(),WW=r=>r.length>1?`{${r.join(\",\")}}`:r[0],zW=(r,e)=>{let t=r[0]===\"!\"?r.slice(1):r;return xc.isAbsolute(t)?t:xc.join(e,t)},zbe=(r,e)=>xc.extname(r)?`**/${r}`:`**/${r}.${WW(e)}`,VW=(r,e)=>{if(e.files&&!Array.isArray(e.files))throw new TypeError(`Expected \\`files\\` to be of type \\`Array\\` but received type \\`${typeof e.files}\\``);if(e.extensions&&!Array.isArray(e.extensions))throw new TypeError(`Expected \\`extensions\\` to be of type \\`Array\\` but received type \\`${typeof e.extensions}\\``);return e.files&&e.extensions?e.files.map(t=>xc.posix.join(r,zbe(t,e.extensions))):e.files?e.files.map(t=>xc.posix.join(r,`**/${t}`)):e.extensions?[xc.posix.join(r,`**/*.${WW(e.extensions)}`)]:[xc.posix.join(r,\"**\")]};SD.exports=async(r,e)=>{if(e={cwd:process.cwd(),...e},typeof e.cwd!=\"string\")throw new TypeError(`Expected \\`cwd\\` to be of type \\`string\\` but received type \\`${typeof e.cwd}\\``);let t=await Promise.all([].concat(r).map(async i=>await JW.isDirectory(zW(i,e.cwd))?VW(i,e):i));return[].concat.apply([],t)};SD.exports.sync=(r,e)=>{if(e={cwd:process.cwd(),...e},typeof e.cwd!=\"string\")throw new TypeError(`Expected \\`cwd\\` to be of type \\`string\\` but received type \\`${typeof e.cwd}\\``);let t=[].concat(r).map(i=>JW.isDirectorySync(zW(i,e.cwd))?VW(i,e):i);return[].concat.apply([],t)}});var n8=w((Nrt,i8)=>{function ZW(r){return Array.isArray(r)?r:[r]}var t8=\"\",_W=\" \",vD=\"\\\\\",Vbe=/^\\s+$/,Xbe=/^\\\\!/,Zbe=/^\\\\#/,_be=/\\r?\\n/g,$be=/^\\.*\\/|^\\.+$/,xD=\"/\",$W=typeof Symbol<\"u\"?Symbol.for(\"node-ignore\"):\"node-ignore\",eSe=(r,e,t)=>Object.defineProperty(r,e,{value:t}),tSe=/([0-z])-([0-z])/g,rSe=r=>r.replace(tSe,(e,t,i)=>t.charCodeAt(0)<=i.charCodeAt(0)?e:t8),iSe=r=>{let{length:e}=r;return r.slice(0,e-e%2)},nSe=[[/\\\\?\\s+$/,r=>r.indexOf(\"\\\\\")===0?_W:t8],[/\\\\\\s/g,()=>_W],[/[\\\\$.|*+(){^]/g,r=>`\\\\${r}`],[/(?!\\\\)\\?/g,()=>\"[^/]\"],[/^\\//,()=>\"^\"],[/\\//g,()=>\"\\\\/\"],[/^\\^*\\\\\\*\\\\\\*\\\\\\//,()=>\"^(?:.*\\\\/)?\"],[/^(?=[^^])/,function(){return/\\/(?!$)/.test(this)?\"^\":\"(?:^|\\\\/)\"}],[/\\\\\\/\\\\\\*\\\\\\*(?=\\\\\\/|$)/g,(r,e,t)=>e+6<t.length?\"(?:\\\\/[^\\\\/]+)*\":\"\\\\/.+\"],[/(^|[^\\\\]+)\\\\\\*(?=.+)/g,(r,e)=>`${e}[^\\\\/]*`],[/\\\\\\\\\\\\(?=[$.|*+(){^])/g,()=>vD],[/\\\\\\\\/g,()=>vD],[/(\\\\)?\\[([^\\]/]*?)(\\\\*)($|\\])/g,(r,e,t,i,n)=>e===vD?`\\\\[${t}${iSe(i)}${n}`:n===\"]\"&&i.length%2===0?`[${rSe(t)}${i}]`:\"[]\"],[/(?:[^*])$/,r=>/\\/$/.test(r)?`${r}$`:`${r}(?=$|\\\\/$)`],[/(\\^|\\\\\\/)?\\\\\\*$/,(r,e)=>`${e?`${e}[^/]+`:\"[^/]*\"}(?=$|\\\\/$)`]],e8=Object.create(null),sSe=(r,e)=>{let t=e8[r];return t||(t=nSe.reduce((i,n)=>i.replace(n[0],n[1].bind(r)),r),e8[r]=t),e?new RegExp(t,\"i\"):new RegExp(t)},kD=r=>typeof r==\"string\",oSe=r=>r&&kD(r)&&!Vbe.test(r)&&r.indexOf(\"#\")!==0,aSe=r=>r.split(_be),PD=class{constructor(e,t,i,n){this.origin=e,this.pattern=t,this.negative=i,this.regex=n}},ASe=(r,e)=>{let t=r,i=!1;r.indexOf(\"!\")===0&&(i=!0,r=r.substr(1)),r=r.replace(Xbe,\"!\").replace(Zbe,\"#\");let n=sSe(r,e);return new PD(t,r,i,n)},lSe=(r,e)=>{throw new e(r)},Ka=(r,e,t)=>kD(r)?r?Ka.isNotRelative(r)?t(`path should be a \\`path.relative()\\`d string, but got \"${e}\"`,RangeError):!0:t(\"path must not be empty\",TypeError):t(`path must be a string, but got \\`${e}\\``,TypeError),r8=r=>$be.test(r);Ka.isNotRelative=r8;Ka.convert=r=>r;var DD=class{constructor({ignorecase:e=!0}={}){eSe(this,$W,!0),this._rules=[],this._ignorecase=e,this._initCache()}_initCache(){this._ignoreCache=Object.create(null),this._testCache=Object.create(null)}_addPattern(e){if(e&&e[$W]){this._rules=this._rules.concat(e._rules),this._added=!0;return}if(oSe(e)){let t=ASe(e,this._ignorecase);this._added=!0,this._rules.push(t)}}add(e){return this._added=!1,ZW(kD(e)?aSe(e):e).forEach(this._addPattern,this),this._added&&this._initCache(),this}addPattern(e){return this.add(e)}_testOne(e,t){let i=!1,n=!1;return this._rules.forEach(s=>{let{negative:o}=s;if(n===o&&i!==n||o&&!i&&!n&&!t)return;s.regex.test(e)&&(i=!o,n=o)}),{ignored:i,unignored:n}}_test(e,t,i,n){let s=e&&Ka.convert(e);return Ka(s,e,lSe),this._t(s,t,i,n)}_t(e,t,i,n){if(e in t)return t[e];if(n||(n=e.split(xD)),n.pop(),!n.length)return t[e]=this._testOne(e,i);let s=this._t(n.join(xD)+xD,t,i,n);return t[e]=s.ignored?s:this._testOne(e,i)}ignores(e){return this._test(e,this._ignoreCache,!1).ignored}createFilter(){return e=>!this.ignores(e)}filter(e){return ZW(e).filter(this.createFilter())}test(e){return this._test(e,this._testCache,!0)}},Cw=r=>new DD(r),cSe=()=>!1,uSe=r=>Ka(r&&Ka.convert(r),r,cSe);Cw.isPathValid=uSe;Cw.default=Cw;i8.exports=Cw;if(typeof process<\"u\"&&(process.env&&process.env.IGNORE_TEST_WIN32||process.platform===\"win32\")){let r=t=>/^\\\\\\\\\\?\\\\/.test(t)||/[\"<>|\\u0000-\\u001F]+/u.test(t)?t:t.replace(/\\\\/g,\"/\");Ka.convert=r;let e=/^[a-z]:\\//i;Ka.isNotRelative=t=>e.test(t)||r8(t)}});var o8=w((Trt,s8)=>{\"use strict\";s8.exports=r=>{let e=/^\\\\\\\\\\?\\\\/.test(r),t=/[^\\u0000-\\u0080]+/.test(r);return e||t?r:r.replace(/\\\\/g,\"/\")}});var f8=w((Lrt,RD)=>{\"use strict\";var{promisify:gSe}=J(\"util\"),a8=J(\"fs\"),Ua=J(\"path\"),A8=dw(),fSe=n8(),$d=o8(),l8=[\"**/node_modules/**\",\"**/flow-typed/**\",\"**/coverage/**\",\"**/.git\"],hSe=gSe(a8.readFile),pSe=r=>e=>e.startsWith(\"!\")?\"!\"+Ua.posix.join(r,e.slice(1)):Ua.posix.join(r,e),dSe=(r,e)=>{let t=$d(Ua.relative(e.cwd,Ua.dirname(e.fileName)));return r.split(/\\r?\\n/).filter(Boolean).filter(i=>!i.startsWith(\"#\")).map(pSe(t))},c8=r=>{let e=fSe();for(let t of r)e.add(dSe(t.content,{cwd:t.cwd,fileName:t.filePath}));return e},CSe=(r,e)=>{if(r=$d(r),Ua.isAbsolute(e)){if($d(e).startsWith(r))return e;throw new Error(`Path ${e} is not in cwd ${r}`)}return Ua.join(r,e)},u8=(r,e)=>t=>r.ignores($d(Ua.relative(e,CSe(e,t.path||t)))),mSe=async(r,e)=>{let t=Ua.join(e,r),i=await hSe(t,\"utf8\");return{cwd:e,filePath:t,content:i}},ESe=(r,e)=>{let t=Ua.join(e,r),i=a8.readFileSync(t,\"utf8\");return{cwd:e,filePath:t,content:i}},g8=({ignore:r=[],cwd:e=$d(process.cwd())}={})=>({ignore:r,cwd:e});RD.exports=async r=>{r=g8(r);let e=await A8(\"**/.gitignore\",{ignore:l8.concat(r.ignore),cwd:r.cwd}),t=await Promise.all(e.map(n=>mSe(n,r.cwd))),i=c8(t);return u8(i,r.cwd)};RD.exports.sync=r=>{r=g8(r);let t=A8.sync(\"**/.gitignore\",{ignore:l8.concat(r.ignore),cwd:r.cwd}).map(n=>ESe(n,r.cwd)),i=c8(t);return u8(i,r.cwd)}});var p8=w((Ort,h8)=>{\"use strict\";var{Transform:ISe}=J(\"stream\"),mw=class extends ISe{constructor(){super({objectMode:!0})}},FD=class extends mw{constructor(e){super(),this._filter=e}_transform(e,t,i){this._filter(e)&&this.push(e),i()}},ND=class extends mw{constructor(){super(),this._pushed=new Set}_transform(e,t,i){this._pushed.has(e)||(this.push(e),this._pushed.add(e)),i()}};h8.exports={FilterStream:FD,UniqueStream:ND}});var MD=w((Mrt,Pc)=>{\"use strict\";var C8=J(\"fs\"),Ew=d4(),ySe=sP(),Iw=dw(),yw=XW(),TD=f8(),{FilterStream:wSe,UniqueStream:BSe}=p8(),m8=()=>!1,d8=r=>r[0]===\"!\",QSe=r=>{if(!r.every(e=>typeof e==\"string\"))throw new TypeError(\"Patterns must be a string or an array of strings\")},bSe=(r={})=>{if(!r.cwd)return;let e;try{e=C8.statSync(r.cwd)}catch{return}if(!e.isDirectory())throw new Error(\"The `cwd` option must be a path to a directory\")},SSe=r=>r.stats instanceof C8.Stats?r.path:r,ww=(r,e)=>{r=Ew([].concat(r)),QSe(r),bSe(e);let t=[];e={ignore:[],expandDirectories:!0,...e};for(let[i,n]of r.entries()){if(d8(n))continue;let s=r.slice(i).filter(a=>d8(a)).map(a=>a.slice(1)),o={...e,ignore:e.ignore.concat(s)};t.push({pattern:n,options:o})}return t},vSe=(r,e)=>{let t={};return r.options.cwd&&(t.cwd=r.options.cwd),Array.isArray(r.options.expandDirectories)?t={...t,files:r.options.expandDirectories}:typeof r.options.expandDirectories==\"object\"&&(t={...t,...r.options.expandDirectories}),e(r.pattern,t)},LD=(r,e)=>r.options.expandDirectories?vSe(r,e):[r.pattern],E8=r=>r&&r.gitignore?TD.sync({cwd:r.cwd,ignore:r.ignore}):m8,OD=r=>e=>{let{options:t}=r;return t.ignore&&Array.isArray(t.ignore)&&t.expandDirectories&&(t.ignore=yw.sync(t.ignore)),{pattern:e,options:t}};Pc.exports=async(r,e)=>{let t=ww(r,e),i=async()=>e&&e.gitignore?TD({cwd:e.cwd,ignore:e.ignore}):m8,n=async()=>{let l=await Promise.all(t.map(async c=>{let u=await LD(c,yw);return Promise.all(u.map(OD(c)))}));return Ew(...l)},[s,o]=await Promise.all([i(),n()]),a=await Promise.all(o.map(l=>Iw(l.pattern,l.options)));return Ew(...a).filter(l=>!s(SSe(l)))};Pc.exports.sync=(r,e)=>{let t=ww(r,e),i=[];for(let o of t){let a=LD(o,yw.sync).map(OD(o));i.push(...a)}let n=E8(e),s=[];for(let o of i)s=Ew(s,Iw.sync(o.pattern,o.options));return s.filter(o=>!n(o))};Pc.exports.stream=(r,e)=>{let t=ww(r,e),i=[];for(let a of t){let l=LD(a,yw.sync).map(OD(a));i.push(...l)}let n=E8(e),s=new wSe(a=>!n(a)),o=new BSe;return ySe(i.map(a=>Iw.stream(a.pattern,a.options))).pipe(s).pipe(o)};Pc.exports.generateGlobTasks=ww;Pc.exports.hasMagic=(r,e)=>[].concat(r).some(t=>Iw.isDynamicPattern(t,e));Pc.exports.gitignore=TD});var vn=w((tit,N8)=>{function USe(r){var e=typeof r;return r!=null&&(e==\"object\"||e==\"function\")}N8.exports=USe});var WD=w((rit,T8)=>{var HSe=typeof global==\"object\"&&global&&global.Object===Object&&global;T8.exports=HSe});var ys=w((iit,L8)=>{var GSe=WD(),YSe=typeof self==\"object\"&&self&&self.Object===Object&&self,jSe=GSe||YSe||Function(\"return this\")();L8.exports=jSe});var M8=w((nit,O8)=>{var qSe=ys(),JSe=function(){return qSe.Date.now()};O8.exports=JSe});var U8=w((sit,K8)=>{var WSe=/\\s/;function zSe(r){for(var e=r.length;e--&&WSe.test(r.charAt(e)););return e}K8.exports=zSe});var G8=w((oit,H8)=>{var VSe=U8(),XSe=/^\\s+/;function ZSe(r){return r&&r.slice(0,VSe(r)+1).replace(XSe,\"\")}H8.exports=ZSe});var Rc=w((ait,Y8)=>{var _Se=ys(),$Se=_Se.Symbol;Y8.exports=$Se});var W8=w((Ait,J8)=>{var j8=Rc(),q8=Object.prototype,eve=q8.hasOwnProperty,tve=q8.toString,uC=j8?j8.toStringTag:void 0;function rve(r){var e=eve.call(r,uC),t=r[uC];try{r[uC]=void 0;var i=!0}catch{}var n=tve.call(r);return i&&(e?r[uC]=t:delete r[uC]),n}J8.exports=rve});var V8=w((lit,z8)=>{var ive=Object.prototype,nve=ive.toString;function sve(r){return nve.call(r)}z8.exports=sve});var Fc=w((cit,_8)=>{var X8=Rc(),ove=W8(),ave=V8(),Ave=\"[object Null]\",lve=\"[object Undefined]\",Z8=X8?X8.toStringTag:void 0;function cve(r){return r==null?r===void 0?lve:Ave:Z8&&Z8 in Object(r)?ove(r):ave(r)}_8.exports=cve});var Jo=w((uit,$8)=>{function uve(r){return r!=null&&typeof r==\"object\"}$8.exports=uve});var gC=w((git,ez)=>{var gve=Fc(),fve=Jo(),hve=\"[object Symbol]\";function pve(r){return typeof r==\"symbol\"||fve(r)&&gve(r)==hve}ez.exports=pve});var nz=w((fit,iz)=>{var dve=G8(),tz=vn(),Cve=gC(),rz=0/0,mve=/^[-+]0x[0-9a-f]+$/i,Eve=/^0b[01]+$/i,Ive=/^0o[0-7]+$/i,yve=parseInt;function wve(r){if(typeof r==\"number\")return r;if(Cve(r))return rz;if(tz(r)){var e=typeof r.valueOf==\"function\"?r.valueOf():r;r=tz(e)?e+\"\":e}if(typeof r!=\"string\")return r===0?r:+r;r=dve(r);var t=Eve.test(r);return t||Ive.test(r)?yve(r.slice(2),t?2:8):mve.test(r)?rz:+r}iz.exports=wve});var az=w((hit,oz)=>{var Bve=vn(),zD=M8(),sz=nz(),Qve=\"Expected a function\",bve=Math.max,Sve=Math.min;function vve(r,e,t){var i,n,s,o,a,l,c=0,u=!1,g=!1,f=!0;if(typeof r!=\"function\")throw new TypeError(Qve);e=sz(e)||0,Bve(t)&&(u=!!t.leading,g=\"maxWait\"in t,s=g?bve(sz(t.maxWait)||0,e):s,f=\"trailing\"in t?!!t.trailing:f);function h(j){var $=i,V=n;return i=n=void 0,c=j,o=r.apply(V,$),o}function p(j){return c=j,a=setTimeout(B,e),u?h(j):o}function C(j){var $=j-l,V=j-c,W=e-$;return g?Sve(W,s-V):W}function y(j){var $=j-l,V=j-c;return l===void 0||$>=e||$<0||g&&V>=s}function B(){var j=zD();if(y(j))return v(j);a=setTimeout(B,C(j))}function v(j){return a=void 0,f&&i?h(j):(i=n=void 0,o)}function D(){a!==void 0&&clearTimeout(a),c=0,i=l=n=a=void 0}function T(){return a===void 0?o:v(zD())}function H(){var j=zD(),$=y(j);if(i=arguments,n=this,l=j,$){if(a===void 0)return p(l);if(g)return clearTimeout(a),a=setTimeout(B,e),h(l)}return a===void 0&&(a=setTimeout(B,e)),o}return H.cancel=D,H.flush=T,H}oz.exports=vve});var lz=w((pit,Az)=>{var xve=az(),Pve=vn(),Dve=\"Expected a function\";function kve(r,e,t){var i=!0,n=!0;if(typeof r!=\"function\")throw new TypeError(Dve);return Pve(t)&&(i=\"leading\"in t?!!t.leading:i,n=\"trailing\"in t?!!t.trailing:n),xve(r,e,{leading:i,maxWait:e,trailing:n})}Az.exports=kve});var Ya=w((Ga,jw)=>{\"use strict\";Object.defineProperty(Ga,\"__esModule\",{value:!0});var mz=[\"Int8Array\",\"Uint8Array\",\"Uint8ClampedArray\",\"Int16Array\",\"Uint16Array\",\"Int32Array\",\"Uint32Array\",\"Float32Array\",\"Float64Array\",\"BigInt64Array\",\"BigUint64Array\"];function jve(r){return mz.includes(r)}var qve=[\"Function\",\"Generator\",\"AsyncGenerator\",\"GeneratorFunction\",\"AsyncGeneratorFunction\",\"AsyncFunction\",\"Observable\",\"Array\",\"Buffer\",\"Object\",\"RegExp\",\"Date\",\"Error\",\"Map\",\"Set\",\"WeakMap\",\"WeakSet\",\"ArrayBuffer\",\"SharedArrayBuffer\",\"DataView\",\"Promise\",\"URL\",\"FormData\",\"URLSearchParams\",\"HTMLElement\",...mz];function Jve(r){return qve.includes(r)}var Wve=[\"null\",\"undefined\",\"string\",\"number\",\"bigint\",\"boolean\",\"symbol\"];function zve(r){return Wve.includes(r)}function Lf(r){return e=>typeof e===r}var{toString:Ez}=Object.prototype,CC=r=>{let e=Ez.call(r).slice(8,-1);if(/HTML\\w+Element/.test(e)&&X.domElement(r))return\"HTMLElement\";if(Jve(e))return e},lr=r=>e=>CC(e)===r;function X(r){if(r===null)return\"null\";switch(typeof r){case\"undefined\":return\"undefined\";case\"string\":return\"string\";case\"number\":return\"number\";case\"boolean\":return\"boolean\";case\"function\":return\"Function\";case\"bigint\":return\"bigint\";case\"symbol\":return\"symbol\";default:}if(X.observable(r))return\"Observable\";if(X.array(r))return\"Array\";if(X.buffer(r))return\"Buffer\";let e=CC(r);if(e)return e;if(r instanceof String||r instanceof Boolean||r instanceof Number)throw new TypeError(\"Please don't use object wrappers for primitive types\");return\"Object\"}X.undefined=Lf(\"undefined\");X.string=Lf(\"string\");var Vve=Lf(\"number\");X.number=r=>Vve(r)&&!X.nan(r);X.bigint=Lf(\"bigint\");X.function_=Lf(\"function\");X.null_=r=>r===null;X.class_=r=>X.function_(r)&&r.toString().startsWith(\"class \");X.boolean=r=>r===!0||r===!1;X.symbol=Lf(\"symbol\");X.numericString=r=>X.string(r)&&!X.emptyStringOrWhitespace(r)&&!Number.isNaN(Number(r));X.array=(r,e)=>Array.isArray(r)?X.function_(e)?r.every(e):!0:!1;X.buffer=r=>{var e,t,i,n;return(n=(i=(t=(e=r)===null||e===void 0?void 0:e.constructor)===null||t===void 0?void 0:t.isBuffer)===null||i===void 0?void 0:i.call(t,r))!==null&&n!==void 0?n:!1};X.nullOrUndefined=r=>X.null_(r)||X.undefined(r);X.object=r=>!X.null_(r)&&(typeof r==\"object\"||X.function_(r));X.iterable=r=>{var e;return X.function_((e=r)===null||e===void 0?void 0:e[Symbol.iterator])};X.asyncIterable=r=>{var e;return X.function_((e=r)===null||e===void 0?void 0:e[Symbol.asyncIterator])};X.generator=r=>X.iterable(r)&&X.function_(r.next)&&X.function_(r.throw);X.asyncGenerator=r=>X.asyncIterable(r)&&X.function_(r.next)&&X.function_(r.throw);X.nativePromise=r=>lr(\"Promise\")(r);var Xve=r=>{var e,t;return X.function_((e=r)===null||e===void 0?void 0:e.then)&&X.function_((t=r)===null||t===void 0?void 0:t.catch)};X.promise=r=>X.nativePromise(r)||Xve(r);X.generatorFunction=lr(\"GeneratorFunction\");X.asyncGeneratorFunction=r=>CC(r)===\"AsyncGeneratorFunction\";X.asyncFunction=r=>CC(r)===\"AsyncFunction\";X.boundFunction=r=>X.function_(r)&&!r.hasOwnProperty(\"prototype\");X.regExp=lr(\"RegExp\");X.date=lr(\"Date\");X.error=lr(\"Error\");X.map=r=>lr(\"Map\")(r);X.set=r=>lr(\"Set\")(r);X.weakMap=r=>lr(\"WeakMap\")(r);X.weakSet=r=>lr(\"WeakSet\")(r);X.int8Array=lr(\"Int8Array\");X.uint8Array=lr(\"Uint8Array\");X.uint8ClampedArray=lr(\"Uint8ClampedArray\");X.int16Array=lr(\"Int16Array\");X.uint16Array=lr(\"Uint16Array\");X.int32Array=lr(\"Int32Array\");X.uint32Array=lr(\"Uint32Array\");X.float32Array=lr(\"Float32Array\");X.float64Array=lr(\"Float64Array\");X.bigInt64Array=lr(\"BigInt64Array\");X.bigUint64Array=lr(\"BigUint64Array\");X.arrayBuffer=lr(\"ArrayBuffer\");X.sharedArrayBuffer=lr(\"SharedArrayBuffer\");X.dataView=lr(\"DataView\");X.directInstanceOf=(r,e)=>Object.getPrototypeOf(r)===e.prototype;X.urlInstance=r=>lr(\"URL\")(r);X.urlString=r=>{if(!X.string(r))return!1;try{return new URL(r),!0}catch{return!1}};X.truthy=r=>Boolean(r);X.falsy=r=>!r;X.nan=r=>Number.isNaN(r);X.primitive=r=>X.null_(r)||zve(typeof r);X.integer=r=>Number.isInteger(r);X.safeInteger=r=>Number.isSafeInteger(r);X.plainObject=r=>{if(Ez.call(r)!==\"[object Object]\")return!1;let e=Object.getPrototypeOf(r);return e===null||e===Object.getPrototypeOf({})};X.typedArray=r=>jve(CC(r));var Zve=r=>X.safeInteger(r)&&r>=0;X.arrayLike=r=>!X.nullOrUndefined(r)&&!X.function_(r)&&Zve(r.length);X.inRange=(r,e)=>{if(X.number(e))return r>=Math.min(0,e)&&r<=Math.max(e,0);if(X.array(e)&&e.length===2)return r>=Math.min(...e)&&r<=Math.max(...e);throw new TypeError(`Invalid range: ${JSON.stringify(e)}`)};var _ve=1,$ve=[\"innerHTML\",\"ownerDocument\",\"style\",\"attributes\",\"nodeValue\"];X.domElement=r=>X.object(r)&&r.nodeType===_ve&&X.string(r.nodeName)&&!X.plainObject(r)&&$ve.every(e=>e in r);X.observable=r=>{var e,t,i,n;return r?r===((t=(e=r)[Symbol.observable])===null||t===void 0?void 0:t.call(e))||r===((n=(i=r)[\"@@observable\"])===null||n===void 0?void 0:n.call(i)):!1};X.nodeStream=r=>X.object(r)&&X.function_(r.pipe)&&!X.observable(r);X.infinite=r=>r===1/0||r===-1/0;var Iz=r=>e=>X.integer(e)&&Math.abs(e%2)===r;X.evenInteger=Iz(0);X.oddInteger=Iz(1);X.emptyArray=r=>X.array(r)&&r.length===0;X.nonEmptyArray=r=>X.array(r)&&r.length>0;X.emptyString=r=>X.string(r)&&r.length===0;X.nonEmptyString=r=>X.string(r)&&r.length>0;var exe=r=>X.string(r)&&!/\\S/.test(r);X.emptyStringOrWhitespace=r=>X.emptyString(r)||exe(r);X.emptyObject=r=>X.object(r)&&!X.map(r)&&!X.set(r)&&Object.keys(r).length===0;X.nonEmptyObject=r=>X.object(r)&&!X.map(r)&&!X.set(r)&&Object.keys(r).length>0;X.emptySet=r=>X.set(r)&&r.size===0;X.nonEmptySet=r=>X.set(r)&&r.size>0;X.emptyMap=r=>X.map(r)&&r.size===0;X.nonEmptyMap=r=>X.map(r)&&r.size>0;X.propertyKey=r=>X.any([X.string,X.number,X.symbol],r);X.formData=r=>lr(\"FormData\")(r);X.urlSearchParams=r=>lr(\"URLSearchParams\")(r);var yz=(r,e,t)=>{if(!X.function_(e))throw new TypeError(`Invalid predicate: ${JSON.stringify(e)}`);if(t.length===0)throw new TypeError(\"Invalid number of values\");return r.call(t,e)};X.any=(r,...e)=>(X.array(r)?r:[r]).some(i=>yz(Array.prototype.some,i,e));X.all=(r,...e)=>yz(Array.prototype.every,r,e);var Ye=(r,e,t,i={})=>{if(!r){let{multipleValues:n}=i,s=n?`received values of types ${[...new Set(t.map(o=>`\\`${X(o)}\\``))].join(\", \")}`:`received value of type \\`${X(t)}\\``;throw new TypeError(`Expected value which is \\`${e}\\`, ${s}.`)}};Ga.assert={undefined:r=>Ye(X.undefined(r),\"undefined\",r),string:r=>Ye(X.string(r),\"string\",r),number:r=>Ye(X.number(r),\"number\",r),bigint:r=>Ye(X.bigint(r),\"bigint\",r),function_:r=>Ye(X.function_(r),\"Function\",r),null_:r=>Ye(X.null_(r),\"null\",r),class_:r=>Ye(X.class_(r),\"Class\",r),boolean:r=>Ye(X.boolean(r),\"boolean\",r),symbol:r=>Ye(X.symbol(r),\"symbol\",r),numericString:r=>Ye(X.numericString(r),\"string with a number\",r),array:(r,e)=>{Ye(X.array(r),\"Array\",r),e&&r.forEach(e)},buffer:r=>Ye(X.buffer(r),\"Buffer\",r),nullOrUndefined:r=>Ye(X.nullOrUndefined(r),\"null or undefined\",r),object:r=>Ye(X.object(r),\"Object\",r),iterable:r=>Ye(X.iterable(r),\"Iterable\",r),asyncIterable:r=>Ye(X.asyncIterable(r),\"AsyncIterable\",r),generator:r=>Ye(X.generator(r),\"Generator\",r),asyncGenerator:r=>Ye(X.asyncGenerator(r),\"AsyncGenerator\",r),nativePromise:r=>Ye(X.nativePromise(r),\"native Promise\",r),promise:r=>Ye(X.promise(r),\"Promise\",r),generatorFunction:r=>Ye(X.generatorFunction(r),\"GeneratorFunction\",r),asyncGeneratorFunction:r=>Ye(X.asyncGeneratorFunction(r),\"AsyncGeneratorFunction\",r),asyncFunction:r=>Ye(X.asyncFunction(r),\"AsyncFunction\",r),boundFunction:r=>Ye(X.boundFunction(r),\"Function\",r),regExp:r=>Ye(X.regExp(r),\"RegExp\",r),date:r=>Ye(X.date(r),\"Date\",r),error:r=>Ye(X.error(r),\"Error\",r),map:r=>Ye(X.map(r),\"Map\",r),set:r=>Ye(X.set(r),\"Set\",r),weakMap:r=>Ye(X.weakMap(r),\"WeakMap\",r),weakSet:r=>Ye(X.weakSet(r),\"WeakSet\",r),int8Array:r=>Ye(X.int8Array(r),\"Int8Array\",r),uint8Array:r=>Ye(X.uint8Array(r),\"Uint8Array\",r),uint8ClampedArray:r=>Ye(X.uint8ClampedArray(r),\"Uint8ClampedArray\",r),int16Array:r=>Ye(X.int16Array(r),\"Int16Array\",r),uint16Array:r=>Ye(X.uint16Array(r),\"Uint16Array\",r),int32Array:r=>Ye(X.int32Array(r),\"Int32Array\",r),uint32Array:r=>Ye(X.uint32Array(r),\"Uint32Array\",r),float32Array:r=>Ye(X.float32Array(r),\"Float32Array\",r),float64Array:r=>Ye(X.float64Array(r),\"Float64Array\",r),bigInt64Array:r=>Ye(X.bigInt64Array(r),\"BigInt64Array\",r),bigUint64Array:r=>Ye(X.bigUint64Array(r),\"BigUint64Array\",r),arrayBuffer:r=>Ye(X.arrayBuffer(r),\"ArrayBuffer\",r),sharedArrayBuffer:r=>Ye(X.sharedArrayBuffer(r),\"SharedArrayBuffer\",r),dataView:r=>Ye(X.dataView(r),\"DataView\",r),urlInstance:r=>Ye(X.urlInstance(r),\"URL\",r),urlString:r=>Ye(X.urlString(r),\"string with a URL\",r),truthy:r=>Ye(X.truthy(r),\"truthy\",r),falsy:r=>Ye(X.falsy(r),\"falsy\",r),nan:r=>Ye(X.nan(r),\"NaN\",r),primitive:r=>Ye(X.primitive(r),\"primitive\",r),integer:r=>Ye(X.integer(r),\"integer\",r),safeInteger:r=>Ye(X.safeInteger(r),\"integer\",r),plainObject:r=>Ye(X.plainObject(r),\"plain object\",r),typedArray:r=>Ye(X.typedArray(r),\"TypedArray\",r),arrayLike:r=>Ye(X.arrayLike(r),\"array-like\",r),domElement:r=>Ye(X.domElement(r),\"HTMLElement\",r),observable:r=>Ye(X.observable(r),\"Observable\",r),nodeStream:r=>Ye(X.nodeStream(r),\"Node.js Stream\",r),infinite:r=>Ye(X.infinite(r),\"infinite number\",r),emptyArray:r=>Ye(X.emptyArray(r),\"empty array\",r),nonEmptyArray:r=>Ye(X.nonEmptyArray(r),\"non-empty array\",r),emptyString:r=>Ye(X.emptyString(r),\"empty string\",r),nonEmptyString:r=>Ye(X.nonEmptyString(r),\"non-empty string\",r),emptyStringOrWhitespace:r=>Ye(X.emptyStringOrWhitespace(r),\"empty string or whitespace\",r),emptyObject:r=>Ye(X.emptyObject(r),\"empty object\",r),nonEmptyObject:r=>Ye(X.nonEmptyObject(r),\"non-empty object\",r),emptySet:r=>Ye(X.emptySet(r),\"empty set\",r),nonEmptySet:r=>Ye(X.nonEmptySet(r),\"non-empty set\",r),emptyMap:r=>Ye(X.emptyMap(r),\"empty map\",r),nonEmptyMap:r=>Ye(X.nonEmptyMap(r),\"non-empty map\",r),propertyKey:r=>Ye(X.propertyKey(r),\"PropertyKey\",r),formData:r=>Ye(X.formData(r),\"FormData\",r),urlSearchParams:r=>Ye(X.urlSearchParams(r),\"URLSearchParams\",r),evenInteger:r=>Ye(X.evenInteger(r),\"even integer\",r),oddInteger:r=>Ye(X.oddInteger(r),\"odd integer\",r),directInstanceOf:(r,e)=>Ye(X.directInstanceOf(r,e),\"T\",r),inRange:(r,e)=>Ye(X.inRange(r,e),\"in range\",r),any:(r,...e)=>Ye(X.any(r,...e),\"predicate returns truthy for any value\",e,{multipleValues:!0}),all:(r,...e)=>Ye(X.all(r,...e),\"predicate returns truthy for all values\",e,{multipleValues:!0})};Object.defineProperties(X,{class:{value:X.class_},function:{value:X.function_},null:{value:X.null_}});Object.defineProperties(Ga.assert,{class:{value:Ga.assert.class_},function:{value:Ga.assert.function_},null:{value:Ga.assert.null_}});Ga.default=X;jw.exports=X;jw.exports.default=X;jw.exports.assert=Ga.assert});var wz=w((ent,dk)=>{\"use strict\";var qw=class extends Error{constructor(e){super(e||\"Promise was canceled\"),this.name=\"CancelError\"}get isCanceled(){return!0}},Of=class{static fn(e){return(...t)=>new Of((i,n,s)=>{t.push(s),e(...t).then(i,n)})}constructor(e){this._cancelHandlers=[],this._isPending=!0,this._isCanceled=!1,this._rejectOnCancel=!0,this._promise=new Promise((t,i)=>{this._reject=i;let n=a=>{this._isPending=!1,t(a)},s=a=>{this._isPending=!1,i(a)},o=a=>{if(!this._isPending)throw new Error(\"The `onCancel` handler was attached after the promise settled.\");this._cancelHandlers.push(a)};return Object.defineProperties(o,{shouldReject:{get:()=>this._rejectOnCancel,set:a=>{this._rejectOnCancel=a}}}),e(n,s,o)})}then(e,t){return this._promise.then(e,t)}catch(e){return this._promise.catch(e)}finally(e){return this._promise.finally(e)}cancel(e){if(!(!this._isPending||this._isCanceled)){if(this._cancelHandlers.length>0)try{for(let t of this._cancelHandlers)t()}catch(t){this._reject(t)}this._isCanceled=!0,this._rejectOnCancel&&this._reject(new qw(e))}}get isCanceled(){return this._isCanceled}};Object.setPrototypeOf(Of.prototype,Promise.prototype);dk.exports=Of;dk.exports.CancelError=qw});var Bz=w((mk,Ek)=>{\"use strict\";Object.defineProperty(mk,\"__esModule\",{value:!0});var txe=J(\"tls\"),Ck=(r,e)=>{let t;typeof e==\"function\"?t={connect:e}:t=e;let i=typeof t.connect==\"function\",n=typeof t.secureConnect==\"function\",s=typeof t.close==\"function\",o=()=>{i&&t.connect(),r instanceof txe.TLSSocket&&n&&(r.authorized?t.secureConnect():r.authorizationError||r.once(\"secureConnect\",t.secureConnect)),s&&r.once(\"close\",t.close)};r.writable&&!r.connecting?o():r.connecting?r.once(\"connect\",o):r.destroyed&&s&&t.close(r._hadError)};mk.default=Ck;Ek.exports=Ck;Ek.exports.default=Ck});var Qz=w((yk,wk)=>{\"use strict\";Object.defineProperty(yk,\"__esModule\",{value:!0});var rxe=Bz(),ixe=Number(process.versions.node.split(\".\")[0]),Ik=r=>{let e={start:Date.now(),socket:void 0,lookup:void 0,connect:void 0,secureConnect:void 0,upload:void 0,response:void 0,end:void 0,error:void 0,abort:void 0,phases:{wait:void 0,dns:void 0,tcp:void 0,tls:void 0,request:void 0,firstByte:void 0,download:void 0,total:void 0}};r.timings=e;let t=o=>{let a=o.emit.bind(o);o.emit=(l,...c)=>(l===\"error\"&&(e.error=Date.now(),e.phases.total=e.error-e.start,o.emit=a),a(l,...c))};t(r),r.prependOnceListener(\"abort\",()=>{e.abort=Date.now(),(!e.response||ixe>=13)&&(e.phases.total=Date.now()-e.start)});let i=o=>{e.socket=Date.now(),e.phases.wait=e.socket-e.start;let a=()=>{e.lookup=Date.now(),e.phases.dns=e.lookup-e.socket};o.prependOnceListener(\"lookup\",a),rxe.default(o,{connect:()=>{e.connect=Date.now(),e.lookup===void 0&&(o.removeListener(\"lookup\",a),e.lookup=e.connect,e.phases.dns=e.lookup-e.socket),e.phases.tcp=e.connect-e.lookup},secureConnect:()=>{e.secureConnect=Date.now(),e.phases.tls=e.secureConnect-e.connect}})};r.socket?i(r.socket):r.prependOnceListener(\"socket\",i);let n=()=>{var o;e.upload=Date.now(),e.phases.request=e.upload-(o=e.secureConnect,o!=null?o:e.connect)};return(()=>typeof r.writableFinished==\"boolean\"?r.writableFinished:r.finished&&r.outputSize===0&&(!r.socket||r.socket.writableLength===0))()?n():r.prependOnceListener(\"finish\",n),r.prependOnceListener(\"response\",o=>{e.response=Date.now(),e.phases.firstByte=e.response-e.upload,o.timings=e,t(o),o.prependOnceListener(\"end\",()=>{e.end=Date.now(),e.phases.download=e.end-e.response,e.phases.total=e.end-e.start})}),e};yk.default=Ik;wk.exports=Ik;wk.exports.default=Ik});var kz=w((tnt,bk)=>{\"use strict\";var{V4MAPPED:nxe,ADDRCONFIG:sxe,ALL:Dz,promises:{Resolver:bz},lookup:oxe}=J(\"dns\"),{promisify:Bk}=J(\"util\"),axe=J(\"os\"),Mf=Symbol(\"cacheableLookupCreateConnection\"),Qk=Symbol(\"cacheableLookupInstance\"),Sz=Symbol(\"expires\"),Axe=typeof Dz==\"number\",vz=r=>{if(!(r&&typeof r.createConnection==\"function\"))throw new Error(\"Expected an Agent instance as the first argument\")},lxe=r=>{for(let e of r)e.family!==6&&(e.address=`::ffff:${e.address}`,e.family=6)},xz=()=>{let r=!1,e=!1;for(let t of Object.values(axe.networkInterfaces()))for(let i of t)if(!i.internal&&(i.family===\"IPv6\"?e=!0:r=!0,r&&e))return{has4:r,has6:e};return{has4:r,has6:e}},cxe=r=>Symbol.iterator in r,Pz={ttl:!0},uxe={all:!0},Jw=class{constructor({cache:e=new Map,maxTtl:t=1/0,fallbackDuration:i=3600,errorTtl:n=.15,resolver:s=new bz,lookup:o=oxe}={}){if(this.maxTtl=t,this.errorTtl=n,this._cache=e,this._resolver=s,this._dnsLookup=Bk(o),this._resolver instanceof bz?(this._resolve4=this._resolver.resolve4.bind(this._resolver),this._resolve6=this._resolver.resolve6.bind(this._resolver)):(this._resolve4=Bk(this._resolver.resolve4.bind(this._resolver)),this._resolve6=Bk(this._resolver.resolve6.bind(this._resolver))),this._iface=xz(),this._pending={},this._nextRemovalTime=!1,this._hostnamesToFallback=new Set,i<1)this._fallback=!1;else{this._fallback=!0;let a=setInterval(()=>{this._hostnamesToFallback.clear()},i*1e3);a.unref&&a.unref()}this.lookup=this.lookup.bind(this),this.lookupAsync=this.lookupAsync.bind(this)}set servers(e){this.clear(),this._resolver.setServers(e)}get servers(){return this._resolver.getServers()}lookup(e,t,i){if(typeof t==\"function\"?(i=t,t={}):typeof t==\"number\"&&(t={family:t}),!i)throw new Error(\"Callback must be a function.\");this.lookupAsync(e,t).then(n=>{t.all?i(null,n):i(null,n.address,n.family,n.expires,n.ttl)},i)}async lookupAsync(e,t={}){typeof t==\"number\"&&(t={family:t});let i=await this.query(e);if(t.family===6){let n=i.filter(s=>s.family===6);t.hints&nxe&&(Axe&&t.hints&Dz||n.length===0)?lxe(i):i=n}else t.family===4&&(i=i.filter(n=>n.family===4));if(t.hints&sxe){let{_iface:n}=this;i=i.filter(s=>s.family===6?n.has6:n.has4)}if(i.length===0){let n=new Error(`cacheableLookup ENOTFOUND ${e}`);throw n.code=\"ENOTFOUND\",n.hostname=e,n}return t.all?i:i[0]}async query(e){let t=await this._cache.get(e);if(!t){let i=this._pending[e];if(i)t=await i;else{let n=this.queryAndCache(e);this._pending[e]=n,t=await n}}return t=t.map(i=>({...i})),t}async _resolve(e){let t=async c=>{try{return await c}catch(u){if(u.code===\"ENODATA\"||u.code===\"ENOTFOUND\")return[];throw u}},[i,n]=await Promise.all([this._resolve4(e,Pz),this._resolve6(e,Pz)].map(c=>t(c))),s=0,o=0,a=0,l=Date.now();for(let c of i)c.family=4,c.expires=l+c.ttl*1e3,s=Math.max(s,c.ttl);for(let c of n)c.family=6,c.expires=l+c.ttl*1e3,o=Math.max(o,c.ttl);return i.length>0?n.length>0?a=Math.min(s,o):a=s:a=o,{entries:[...i,...n],cacheTtl:a}}async _lookup(e){try{return{entries:await this._dnsLookup(e,{all:!0}),cacheTtl:0}}catch{return{entries:[],cacheTtl:0}}}async _set(e,t,i){if(this.maxTtl>0&&i>0){i=Math.min(i,this.maxTtl)*1e3,t[Sz]=Date.now()+i;try{await this._cache.set(e,t,i)}catch(n){this.lookupAsync=async()=>{let s=new Error(\"Cache Error. Please recreate the CacheableLookup instance.\");throw s.cause=n,s}}cxe(this._cache)&&this._tick(i)}}async queryAndCache(e){if(this._hostnamesToFallback.has(e))return this._dnsLookup(e,uxe);try{let t=await this._resolve(e);t.entries.length===0&&this._fallback&&(t=await this._lookup(e),t.entries.length!==0&&this._hostnamesToFallback.add(e));let i=t.entries.length===0?this.errorTtl:t.cacheTtl;return await this._set(e,t.entries,i),delete this._pending[e],t.entries}catch(t){throw delete this._pending[e],t}}_tick(e){let t=this._nextRemovalTime;(!t||e<t)&&(clearTimeout(this._removalTimeout),this._nextRemovalTime=e,this._removalTimeout=setTimeout(()=>{this._nextRemovalTime=!1;let i=1/0,n=Date.now();for(let[s,o]of this._cache){let a=o[Sz];n>=a?this._cache.delete(s):a<i&&(i=a)}i!==1/0&&this._tick(i-n)},e),this._removalTimeout.unref&&this._removalTimeout.unref())}install(e){if(vz(e),Mf in e)throw new Error(\"CacheableLookup has been already installed\");e[Mf]=e.createConnection,e[Qk]=this,e.createConnection=(t,i)=>(\"lookup\"in t||(t.lookup=this.lookup),e[Mf](t,i))}uninstall(e){if(vz(e),e[Mf]){if(e[Qk]!==this)throw new Error(\"The agent is not owned by this CacheableLookup instance\");e.createConnection=e[Mf],delete e[Mf],delete e[Qk]}}updateInterfaceInfo(){let{_iface:e}=this;this._iface=xz(),(e.has4&&!this._iface.has4||e.has6&&!this._iface.has6)&&this._cache.clear()}clear(e){if(e){this._cache.delete(e);return}this._cache.clear()}};bk.exports=Jw;bk.exports.default=Jw});var Nz=w((rnt,Sk)=>{\"use strict\";var gxe=typeof URL>\"u\"?J(\"url\").URL:URL,fxe=\"text/plain\",hxe=\"us-ascii\",Rz=(r,e)=>e.some(t=>t instanceof RegExp?t.test(r):t===r),pxe=(r,{stripHash:e})=>{let t=r.match(/^data:([^,]*?),([^#]*?)(?:#(.*))?$/);if(!t)throw new Error(`Invalid URL: ${r}`);let i=t[1].split(\";\"),n=t[2],s=e?\"\":t[3],o=!1;i[i.length-1]===\"base64\"&&(i.pop(),o=!0);let a=(i.shift()||\"\").toLowerCase(),c=[...i.map(u=>{let[g,f=\"\"]=u.split(\"=\").map(h=>h.trim());return g===\"charset\"&&(f=f.toLowerCase(),f===hxe)?\"\":`${g}${f?`=${f}`:\"\"}`}).filter(Boolean)];return o&&c.push(\"base64\"),(c.length!==0||a&&a!==fxe)&&c.unshift(a),`data:${c.join(\";\")},${o?n.trim():n}${s?`#${s}`:\"\"}`},Fz=(r,e)=>{if(e={defaultProtocol:\"http:\",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripAuthentication:!0,stripHash:!1,stripWWW:!0,removeQueryParameters:[/^utm_\\w+/i],removeTrailingSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0,...e},Reflect.has(e,\"normalizeHttps\"))throw new Error(\"options.normalizeHttps is renamed to options.forceHttp\");if(Reflect.has(e,\"normalizeHttp\"))throw new Error(\"options.normalizeHttp is renamed to options.forceHttps\");if(Reflect.has(e,\"stripFragment\"))throw new Error(\"options.stripFragment is renamed to options.stripHash\");if(r=r.trim(),/^data:/i.test(r))return pxe(r,e);let t=r.startsWith(\"//\");!t&&/^\\.*\\//.test(r)||(r=r.replace(/^(?!(?:\\w+:)?\\/\\/)|^\\/\\//,e.defaultProtocol));let n=new gxe(r);if(e.forceHttp&&e.forceHttps)throw new Error(\"The `forceHttp` and `forceHttps` options cannot be used together\");if(e.forceHttp&&n.protocol===\"https:\"&&(n.protocol=\"http:\"),e.forceHttps&&n.protocol===\"http:\"&&(n.protocol=\"https:\"),e.stripAuthentication&&(n.username=\"\",n.password=\"\"),e.stripHash&&(n.hash=\"\"),n.pathname&&(n.pathname=n.pathname.replace(/((?!:).|^)\\/{2,}/g,(s,o)=>/^(?!\\/)/g.test(o)?`${o}/`:\"/\")),n.pathname&&(n.pathname=decodeURI(n.pathname)),e.removeDirectoryIndex===!0&&(e.removeDirectoryIndex=[/^index\\.[a-z]+$/]),Array.isArray(e.removeDirectoryIndex)&&e.removeDirectoryIndex.length>0){let s=n.pathname.split(\"/\"),o=s[s.length-1];Rz(o,e.removeDirectoryIndex)&&(s=s.slice(0,s.length-1),n.pathname=s.slice(1).join(\"/\")+\"/\")}if(n.hostname&&(n.hostname=n.hostname.replace(/\\.$/,\"\"),e.stripWWW&&/^www\\.([a-z\\-\\d]{2,63})\\.([a-z.]{2,5})$/.test(n.hostname)&&(n.hostname=n.hostname.replace(/^www\\./,\"\"))),Array.isArray(e.removeQueryParameters))for(let s of[...n.searchParams.keys()])Rz(s,e.removeQueryParameters)&&n.searchParams.delete(s);return e.sortQueryParameters&&n.searchParams.sort(),e.removeTrailingSlash&&(n.pathname=n.pathname.replace(/\\/$/,\"\")),r=n.toString(),(e.removeTrailingSlash||n.pathname===\"/\")&&n.hash===\"\"&&(r=r.replace(/\\/$/,\"\")),t&&!e.normalizeProtocol&&(r=r.replace(/^http:\\/\\//,\"//\")),e.stripProtocol&&(r=r.replace(/^(?:https?:)?\\/\\//,\"\")),r};Sk.exports=Fz;Sk.exports.default=Fz});var Oz=w((int,Lz)=>{Lz.exports=Tz;function Tz(r,e){if(r&&e)return Tz(r)(e);if(typeof r!=\"function\")throw new TypeError(\"need wrapper function\");return Object.keys(r).forEach(function(i){t[i]=r[i]}),t;function t(){for(var i=new Array(arguments.length),n=0;n<i.length;n++)i[n]=arguments[n];var s=r.apply(this,i),o=i[i.length-1];return typeof s==\"function\"&&s!==o&&Object.keys(o).forEach(function(a){s[a]=o[a]}),s}}});var xk=w((nnt,vk)=>{var Mz=Oz();vk.exports=Mz(Ww);vk.exports.strict=Mz(Kz);Ww.proto=Ww(function(){Object.defineProperty(Function.prototype,\"once\",{value:function(){return Ww(this)},configurable:!0}),Object.defineProperty(Function.prototype,\"onceStrict\",{value:function(){return Kz(this)},configurable:!0})});function Ww(r){var e=function(){return e.called?e.value:(e.called=!0,e.value=r.apply(this,arguments))};return e.called=!1,e}function Kz(r){var e=function(){if(e.called)throw new Error(e.onceError);return e.called=!0,e.value=r.apply(this,arguments)},t=r.name||\"Function wrapped with `once`\";return e.onceError=t+\" shouldn't be called more than once\",e.called=!1,e}});var Pk=w((snt,Hz)=>{var dxe=xk(),Cxe=function(){},mxe=function(r){return r.setHeader&&typeof r.abort==\"function\"},Exe=function(r){return r.stdio&&Array.isArray(r.stdio)&&r.stdio.length===3},Uz=function(r,e,t){if(typeof e==\"function\")return Uz(r,null,e);e||(e={}),t=dxe(t||Cxe);var i=r._writableState,n=r._readableState,s=e.readable||e.readable!==!1&&r.readable,o=e.writable||e.writable!==!1&&r.writable,a=function(){r.writable||l()},l=function(){o=!1,s||t.call(r)},c=function(){s=!1,o||t.call(r)},u=function(p){t.call(r,p?new Error(\"exited with error code: \"+p):null)},g=function(p){t.call(r,p)},f=function(){if(s&&!(n&&n.ended))return t.call(r,new Error(\"premature close\"));if(o&&!(i&&i.ended))return t.call(r,new Error(\"premature close\"))},h=function(){r.req.on(\"finish\",l)};return mxe(r)?(r.on(\"complete\",l),r.on(\"abort\",f),r.req?h():r.on(\"request\",h)):o&&!i&&(r.on(\"end\",a),r.on(\"close\",a)),Exe(r)&&r.on(\"exit\",u),r.on(\"end\",c),r.on(\"finish\",l),e.error!==!1&&r.on(\"error\",g),r.on(\"close\",f),function(){r.removeListener(\"complete\",l),r.removeListener(\"abort\",f),r.removeListener(\"request\",h),r.req&&r.req.removeListener(\"finish\",l),r.removeListener(\"end\",a),r.removeListener(\"close\",a),r.removeListener(\"finish\",l),r.removeListener(\"exit\",u),r.removeListener(\"end\",c),r.removeListener(\"error\",g),r.removeListener(\"close\",f)}};Hz.exports=Uz});var jz=w((ont,Yz)=>{var Ixe=xk(),yxe=Pk(),Dk=J(\"fs\"),mC=function(){},wxe=/^v?\\.0/.test(process.version),zw=function(r){return typeof r==\"function\"},Bxe=function(r){return!wxe||!Dk?!1:(r instanceof(Dk.ReadStream||mC)||r instanceof(Dk.WriteStream||mC))&&zw(r.close)},Qxe=function(r){return r.setHeader&&zw(r.abort)},bxe=function(r,e,t,i){i=Ixe(i);var n=!1;r.on(\"close\",function(){n=!0}),yxe(r,{readable:e,writable:t},function(o){if(o)return i(o);n=!0,i()});var s=!1;return function(o){if(!n&&!s){if(s=!0,Bxe(r))return r.close(mC);if(Qxe(r))return r.abort();if(zw(r.destroy))return r.destroy();i(o||new Error(\"stream was destroyed\"))}}},Gz=function(r){r()},Sxe=function(r,e){return r.pipe(e)},vxe=function(){var r=Array.prototype.slice.call(arguments),e=zw(r[r.length-1]||mC)&&r.pop()||mC;if(Array.isArray(r[0])&&(r=r[0]),r.length<2)throw new Error(\"pump requires two streams per minimum\");var t,i=r.map(function(n,s){var o=s<r.length-1,a=s>0;return bxe(n,o,a,function(l){t||(t=l),l&&i.forEach(Gz),!o&&(i.forEach(Gz),e(t))})});return r.reduce(Sxe)};Yz.exports=vxe});var Jz=w((ant,qz)=>{\"use strict\";var{PassThrough:xxe}=J(\"stream\");qz.exports=r=>{r={...r};let{array:e}=r,{encoding:t}=r,i=t===\"buffer\",n=!1;e?n=!(t||i):t=t||\"utf8\",i&&(t=null);let s=new xxe({objectMode:n});t&&s.setEncoding(t);let o=0,a=[];return s.on(\"data\",l=>{a.push(l),n?o=a.length:o+=l.length}),s.getBufferedValue=()=>e?a:i?Buffer.concat(a,o):a.join(\"\"),s.getBufferedLength=()=>o,s}});var Wz=w((Ant,Kf)=>{\"use strict\";var Pxe=jz(),Dxe=Jz(),Vw=class extends Error{constructor(){super(\"maxBuffer exceeded\"),this.name=\"MaxBufferError\"}};async function Xw(r,e){if(!r)return Promise.reject(new Error(\"Expected a stream\"));e={maxBuffer:1/0,...e};let{maxBuffer:t}=e,i;return await new Promise((n,s)=>{let o=a=>{a&&(a.bufferedData=i.getBufferedValue()),s(a)};i=Pxe(r,Dxe(e),a=>{if(a){o(a);return}n()}),i.on(\"data\",()=>{i.getBufferedLength()>t&&o(new Vw)})}),i.getBufferedValue()}Kf.exports=Xw;Kf.exports.default=Xw;Kf.exports.buffer=(r,e)=>Xw(r,{...e,encoding:\"buffer\"});Kf.exports.array=(r,e)=>Xw(r,{...e,array:!0});Kf.exports.MaxBufferError=Vw});var Vz=w((cnt,zz)=>{\"use strict\";var kxe=new Set([200,203,204,206,300,301,404,405,410,414,501]),Rxe=new Set([200,203,204,300,301,302,303,307,308,404,405,410,414,501]),Fxe=new Set([500,502,503,504]),Nxe={date:!0,connection:!0,\"keep-alive\":!0,\"proxy-authenticate\":!0,\"proxy-authorization\":!0,te:!0,trailer:!0,\"transfer-encoding\":!0,upgrade:!0},Txe={\"content-length\":!0,\"content-encoding\":!0,\"transfer-encoding\":!0,\"content-range\":!0};function Lc(r){let e=parseInt(r,10);return isFinite(e)?e:0}function Lxe(r){return r?Fxe.has(r.status):!0}function kk(r){let e={};if(!r)return e;let t=r.trim().split(/\\s*,\\s*/);for(let i of t){let[n,s]=i.split(/\\s*=\\s*/,2);e[n]=s===void 0?!0:s.replace(/^\"|\"$/g,\"\")}return e}function Oxe(r){let e=[];for(let t in r){let i=r[t];e.push(i===!0?t:t+\"=\"+i)}if(!!e.length)return e.join(\", \")}zz.exports=class{constructor(e,t,{shared:i,cacheHeuristic:n,immutableMinTimeToLive:s,ignoreCargoCult:o,_fromObject:a}={}){if(a){this._fromObject(a);return}if(!t||!t.headers)throw Error(\"Response headers missing\");this._assertRequestHasHeaders(e),this._responseTime=this.now(),this._isShared=i!==!1,this._cacheHeuristic=n!==void 0?n:.1,this._immutableMinTtl=s!==void 0?s:24*3600*1e3,this._status=\"status\"in t?t.status:200,this._resHeaders=t.headers,this._rescc=kk(t.headers[\"cache-control\"]),this._method=\"method\"in e?e.method:\"GET\",this._url=e.url,this._host=e.headers.host,this._noAuthorization=!e.headers.authorization,this._reqHeaders=t.headers.vary?e.headers:null,this._reqcc=kk(e.headers[\"cache-control\"]),o&&\"pre-check\"in this._rescc&&\"post-check\"in this._rescc&&(delete this._rescc[\"pre-check\"],delete this._rescc[\"post-check\"],delete this._rescc[\"no-cache\"],delete this._rescc[\"no-store\"],delete this._rescc[\"must-revalidate\"],this._resHeaders=Object.assign({},this._resHeaders,{\"cache-control\":Oxe(this._rescc)}),delete this._resHeaders.expires,delete this._resHeaders.pragma),t.headers[\"cache-control\"]==null&&/no-cache/.test(t.headers.pragma)&&(this._rescc[\"no-cache\"]=!0)}now(){return Date.now()}storable(){return!!(!this._reqcc[\"no-store\"]&&(this._method===\"GET\"||this._method===\"HEAD\"||this._method===\"POST\"&&this._hasExplicitExpiration())&&Rxe.has(this._status)&&!this._rescc[\"no-store\"]&&(!this._isShared||!this._rescc.private)&&(!this._isShared||this._noAuthorization||this._allowsStoringAuthenticated())&&(this._resHeaders.expires||this._rescc[\"max-age\"]||this._isShared&&this._rescc[\"s-maxage\"]||this._rescc.public||kxe.has(this._status)))}_hasExplicitExpiration(){return this._isShared&&this._rescc[\"s-maxage\"]||this._rescc[\"max-age\"]||this._resHeaders.expires}_assertRequestHasHeaders(e){if(!e||!e.headers)throw Error(\"Request headers missing\")}satisfiesWithoutRevalidation(e){this._assertRequestHasHeaders(e);let t=kk(e.headers[\"cache-control\"]);return t[\"no-cache\"]||/no-cache/.test(e.headers.pragma)||t[\"max-age\"]&&this.age()>t[\"max-age\"]||t[\"min-fresh\"]&&this.timeToLive()<1e3*t[\"min-fresh\"]||this.stale()&&!(t[\"max-stale\"]&&!this._rescc[\"must-revalidate\"]&&(t[\"max-stale\"]===!0||t[\"max-stale\"]>this.age()-this.maxAge()))?!1:this._requestMatches(e,!1)}_requestMatches(e,t){return(!this._url||this._url===e.url)&&this._host===e.headers.host&&(!e.method||this._method===e.method||t&&e.method===\"HEAD\")&&this._varyMatches(e)}_allowsStoringAuthenticated(){return this._rescc[\"must-revalidate\"]||this._rescc.public||this._rescc[\"s-maxage\"]}_varyMatches(e){if(!this._resHeaders.vary)return!0;if(this._resHeaders.vary===\"*\")return!1;let t=this._resHeaders.vary.trim().toLowerCase().split(/\\s*,\\s*/);for(let i of t)if(e.headers[i]!==this._reqHeaders[i])return!1;return!0}_copyWithoutHopByHopHeaders(e){let t={};for(let i in e)Nxe[i]||(t[i]=e[i]);if(e.connection){let i=e.connection.trim().split(/\\s*,\\s*/);for(let n of i)delete t[n]}if(t.warning){let i=t.warning.split(/,/).filter(n=>!/^\\s*1[0-9][0-9]/.test(n));i.length?t.warning=i.join(\",\").trim():delete t.warning}return t}responseHeaders(){let e=this._copyWithoutHopByHopHeaders(this._resHeaders),t=this.age();return t>3600*24&&!this._hasExplicitExpiration()&&this.maxAge()>3600*24&&(e.warning=(e.warning?`${e.warning}, `:\"\")+'113 - \"rfc7234 5.5.4\"'),e.age=`${Math.round(t)}`,e.date=new Date(this.now()).toUTCString(),e}date(){let e=Date.parse(this._resHeaders.date);return isFinite(e)?e:this._responseTime}age(){let e=this._ageValue(),t=(this.now()-this._responseTime)/1e3;return e+t}_ageValue(){return Lc(this._resHeaders.age)}maxAge(){if(!this.storable()||this._rescc[\"no-cache\"]||this._isShared&&this._resHeaders[\"set-cookie\"]&&!this._rescc.public&&!this._rescc.immutable||this._resHeaders.vary===\"*\")return 0;if(this._isShared){if(this._rescc[\"proxy-revalidate\"])return 0;if(this._rescc[\"s-maxage\"])return Lc(this._rescc[\"s-maxage\"])}if(this._rescc[\"max-age\"])return Lc(this._rescc[\"max-age\"]);let e=this._rescc.immutable?this._immutableMinTtl:0,t=this.date();if(this._resHeaders.expires){let i=Date.parse(this._resHeaders.expires);return Number.isNaN(i)||i<t?0:Math.max(e,(i-t)/1e3)}if(this._resHeaders[\"last-modified\"]){let i=Date.parse(this._resHeaders[\"last-modified\"]);if(isFinite(i)&&t>i)return Math.max(e,(t-i)/1e3*this._cacheHeuristic)}return e}timeToLive(){let e=this.maxAge()-this.age(),t=e+Lc(this._rescc[\"stale-if-error\"]),i=e+Lc(this._rescc[\"stale-while-revalidate\"]);return Math.max(0,e,t,i)*1e3}stale(){return this.maxAge()<=this.age()}_useStaleIfError(){return this.maxAge()+Lc(this._rescc[\"stale-if-error\"])>this.age()}useStaleWhileRevalidate(){return this.maxAge()+Lc(this._rescc[\"stale-while-revalidate\"])>this.age()}static fromObject(e){return new this(void 0,void 0,{_fromObject:e})}_fromObject(e){if(this._responseTime)throw Error(\"Reinitialized\");if(!e||e.v!==1)throw Error(\"Invalid serialization\");this._responseTime=e.t,this._isShared=e.sh,this._cacheHeuristic=e.ch,this._immutableMinTtl=e.imm!==void 0?e.imm:24*3600*1e3,this._status=e.st,this._resHeaders=e.resh,this._rescc=e.rescc,this._method=e.m,this._url=e.u,this._host=e.h,this._noAuthorization=e.a,this._reqHeaders=e.reqh,this._reqcc=e.reqcc}toObject(){return{v:1,t:this._responseTime,sh:this._isShared,ch:this._cacheHeuristic,imm:this._immutableMinTtl,st:this._status,resh:this._resHeaders,rescc:this._rescc,m:this._method,u:this._url,h:this._host,a:this._noAuthorization,reqh:this._reqHeaders,reqcc:this._reqcc}}revalidationHeaders(e){this._assertRequestHasHeaders(e);let t=this._copyWithoutHopByHopHeaders(e.headers);if(delete t[\"if-range\"],!this._requestMatches(e,!0)||!this.storable())return delete t[\"if-none-match\"],delete t[\"if-modified-since\"],t;if(this._resHeaders.etag&&(t[\"if-none-match\"]=t[\"if-none-match\"]?`${t[\"if-none-match\"]}, ${this._resHeaders.etag}`:this._resHeaders.etag),t[\"accept-ranges\"]||t[\"if-match\"]||t[\"if-unmodified-since\"]||this._method&&this._method!=\"GET\"){if(delete t[\"if-modified-since\"],t[\"if-none-match\"]){let n=t[\"if-none-match\"].split(/,/).filter(s=>!/^\\s*W\\//.test(s));n.length?t[\"if-none-match\"]=n.join(\",\").trim():delete t[\"if-none-match\"]}}else this._resHeaders[\"last-modified\"]&&!t[\"if-modified-since\"]&&(t[\"if-modified-since\"]=this._resHeaders[\"last-modified\"]);return t}revalidatedPolicy(e,t){if(this._assertRequestHasHeaders(e),this._useStaleIfError()&&Lxe(t))return{modified:!1,matches:!1,policy:this};if(!t||!t.headers)throw Error(\"Response headers missing\");let i=!1;if(t.status!==void 0&&t.status!=304?i=!1:t.headers.etag&&!/^\\s*W\\//.test(t.headers.etag)?i=this._resHeaders.etag&&this._resHeaders.etag.replace(/^\\s*W\\//,\"\")===t.headers.etag:this._resHeaders.etag&&t.headers.etag?i=this._resHeaders.etag.replace(/^\\s*W\\//,\"\")===t.headers.etag.replace(/^\\s*W\\//,\"\"):this._resHeaders[\"last-modified\"]?i=this._resHeaders[\"last-modified\"]===t.headers[\"last-modified\"]:!this._resHeaders.etag&&!this._resHeaders[\"last-modified\"]&&!t.headers.etag&&!t.headers[\"last-modified\"]&&(i=!0),!i)return{policy:new this.constructor(e,t),modified:t.status!=304,matches:!1};let n={};for(let o in this._resHeaders)n[o]=o in t.headers&&!Txe[o]?t.headers[o]:this._resHeaders[o];let s=Object.assign({},t,{status:this._status,method:this._method,headers:n});return{policy:new this.constructor(e,s,{shared:this._isShared,cacheHeuristic:this._cacheHeuristic,immutableMinTimeToLive:this._immutableMinTtl}),modified:!1,matches:!0}}}});var Zw=w((unt,Xz)=>{\"use strict\";Xz.exports=r=>{let e={};for(let[t,i]of Object.entries(r))e[t.toLowerCase()]=i;return e}});var _z=w((gnt,Zz)=>{\"use strict\";var Mxe=J(\"stream\").Readable,Kxe=Zw(),Rk=class extends Mxe{constructor(e,t,i,n){if(typeof e!=\"number\")throw new TypeError(\"Argument `statusCode` should be a number\");if(typeof t!=\"object\")throw new TypeError(\"Argument `headers` should be an object\");if(!(i instanceof Buffer))throw new TypeError(\"Argument `body` should be a buffer\");if(typeof n!=\"string\")throw new TypeError(\"Argument `url` should be a string\");super(),this.statusCode=e,this.headers=Kxe(t),this.body=i,this.url=n}_read(){this.push(this.body),this.push(null)}};Zz.exports=Rk});var e5=w((fnt,$z)=>{\"use strict\";var Uxe=[\"destroy\",\"setTimeout\",\"socket\",\"headers\",\"trailers\",\"rawHeaders\",\"statusCode\",\"httpVersion\",\"httpVersionMinor\",\"httpVersionMajor\",\"rawTrailers\",\"statusMessage\"];$z.exports=(r,e)=>{let t=new Set(Object.keys(r).concat(Uxe));for(let i of t)i in e||(e[i]=typeof r[i]==\"function\"?r[i].bind(r):r[i])}});var r5=w((hnt,t5)=>{\"use strict\";var Hxe=J(\"stream\").PassThrough,Gxe=e5(),Yxe=r=>{if(!(r&&r.pipe))throw new TypeError(\"Parameter `response` must be a response stream.\");let e=new Hxe;return Gxe(r,e),r.pipe(e)};t5.exports=Yxe});var i5=w(Fk=>{Fk.stringify=function r(e){if(typeof e>\"u\")return e;if(e&&Buffer.isBuffer(e))return JSON.stringify(\":base64:\"+e.toString(\"base64\"));if(e&&e.toJSON&&(e=e.toJSON()),e&&typeof e==\"object\"){var t=\"\",i=Array.isArray(e);t=i?\"[\":\"{\";var n=!0;for(var s in e){var o=typeof e[s]==\"function\"||!i&&typeof e[s]>\"u\";Object.hasOwnProperty.call(e,s)&&!o&&(n||(t+=\",\"),n=!1,i?e[s]==null?t+=\"null\":t+=r(e[s]):e[s]!==void 0&&(t+=r(s)+\":\"+r(e[s])))}return t+=i?\"]\":\"}\",t}else return typeof e==\"string\"?JSON.stringify(/^:/.test(e)?\":\"+e:e):typeof e>\"u\"?\"null\":JSON.stringify(e)};Fk.parse=function(r){return JSON.parse(r,function(e,t){return typeof t==\"string\"?/^:base64:/.test(t)?Buffer.from(t.substring(8),\"base64\"):/^:/.test(t)?t.substring(1):t:t})}});var o5=w((dnt,s5)=>{\"use strict\";var jxe=J(\"events\"),n5=i5(),qxe=r=>{let e={redis:\"@keyv/redis\",mongodb:\"@keyv/mongo\",mongo:\"@keyv/mongo\",sqlite:\"@keyv/sqlite\",postgresql:\"@keyv/postgres\",postgres:\"@keyv/postgres\",mysql:\"@keyv/mysql\"};if(r.adapter||r.uri){let t=r.adapter||/^[^:]*/.exec(r.uri)[0];return new(J(e[t]))(r)}return new Map},Nk=class extends jxe{constructor(e,t){if(super(),this.opts=Object.assign({namespace:\"keyv\",serialize:n5.stringify,deserialize:n5.parse},typeof e==\"string\"?{uri:e}:e,t),!this.opts.store){let i=Object.assign({},this.opts);this.opts.store=qxe(i)}typeof this.opts.store.on==\"function\"&&this.opts.store.on(\"error\",i=>this.emit(\"error\",i)),this.opts.store.namespace=this.opts.namespace}_getKeyPrefix(e){return`${this.opts.namespace}:${e}`}get(e,t){e=this._getKeyPrefix(e);let{store:i}=this.opts;return Promise.resolve().then(()=>i.get(e)).then(n=>typeof n==\"string\"?this.opts.deserialize(n):n).then(n=>{if(n!==void 0){if(typeof n.expires==\"number\"&&Date.now()>n.expires){this.delete(e);return}return t&&t.raw?n:n.value}})}set(e,t,i){e=this._getKeyPrefix(e),typeof i>\"u\"&&(i=this.opts.ttl),i===0&&(i=void 0);let{store:n}=this.opts;return Promise.resolve().then(()=>{let s=typeof i==\"number\"?Date.now()+i:null;return t={value:t,expires:s},this.opts.serialize(t)}).then(s=>n.set(e,s,i)).then(()=>!0)}delete(e){e=this._getKeyPrefix(e);let{store:t}=this.opts;return Promise.resolve().then(()=>t.delete(e))}clear(){let{store:e}=this.opts;return Promise.resolve().then(()=>e.clear())}};s5.exports=Nk});var l5=w((mnt,A5)=>{\"use strict\";var Jxe=J(\"events\"),_w=J(\"url\"),Wxe=Nz(),zxe=Wz(),Tk=Vz(),a5=_z(),Vxe=Zw(),Xxe=r5(),Zxe=o5(),oo=class{constructor(e,t){if(typeof e!=\"function\")throw new TypeError(\"Parameter `request` must be a function\");return this.cache=new Zxe({uri:typeof t==\"string\"&&t,store:typeof t!=\"string\"&&t,namespace:\"cacheable-request\"}),this.createCacheableRequest(e)}createCacheableRequest(e){return(t,i)=>{let n;if(typeof t==\"string\")n=Lk(_w.parse(t)),t={};else if(t instanceof _w.URL)n=Lk(_w.parse(t.toString())),t={};else{let[g,...f]=(t.path||\"\").split(\"?\"),h=f.length>0?`?${f.join(\"?\")}`:\"\";n=Lk({...t,pathname:g,search:h})}t={headers:{},method:\"GET\",cache:!0,strictTtl:!1,automaticFailover:!1,...t,..._xe(n)},t.headers=Vxe(t.headers);let s=new Jxe,o=Wxe(_w.format(n),{stripWWW:!1,removeTrailingSlash:!1,stripAuthentication:!1}),a=`${t.method}:${o}`,l=!1,c=!1,u=g=>{c=!0;let f=!1,h,p=new Promise(y=>{h=()=>{f||(f=!0,y())}}),C=y=>{if(l&&!g.forceRefresh){y.status=y.statusCode;let v=Tk.fromObject(l.cachePolicy).revalidatedPolicy(g,y);if(!v.modified){let D=v.policy.responseHeaders();y=new a5(l.statusCode,D,l.body,l.url),y.cachePolicy=v.policy,y.fromCache=!0}}y.fromCache||(y.cachePolicy=new Tk(g,y,g),y.fromCache=!1);let B;g.cache&&y.cachePolicy.storable()?(B=Xxe(y),(async()=>{try{let v=zxe.buffer(y);if(await Promise.race([p,new Promise(j=>y.once(\"end\",j))]),f)return;let D=await v,T={cachePolicy:y.cachePolicy.toObject(),url:y.url,statusCode:y.fromCache?l.statusCode:y.statusCode,body:D},H=g.strictTtl?y.cachePolicy.timeToLive():void 0;g.maxTtl&&(H=H?Math.min(H,g.maxTtl):g.maxTtl),await this.cache.set(a,T,H)}catch(v){s.emit(\"error\",new oo.CacheError(v))}})()):g.cache&&l&&(async()=>{try{await this.cache.delete(a)}catch(v){s.emit(\"error\",new oo.CacheError(v))}})(),s.emit(\"response\",B||y),typeof i==\"function\"&&i(B||y)};try{let y=e(g,C);y.once(\"error\",h),y.once(\"abort\",h),s.emit(\"request\",y)}catch(y){s.emit(\"error\",new oo.RequestError(y))}};return(async()=>{let g=async h=>{await Promise.resolve();let p=h.cache?await this.cache.get(a):void 0;if(typeof p>\"u\")return u(h);let C=Tk.fromObject(p.cachePolicy);if(C.satisfiesWithoutRevalidation(h)&&!h.forceRefresh){let y=C.responseHeaders(),B=new a5(p.statusCode,y,p.body,p.url);B.cachePolicy=C,B.fromCache=!0,s.emit(\"response\",B),typeof i==\"function\"&&i(B)}else l=p,h.headers=C.revalidationHeaders(h),u(h)},f=h=>s.emit(\"error\",new oo.CacheError(h));this.cache.once(\"error\",f),s.on(\"response\",()=>this.cache.removeListener(\"error\",f));try{await g(t)}catch(h){t.automaticFailover&&!c&&u(t),s.emit(\"error\",new oo.CacheError(h))}})(),s}}};function _xe(r){let e={...r};return e.path=`${r.pathname||\"/\"}${r.search||\"\"}`,delete e.pathname,delete e.search,e}function Lk(r){return{protocol:r.protocol,auth:r.auth,hostname:r.hostname||r.host||\"localhost\",port:r.port,pathname:r.pathname,search:r.search}}oo.RequestError=class extends Error{constructor(r){super(r.message),this.name=\"RequestError\",Object.assign(this,r)}};oo.CacheError=class extends Error{constructor(r){super(r.message),this.name=\"CacheError\",Object.assign(this,r)}};A5.exports=oo});var u5=w((ynt,c5)=>{\"use strict\";var $xe=[\"aborted\",\"complete\",\"headers\",\"httpVersion\",\"httpVersionMinor\",\"httpVersionMajor\",\"method\",\"rawHeaders\",\"rawTrailers\",\"setTimeout\",\"socket\",\"statusCode\",\"statusMessage\",\"trailers\",\"url\"];c5.exports=(r,e)=>{if(e._readableState.autoDestroy)throw new Error(\"The second stream must have the `autoDestroy` option set to `false`\");let t=new Set(Object.keys(r).concat($xe)),i={};for(let n of t)n in e||(i[n]={get(){let s=r[n];return typeof s==\"function\"?s.bind(r):s},set(s){r[n]=s},enumerable:!0,configurable:!1});return Object.defineProperties(e,i),r.once(\"aborted\",()=>{e.destroy(),e.emit(\"aborted\")}),r.once(\"close\",()=>{r.complete&&e.readable?e.once(\"end\",()=>{e.emit(\"close\")}):e.emit(\"close\")}),e}});var f5=w((wnt,g5)=>{\"use strict\";var{Transform:ePe,PassThrough:tPe}=J(\"stream\"),Ok=J(\"zlib\"),rPe=u5();g5.exports=r=>{let e=(r.headers[\"content-encoding\"]||\"\").toLowerCase();if(![\"gzip\",\"deflate\",\"br\"].includes(e))return r;let t=e===\"br\";if(t&&typeof Ok.createBrotliDecompress!=\"function\")return r.destroy(new Error(\"Brotli is not supported on Node.js < 12\")),r;let i=!0,n=new ePe({transform(a,l,c){i=!1,c(null,a)},flush(a){a()}}),s=new tPe({autoDestroy:!1,destroy(a,l){r.destroy(),l(a)}}),o=t?Ok.createBrotliDecompress():Ok.createUnzip();return o.once(\"error\",a=>{if(i&&!r.readable){s.end();return}s.destroy(a)}),rPe(r,s),r.pipe(n).pipe(o).pipe(s),s}});var Kk=w((Bnt,h5)=>{\"use strict\";var Mk=class{constructor(e={}){if(!(e.maxSize&&e.maxSize>0))throw new TypeError(\"`maxSize` must be a number greater than 0\");this.maxSize=e.maxSize,this.onEviction=e.onEviction,this.cache=new Map,this.oldCache=new Map,this._size=0}_set(e,t){if(this.cache.set(e,t),this._size++,this._size>=this.maxSize){if(this._size=0,typeof this.onEviction==\"function\")for(let[i,n]of this.oldCache.entries())this.onEviction(i,n);this.oldCache=this.cache,this.cache=new Map}}get(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.has(e)){let t=this.oldCache.get(e);return this.oldCache.delete(e),this._set(e,t),t}}set(e,t){return this.cache.has(e)?this.cache.set(e,t):this._set(e,t),this}has(e){return this.cache.has(e)||this.oldCache.has(e)}peek(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.has(e))return this.oldCache.get(e)}delete(e){let t=this.cache.delete(e);return t&&this._size--,this.oldCache.delete(e)||t}clear(){this.cache.clear(),this.oldCache.clear(),this._size=0}*keys(){for(let[e]of this)yield e}*values(){for(let[,e]of this)yield e}*[Symbol.iterator](){for(let e of this.cache)yield e;for(let e of this.oldCache){let[t]=e;this.cache.has(t)||(yield e)}}get size(){let e=0;for(let t of this.oldCache.keys())this.cache.has(t)||e++;return Math.min(this._size+e,this.maxSize)}};h5.exports=Mk});var Hk=w((Qnt,m5)=>{\"use strict\";var iPe=J(\"events\"),nPe=J(\"tls\"),sPe=J(\"http2\"),oPe=Kk(),on=Symbol(\"currentStreamsCount\"),p5=Symbol(\"request\"),Bs=Symbol(\"cachedOriginSet\"),Uf=Symbol(\"gracefullyClosing\"),aPe=[\"maxDeflateDynamicTableSize\",\"maxSessionMemory\",\"maxHeaderListPairs\",\"maxOutstandingPings\",\"maxReservedRemoteStreams\",\"maxSendHeaderBlockLength\",\"paddingStrategy\",\"localAddress\",\"path\",\"rejectUnauthorized\",\"minDHSize\",\"ca\",\"cert\",\"clientCertEngine\",\"ciphers\",\"key\",\"pfx\",\"servername\",\"minVersion\",\"maxVersion\",\"secureProtocol\",\"crl\",\"honorCipherOrder\",\"ecdhCurve\",\"dhparam\",\"secureOptions\",\"sessionIdContext\"],APe=(r,e,t)=>{let i=0,n=r.length;for(;i<n;){let s=i+n>>>1;t(r[s],e)?i=s+1:n=s}return i},lPe=(r,e)=>r.remoteSettings.maxConcurrentStreams>e.remoteSettings.maxConcurrentStreams,Uk=(r,e)=>{for(let t of r)t[Bs].length<e[Bs].length&&t[Bs].every(i=>e[Bs].includes(i))&&t[on]+e[on]<=e.remoteSettings.maxConcurrentStreams&&C5(t)},cPe=(r,e)=>{for(let t of r)e[Bs].length<t[Bs].length&&e[Bs].every(i=>t[Bs].includes(i))&&e[on]+t[on]<=t.remoteSettings.maxConcurrentStreams&&C5(e)},d5=({agent:r,isFree:e})=>{let t={};for(let i in r.sessions){let s=r.sessions[i].filter(o=>{let a=o[zo.kCurrentStreamsCount]<o.remoteSettings.maxConcurrentStreams;return e?a:!a});s.length!==0&&(t[i]=s)}return t},C5=r=>{r[Uf]=!0,r[on]===0&&r.close()},zo=class extends iPe{constructor({timeout:e=6e4,maxSessions:t=1/0,maxFreeSessions:i=10,maxCachedTlsSessions:n=100}={}){super(),this.sessions={},this.queue={},this.timeout=e,this.maxSessions=t,this.maxFreeSessions=i,this._freeSessionsCount=0,this._sessionsCount=0,this.settings={enablePush:!1},this.tlsSessionCache=new oPe({maxSize:n})}static normalizeOrigin(e,t){return typeof e==\"string\"&&(e=new URL(e)),t&&e.hostname!==t&&(e.hostname=t),e.origin}normalizeOptions(e){let t=\"\";if(e)for(let i of aPe)e[i]&&(t+=`:${e[i]}`);return t}_tryToCreateNewSession(e,t){if(!(e in this.queue)||!(t in this.queue[e]))return;let i=this.queue[e][t];this._sessionsCount<this.maxSessions&&!i.completed&&(i.completed=!0,i())}getSession(e,t,i){return new Promise((n,s)=>{Array.isArray(i)?(i=[...i],n()):i=[{resolve:n,reject:s}];let o=this.normalizeOptions(t),a=zo.normalizeOrigin(e,t&&t.servername);if(a===void 0){for(let{reject:u}of i)u(new TypeError(\"The `origin` argument needs to be a string or an URL object\"));return}if(o in this.sessions){let u=this.sessions[o],g=-1,f=-1,h;for(let p of u){let C=p.remoteSettings.maxConcurrentStreams;if(C<g)break;if(p[Bs].includes(a)){let y=p[on];if(y>=C||p[Uf]||p.destroyed)continue;h||(g=C),y>f&&(h=p,f=y)}}if(h){if(i.length!==1){for(let{reject:p}of i){let C=new Error(`Expected the length of listeners to be 1, got ${i.length}.\nPlease report this to https://github.com/szmarczak/http2-wrapper/`);p(C)}return}i[0].resolve(h);return}}if(o in this.queue){if(a in this.queue[o]){this.queue[o][a].listeners.push(...i),this._tryToCreateNewSession(o,a);return}}else this.queue[o]={};let l=()=>{o in this.queue&&this.queue[o][a]===c&&(delete this.queue[o][a],Object.keys(this.queue[o]).length===0&&delete this.queue[o])},c=()=>{let u=`${a}:${o}`,g=!1;try{let f=sPe.connect(e,{createConnection:this.createConnection,settings:this.settings,session:this.tlsSessionCache.get(u),...t});f[on]=0,f[Uf]=!1;let h=()=>f[on]<f.remoteSettings.maxConcurrentStreams,p=!0;f.socket.once(\"session\",y=>{this.tlsSessionCache.set(u,y)}),f.once(\"error\",y=>{for(let{reject:B}of i)B(y);this.tlsSessionCache.delete(u)}),f.setTimeout(this.timeout,()=>{f.destroy()}),f.once(\"close\",()=>{if(g){p&&this._freeSessionsCount--,this._sessionsCount--;let y=this.sessions[o];y.splice(y.indexOf(f),1),y.length===0&&delete this.sessions[o]}else{let y=new Error(\"Session closed without receiving a SETTINGS frame\");y.code=\"HTTP2WRAPPER_NOSETTINGS\";for(let{reject:B}of i)B(y);l()}this._tryToCreateNewSession(o,a)});let C=()=>{if(!(!(o in this.queue)||!h())){for(let y of f[Bs])if(y in this.queue[o]){let{listeners:B}=this.queue[o][y];for(;B.length!==0&&h();)B.shift().resolve(f);let v=this.queue[o];if(v[y].listeners.length===0&&(delete v[y],Object.keys(v).length===0)){delete this.queue[o];break}if(!h())break}}};f.on(\"origin\",()=>{f[Bs]=f.originSet,h()&&(C(),Uk(this.sessions[o],f))}),f.once(\"remoteSettings\",()=>{if(f.ref(),f.unref(),this._sessionsCount++,c.destroyed){let y=new Error(\"Agent has been destroyed\");for(let B of i)B.reject(y);f.destroy();return}f[Bs]=f.originSet;{let y=this.sessions;if(o in y){let B=y[o];B.splice(APe(B,f,lPe),0,f)}else y[o]=[f]}this._freeSessionsCount+=1,g=!0,this.emit(\"session\",f),C(),l(),f[on]===0&&this._freeSessionsCount>this.maxFreeSessions&&f.close(),i.length!==0&&(this.getSession(a,t,i),i.length=0),f.on(\"remoteSettings\",()=>{C(),Uk(this.sessions[o],f)})}),f[p5]=f.request,f.request=(y,B)=>{if(f[Uf])throw new Error(\"The session is gracefully closing. No new streams are allowed.\");let v=f[p5](y,B);return f.ref(),++f[on],f[on]===f.remoteSettings.maxConcurrentStreams&&this._freeSessionsCount--,v.once(\"close\",()=>{if(p=h(),--f[on],!f.destroyed&&!f.closed&&(cPe(this.sessions[o],f),h()&&!f.closed)){p||(this._freeSessionsCount++,p=!0);let D=f[on]===0;D&&f.unref(),D&&(this._freeSessionsCount>this.maxFreeSessions||f[Uf])?f.close():(Uk(this.sessions[o],f),C())}}),v}}catch(f){for(let h of i)h.reject(f);l()}};c.listeners=i,c.completed=!1,c.destroyed=!1,this.queue[o][a]=c,this._tryToCreateNewSession(o,a)})}request(e,t,i,n){return new Promise((s,o)=>{this.getSession(e,t,[{reject:o,resolve:a=>{try{s(a.request(i,n))}catch(l){o(l)}}}])})}createConnection(e,t){return zo.connect(e,t)}static connect(e,t){t.ALPNProtocols=[\"h2\"];let i=e.port||443,n=e.hostname||e.host;return typeof t.servername>\"u\"&&(t.servername=n),nPe.connect(i,n,t)}closeFreeSessions(){for(let e of Object.values(this.sessions))for(let t of e)t[on]===0&&t.close()}destroy(e){for(let t of Object.values(this.sessions))for(let i of t)i.destroy(e);for(let t of Object.values(this.queue))for(let i of Object.values(t))i.destroyed=!0;this.queue={}}get freeSessions(){return d5({agent:this,isFree:!0})}get busySessions(){return d5({agent:this,isFree:!1})}};zo.kCurrentStreamsCount=on;zo.kGracefullyClosing=Uf;m5.exports={Agent:zo,globalAgent:new zo}});var Yk=w((bnt,E5)=>{\"use strict\";var{Readable:uPe}=J(\"stream\"),Gk=class extends uPe{constructor(e,t){super({highWaterMark:t,autoDestroy:!1}),this.statusCode=null,this.statusMessage=\"\",this.httpVersion=\"2.0\",this.httpVersionMajor=2,this.httpVersionMinor=0,this.headers={},this.trailers={},this.req=null,this.aborted=!1,this.complete=!1,this.upgrade=null,this.rawHeaders=[],this.rawTrailers=[],this.socket=e,this.connection=e,this._dumped=!1}_destroy(e){this.req._request.destroy(e)}setTimeout(e,t){return this.req.setTimeout(e,t),this}_dump(){this._dumped||(this._dumped=!0,this.removeAllListeners(\"data\"),this.resume())}_read(){this.req&&this.req._request.resume()}};E5.exports=Gk});var jk=w((Snt,I5)=>{\"use strict\";I5.exports=r=>{let e={protocol:r.protocol,hostname:typeof r.hostname==\"string\"&&r.hostname.startsWith(\"[\")?r.hostname.slice(1,-1):r.hostname,host:r.host,hash:r.hash,search:r.search,pathname:r.pathname,href:r.href,path:`${r.pathname||\"\"}${r.search||\"\"}`};return typeof r.port==\"string\"&&r.port.length!==0&&(e.port=Number(r.port)),(r.username||r.password)&&(e.auth=`${r.username||\"\"}:${r.password||\"\"}`),e}});var w5=w((vnt,y5)=>{\"use strict\";y5.exports=(r,e,t)=>{for(let i of t)r.on(i,(...n)=>e.emit(i,...n))}});var Q5=w((xnt,B5)=>{\"use strict\";B5.exports=r=>{switch(r){case\":method\":case\":scheme\":case\":authority\":case\":path\":return!0;default:return!1}}});var S5=w((Dnt,b5)=>{\"use strict\";var Hf=(r,e,t)=>{b5.exports[e]=class extends r{constructor(...n){super(typeof t==\"string\"?t:t(n)),this.name=`${super.name} [${e}]`,this.code=e}}};Hf(TypeError,\"ERR_INVALID_ARG_TYPE\",r=>{let e=r[0].includes(\".\")?\"property\":\"argument\",t=r[1],i=Array.isArray(t);return i&&(t=`${t.slice(0,-1).join(\", \")} or ${t.slice(-1)}`),`The \"${r[0]}\" ${e} must be ${i?\"one of\":\"of\"} type ${t}. Received ${typeof r[2]}`});Hf(TypeError,\"ERR_INVALID_PROTOCOL\",r=>`Protocol \"${r[0]}\" not supported. Expected \"${r[1]}\"`);Hf(Error,\"ERR_HTTP_HEADERS_SENT\",r=>`Cannot ${r[0]} headers after they are sent to the client`);Hf(TypeError,\"ERR_INVALID_HTTP_TOKEN\",r=>`${r[0]} must be a valid HTTP token [${r[1]}]`);Hf(TypeError,\"ERR_HTTP_INVALID_HEADER_VALUE\",r=>`Invalid value \"${r[0]} for header \"${r[1]}\"`);Hf(TypeError,\"ERR_INVALID_CHAR\",r=>`Invalid character in ${r[0]} [${r[1]}]`)});var Vk=w((knt,F5)=>{\"use strict\";var gPe=J(\"http2\"),{Writable:fPe}=J(\"stream\"),{Agent:v5,globalAgent:hPe}=Hk(),pPe=Yk(),dPe=jk(),CPe=w5(),mPe=Q5(),{ERR_INVALID_ARG_TYPE:qk,ERR_INVALID_PROTOCOL:EPe,ERR_HTTP_HEADERS_SENT:x5,ERR_INVALID_HTTP_TOKEN:IPe,ERR_HTTP_INVALID_HEADER_VALUE:yPe,ERR_INVALID_CHAR:wPe}=S5(),{HTTP2_HEADER_STATUS:P5,HTTP2_HEADER_METHOD:D5,HTTP2_HEADER_PATH:k5,HTTP2_METHOD_CONNECT:BPe}=gPe.constants,Ui=Symbol(\"headers\"),Jk=Symbol(\"origin\"),Wk=Symbol(\"session\"),R5=Symbol(\"options\"),$w=Symbol(\"flushedHeaders\"),EC=Symbol(\"jobs\"),QPe=/^[\\^`\\-\\w!#$%&*+.|~]+$/,bPe=/[^\\t\\u0020-\\u007E\\u0080-\\u00FF]/,zk=class extends fPe{constructor(e,t,i){super({autoDestroy:!1});let n=typeof e==\"string\"||e instanceof URL;if(n&&(e=dPe(e instanceof URL?e:new URL(e))),typeof t==\"function\"||t===void 0?(i=t,t=n?e:{...e}):t={...e,...t},t.h2session)this[Wk]=t.h2session;else if(t.agent===!1)this.agent=new v5({maxFreeSessions:0});else if(typeof t.agent>\"u\"||t.agent===null)typeof t.createConnection==\"function\"?(this.agent=new v5({maxFreeSessions:0}),this.agent.createConnection=t.createConnection):this.agent=hPe;else if(typeof t.agent.request==\"function\")this.agent=t.agent;else throw new qk(\"options.agent\",[\"Agent-like Object\",\"undefined\",\"false\"],t.agent);if(t.protocol&&t.protocol!==\"https:\")throw new EPe(t.protocol,\"https:\");let s=t.port||t.defaultPort||this.agent&&this.agent.defaultPort||443,o=t.hostname||t.host||\"localhost\";delete t.hostname,delete t.host,delete t.port;let{timeout:a}=t;if(t.timeout=void 0,this[Ui]=Object.create(null),this[EC]=[],this.socket=null,this.connection=null,this.method=t.method||\"GET\",this.path=t.path,this.res=null,this.aborted=!1,this.reusedSocket=!1,t.headers)for(let[l,c]of Object.entries(t.headers))this.setHeader(l,c);t.auth&&!(\"authorization\"in this[Ui])&&(this[Ui].authorization=\"Basic \"+Buffer.from(t.auth).toString(\"base64\")),t.session=t.tlsSession,t.path=t.socketPath,this[R5]=t,s===443?(this[Jk]=`https://${o}`,\":authority\"in this[Ui]||(this[Ui][\":authority\"]=o)):(this[Jk]=`https://${o}:${s}`,\":authority\"in this[Ui]||(this[Ui][\":authority\"]=`${o}:${s}`)),a&&this.setTimeout(a),i&&this.once(\"response\",i),this[$w]=!1}get method(){return this[Ui][D5]}set method(e){e&&(this[Ui][D5]=e.toUpperCase())}get path(){return this[Ui][k5]}set path(e){e&&(this[Ui][k5]=e)}get _mustNotHaveABody(){return this.method===\"GET\"||this.method===\"HEAD\"||this.method===\"DELETE\"}_write(e,t,i){if(this._mustNotHaveABody){i(new Error(\"The GET, HEAD and DELETE methods must NOT have a body\"));return}this.flushHeaders();let n=()=>this._request.write(e,t,i);this._request?n():this[EC].push(n)}_final(e){if(this.destroyed)return;this.flushHeaders();let t=()=>{if(this._mustNotHaveABody){e();return}this._request.end(e)};this._request?t():this[EC].push(t)}abort(){this.res&&this.res.complete||(this.aborted||process.nextTick(()=>this.emit(\"abort\")),this.aborted=!0,this.destroy())}_destroy(e,t){this.res&&this.res._dump(),this._request&&this._request.destroy(),t(e)}async flushHeaders(){if(this[$w]||this.destroyed)return;this[$w]=!0;let e=this.method===BPe,t=i=>{if(this._request=i,this.destroyed){i.destroy();return}e||CPe(i,this,[\"timeout\",\"continue\",\"close\",\"error\"]);let n=o=>(...a)=>{!this.writable&&!this.destroyed?o(...a):this.once(\"finish\",()=>{o(...a)})};i.once(\"response\",n((o,a,l)=>{let c=new pPe(this.socket,i.readableHighWaterMark);this.res=c,c.req=this,c.statusCode=o[P5],c.headers=o,c.rawHeaders=l,c.once(\"end\",()=>{this.aborted?(c.aborted=!0,c.emit(\"aborted\")):(c.complete=!0,c.socket=null,c.connection=null)}),e?(c.upgrade=!0,this.emit(\"connect\",c,i,Buffer.alloc(0))?this.emit(\"close\"):i.destroy()):(i.on(\"data\",u=>{!c._dumped&&!c.push(u)&&i.pause()}),i.once(\"end\",()=>{c.push(null)}),this.emit(\"response\",c)||c._dump())})),i.once(\"headers\",n(o=>this.emit(\"information\",{statusCode:o[P5]}))),i.once(\"trailers\",n((o,a,l)=>{let{res:c}=this;c.trailers=o,c.rawTrailers=l}));let{socket:s}=i.session;this.socket=s,this.connection=s;for(let o of this[EC])o();this.emit(\"socket\",this.socket)};if(this[Wk])try{t(this[Wk].request(this[Ui]))}catch(i){this.emit(\"error\",i)}else{this.reusedSocket=!0;try{t(await this.agent.request(this[Jk],this[R5],this[Ui]))}catch(i){this.emit(\"error\",i)}}}getHeader(e){if(typeof e!=\"string\")throw new qk(\"name\",\"string\",e);return this[Ui][e.toLowerCase()]}get headersSent(){return this[$w]}removeHeader(e){if(typeof e!=\"string\")throw new qk(\"name\",\"string\",e);if(this.headersSent)throw new x5(\"remove\");delete this[Ui][e.toLowerCase()]}setHeader(e,t){if(this.headersSent)throw new x5(\"set\");if(typeof e!=\"string\"||!QPe.test(e)&&!mPe(e))throw new IPe(\"Header name\",e);if(typeof t>\"u\")throw new yPe(t,e);if(bPe.test(t))throw new wPe(\"header content\",e);this[Ui][e.toLowerCase()]=t}setNoDelay(){}setSocketKeepAlive(){}setTimeout(e,t){let i=()=>this._request.setTimeout(e,t);return this._request?i():this[EC].push(i),this}get maxHeadersCount(){if(!this.destroyed&&this._request)return this._request.session.localSettings.maxHeaderListSize}set maxHeadersCount(e){}};F5.exports=zk});var T5=w((Rnt,N5)=>{\"use strict\";var SPe=J(\"tls\");N5.exports=(r={})=>new Promise((e,t)=>{let i=SPe.connect(r,()=>{r.resolveSocket?(i.off(\"error\",t),e({alpnProtocol:i.alpnProtocol,socket:i})):(i.destroy(),e({alpnProtocol:i.alpnProtocol}))});i.on(\"error\",t)})});var O5=w((Fnt,L5)=>{\"use strict\";var vPe=J(\"net\");L5.exports=r=>{let e=r.host,t=r.headers&&r.headers.host;return t&&(t.startsWith(\"[\")?t.indexOf(\"]\")===-1?e=t:e=t.slice(1,-1):e=t.split(\":\",1)[0]),vPe.isIP(e)?\"\":e}});var U5=w((Nnt,Zk)=>{\"use strict\";var M5=J(\"http\"),Xk=J(\"https\"),xPe=T5(),PPe=Kk(),DPe=Vk(),kPe=O5(),RPe=jk(),eB=new PPe({maxSize:100}),IC=new Map,K5=(r,e,t)=>{e._httpMessage={shouldKeepAlive:!0};let i=()=>{r.emit(\"free\",e,t)};e.on(\"free\",i);let n=()=>{r.removeSocket(e,t)};e.on(\"close\",n);let s=()=>{r.removeSocket(e,t),e.off(\"close\",n),e.off(\"free\",i),e.off(\"agentRemove\",s)};e.on(\"agentRemove\",s),r.emit(\"free\",e,t)},FPe=async r=>{let e=`${r.host}:${r.port}:${r.ALPNProtocols.sort()}`;if(!eB.has(e)){if(IC.has(e))return(await IC.get(e)).alpnProtocol;let{path:t,agent:i}=r;r.path=r.socketPath;let n=xPe(r);IC.set(e,n);try{let{socket:s,alpnProtocol:o}=await n;if(eB.set(e,o),r.path=t,o===\"h2\")s.destroy();else{let{globalAgent:a}=Xk,l=Xk.Agent.prototype.createConnection;i?i.createConnection===l?K5(i,s,r):s.destroy():a.createConnection===l?K5(a,s,r):s.destroy()}return IC.delete(e),o}catch(s){throw IC.delete(e),s}}return eB.get(e)};Zk.exports=async(r,e,t)=>{if((typeof r==\"string\"||r instanceof URL)&&(r=RPe(new URL(r))),typeof e==\"function\"&&(t=e,e=void 0),e={ALPNProtocols:[\"h2\",\"http/1.1\"],...r,...e,resolveSocket:!0},!Array.isArray(e.ALPNProtocols)||e.ALPNProtocols.length===0)throw new Error(\"The `ALPNProtocols` option must be an Array with at least one entry\");e.protocol=e.protocol||\"https:\";let i=e.protocol===\"https:\";e.host=e.hostname||e.host||\"localhost\",e.session=e.tlsSession,e.servername=e.servername||kPe(e),e.port=e.port||(i?443:80),e._defaultAgent=i?Xk.globalAgent:M5.globalAgent;let n=e.agent;if(n){if(n.addRequest)throw new Error(\"The `options.agent` object can contain only `http`, `https` or `http2` properties\");e.agent=n[i?\"https\":\"http\"]}return i&&await FPe(e)===\"h2\"?(n&&(e.agent=n.http2),new DPe(e,t)):M5.request(e,t)};Zk.exports.protocolCache=eB});var G5=w((Tnt,H5)=>{\"use strict\";var NPe=J(\"http2\"),TPe=Hk(),_k=Vk(),LPe=Yk(),OPe=U5(),MPe=(r,e,t)=>new _k(r,e,t),KPe=(r,e,t)=>{let i=new _k(r,e,t);return i.end(),i};H5.exports={...NPe,ClientRequest:_k,IncomingMessage:LPe,...TPe,request:MPe,get:KPe,auto:OPe}});var eR=w($k=>{\"use strict\";Object.defineProperty($k,\"__esModule\",{value:!0});var Y5=Ya();$k.default=r=>Y5.default.nodeStream(r)&&Y5.default.function_(r.getBoundary)});var W5=w(tR=>{\"use strict\";Object.defineProperty(tR,\"__esModule\",{value:!0});var q5=J(\"fs\"),J5=J(\"util\"),j5=Ya(),UPe=eR(),HPe=J5.promisify(q5.stat);tR.default=async(r,e)=>{if(e&&\"content-length\"in e)return Number(e[\"content-length\"]);if(!r)return 0;if(j5.default.string(r))return Buffer.byteLength(r);if(j5.default.buffer(r))return r.length;if(UPe.default(r))return J5.promisify(r.getLength.bind(r))();if(r instanceof q5.ReadStream){let{size:t}=await HPe(r.path);return t===0?void 0:t}}});var iR=w(rR=>{\"use strict\";Object.defineProperty(rR,\"__esModule\",{value:!0});function GPe(r,e,t){let i={};for(let n of t)i[n]=(...s)=>{e.emit(n,...s)},r.on(n,i[n]);return()=>{for(let n of t)r.off(n,i[n])}}rR.default=GPe});var z5=w(nR=>{\"use strict\";Object.defineProperty(nR,\"__esModule\",{value:!0});nR.default=()=>{let r=[];return{once(e,t,i){e.once(t,i),r.push({origin:e,event:t,fn:i})},unhandleAll(){for(let e of r){let{origin:t,event:i,fn:n}=e;t.removeListener(i,n)}r.length=0}}}});var X5=w(yC=>{\"use strict\";Object.defineProperty(yC,\"__esModule\",{value:!0});yC.TimeoutError=void 0;var YPe=J(\"net\"),jPe=z5(),V5=Symbol(\"reentry\"),qPe=()=>{},tB=class extends Error{constructor(e,t){super(`Timeout awaiting '${t}' for ${e}ms`),this.event=t,this.name=\"TimeoutError\",this.code=\"ETIMEDOUT\"}};yC.TimeoutError=tB;yC.default=(r,e,t)=>{if(V5 in r)return qPe;r[V5]=!0;let i=[],{once:n,unhandleAll:s}=jPe.default(),o=(g,f,h)=>{var p;let C=setTimeout(f,g,g,h);(p=C.unref)===null||p===void 0||p.call(C);let y=()=>{clearTimeout(C)};return i.push(y),y},{host:a,hostname:l}=t,c=(g,f)=>{r.destroy(new tB(g,f))},u=()=>{for(let g of i)g();s()};if(r.once(\"error\",g=>{if(u(),r.listenerCount(\"error\")===0)throw g}),r.once(\"close\",u),n(r,\"response\",g=>{n(g,\"end\",u)}),typeof e.request<\"u\"&&o(e.request,c,\"request\"),typeof e.socket<\"u\"){let g=()=>{c(e.socket,\"socket\")};r.setTimeout(e.socket,g),i.push(()=>{r.removeListener(\"timeout\",g)})}return n(r,\"socket\",g=>{var f;let{socketPath:h}=r;if(g.connecting){let p=Boolean(h!=null?h:YPe.isIP((f=l!=null?l:a)!==null&&f!==void 0?f:\"\")!==0);if(typeof e.lookup<\"u\"&&!p&&typeof g.address().address>\"u\"){let C=o(e.lookup,c,\"lookup\");n(g,\"lookup\",C)}if(typeof e.connect<\"u\"){let C=()=>o(e.connect,c,\"connect\");p?n(g,\"connect\",C()):n(g,\"lookup\",y=>{y===null&&n(g,\"connect\",C())})}typeof e.secureConnect<\"u\"&&t.protocol===\"https:\"&&n(g,\"connect\",()=>{let C=o(e.secureConnect,c,\"secureConnect\");n(g,\"secureConnect\",C)})}if(typeof e.send<\"u\"){let p=()=>o(e.send,c,\"send\");g.connecting?n(g,\"connect\",()=>{n(r,\"upload-complete\",p())}):n(r,\"upload-complete\",p())}}),typeof e.response<\"u\"&&n(r,\"upload-complete\",()=>{let g=o(e.response,c,\"response\");n(r,\"response\",g)}),u}});var _5=w(sR=>{\"use strict\";Object.defineProperty(sR,\"__esModule\",{value:!0});var Z5=Ya();sR.default=r=>{r=r;let e={protocol:r.protocol,hostname:Z5.default.string(r.hostname)&&r.hostname.startsWith(\"[\")?r.hostname.slice(1,-1):r.hostname,host:r.host,hash:r.hash,search:r.search,pathname:r.pathname,href:r.href,path:`${r.pathname||\"\"}${r.search||\"\"}`};return Z5.default.string(r.port)&&r.port.length>0&&(e.port=Number(r.port)),(r.username||r.password)&&(e.auth=`${r.username||\"\"}:${r.password||\"\"}`),e}});var $5=w(oR=>{\"use strict\";Object.defineProperty(oR,\"__esModule\",{value:!0});var JPe=J(\"url\"),WPe=[\"protocol\",\"host\",\"hostname\",\"port\",\"pathname\",\"search\"];oR.default=(r,e)=>{var t,i;if(e.path){if(e.pathname)throw new TypeError(\"Parameters `path` and `pathname` are mutually exclusive.\");if(e.search)throw new TypeError(\"Parameters `path` and `search` are mutually exclusive.\");if(e.searchParams)throw new TypeError(\"Parameters `path` and `searchParams` are mutually exclusive.\")}if(e.search&&e.searchParams)throw new TypeError(\"Parameters `search` and `searchParams` are mutually exclusive.\");if(!r){if(!e.protocol)throw new TypeError(\"No URL protocol specified\");r=`${e.protocol}//${(i=(t=e.hostname)!==null&&t!==void 0?t:e.host)!==null&&i!==void 0?i:\"\"}`}let n=new JPe.URL(r);if(e.path){let s=e.path.indexOf(\"?\");s===-1?e.pathname=e.path:(e.pathname=e.path.slice(0,s),e.search=e.path.slice(s+1)),delete e.path}for(let s of WPe)e[s]&&(n[s]=e[s].toString());return n}});var e6=w(AR=>{\"use strict\";Object.defineProperty(AR,\"__esModule\",{value:!0});var aR=class{constructor(){this.weakMap=new WeakMap,this.map=new Map}set(e,t){typeof e==\"object\"?this.weakMap.set(e,t):this.map.set(e,t)}get(e){return typeof e==\"object\"?this.weakMap.get(e):this.map.get(e)}has(e){return typeof e==\"object\"?this.weakMap.has(e):this.map.has(e)}};AR.default=aR});var cR=w(lR=>{\"use strict\";Object.defineProperty(lR,\"__esModule\",{value:!0});var zPe=async r=>{let e=[],t=0;for await(let i of r)e.push(i),t+=Buffer.byteLength(i);return Buffer.isBuffer(e[0])?Buffer.concat(e,t):Buffer.from(e.join(\"\"))};lR.default=zPe});var r6=w(Oc=>{\"use strict\";Object.defineProperty(Oc,\"__esModule\",{value:!0});Oc.dnsLookupIpVersionToFamily=Oc.isDnsLookupIpVersion=void 0;var t6={auto:0,ipv4:4,ipv6:6};Oc.isDnsLookupIpVersion=r=>r in t6;Oc.dnsLookupIpVersionToFamily=r=>{if(Oc.isDnsLookupIpVersion(r))return t6[r];throw new Error(\"Invalid DNS lookup IP version\")}});var uR=w(rB=>{\"use strict\";Object.defineProperty(rB,\"__esModule\",{value:!0});rB.isResponseOk=void 0;rB.isResponseOk=r=>{let{statusCode:e}=r,t=r.request.options.followRedirect?299:399;return e>=200&&e<=t||e===304}});var n6=w(gR=>{\"use strict\";Object.defineProperty(gR,\"__esModule\",{value:!0});var i6=new Set;gR.default=r=>{i6.has(r)||(i6.add(r),process.emitWarning(`Got: ${r}`,{type:\"DeprecationWarning\"}))}});var s6=w(fR=>{\"use strict\";Object.defineProperty(fR,\"__esModule\",{value:!0});var mr=Ya(),VPe=(r,e)=>{if(mr.default.null_(r.encoding))throw new TypeError(\"To get a Buffer, set `options.responseType` to `buffer` instead\");mr.assert.any([mr.default.string,mr.default.undefined],r.encoding),mr.assert.any([mr.default.boolean,mr.default.undefined],r.resolveBodyOnly),mr.assert.any([mr.default.boolean,mr.default.undefined],r.methodRewriting),mr.assert.any([mr.default.boolean,mr.default.undefined],r.isStream),mr.assert.any([mr.default.string,mr.default.undefined],r.responseType),r.responseType===void 0&&(r.responseType=\"text\");let{retry:t}=r;if(e?r.retry={...e.retry}:r.retry={calculateDelay:i=>i.computedValue,limit:0,methods:[],statusCodes:[],errorCodes:[],maxRetryAfter:void 0},mr.default.object(t)?(r.retry={...r.retry,...t},r.retry.methods=[...new Set(r.retry.methods.map(i=>i.toUpperCase()))],r.retry.statusCodes=[...new Set(r.retry.statusCodes)],r.retry.errorCodes=[...new Set(r.retry.errorCodes)]):mr.default.number(t)&&(r.retry.limit=t),mr.default.undefined(r.retry.maxRetryAfter)&&(r.retry.maxRetryAfter=Math.min(...[r.timeout.request,r.timeout.connect].filter(mr.default.number))),mr.default.object(r.pagination)){e&&(r.pagination={...e.pagination,...r.pagination});let{pagination:i}=r;if(!mr.default.function_(i.transform))throw new Error(\"`options.pagination.transform` must be implemented\");if(!mr.default.function_(i.shouldContinue))throw new Error(\"`options.pagination.shouldContinue` must be implemented\");if(!mr.default.function_(i.filter))throw new TypeError(\"`options.pagination.filter` must be implemented\");if(!mr.default.function_(i.paginate))throw new Error(\"`options.pagination.paginate` must be implemented\")}return r.responseType===\"json\"&&r.headers.accept===void 0&&(r.headers.accept=\"application/json\"),r};fR.default=VPe});var o6=w(wC=>{\"use strict\";Object.defineProperty(wC,\"__esModule\",{value:!0});wC.retryAfterStatusCodes=void 0;wC.retryAfterStatusCodes=new Set([413,429,503]);var XPe=({attemptCount:r,retryOptions:e,error:t,retryAfter:i})=>{if(r>e.limit)return 0;let n=e.methods.includes(t.options.method),s=e.errorCodes.includes(t.code),o=t.response&&e.statusCodes.includes(t.response.statusCode);if(!n||!s&&!o)return 0;if(t.response){if(i)return e.maxRetryAfter===void 0||i>e.maxRetryAfter?0:i;if(t.response.statusCode===413)return 0}let a=Math.random()*100;return 2**(r-1)*1e3+a};wC.default=XPe});var bC=w(Yt=>{\"use strict\";Object.defineProperty(Yt,\"__esModule\",{value:!0});Yt.UnsupportedProtocolError=Yt.ReadError=Yt.TimeoutError=Yt.UploadError=Yt.CacheError=Yt.HTTPError=Yt.MaxRedirectsError=Yt.RequestError=Yt.setNonEnumerableProperties=Yt.knownHookEvents=Yt.withoutBody=Yt.kIsNormalizedAlready=void 0;var a6=J(\"util\"),A6=J(\"stream\"),ZPe=J(\"fs\"),XA=J(\"url\"),l6=J(\"http\"),hR=J(\"http\"),_Pe=J(\"https\"),$Pe=Qz(),eDe=kz(),c6=l5(),tDe=f5(),rDe=G5(),iDe=Zw(),Ee=Ya(),nDe=W5(),u6=eR(),sDe=iR(),g6=X5(),oDe=_5(),f6=$5(),aDe=e6(),ADe=cR(),h6=r6(),lDe=uR(),ZA=n6(),cDe=s6(),uDe=o6(),pR,Pi=Symbol(\"request\"),sB=Symbol(\"response\"),Gf=Symbol(\"responseSize\"),Yf=Symbol(\"downloadedSize\"),jf=Symbol(\"bodySize\"),qf=Symbol(\"uploadedSize\"),iB=Symbol(\"serverResponsesPiped\"),p6=Symbol(\"unproxyEvents\"),d6=Symbol(\"isFromCache\"),dR=Symbol(\"cancelTimeouts\"),C6=Symbol(\"startedReading\"),Jf=Symbol(\"stopReading\"),nB=Symbol(\"triggerRead\"),_A=Symbol(\"body\"),BC=Symbol(\"jobs\"),m6=Symbol(\"originalResponse\"),E6=Symbol(\"retryTimeout\");Yt.kIsNormalizedAlready=Symbol(\"isNormalizedAlready\");var gDe=Ee.default.string(process.versions.brotli);Yt.withoutBody=new Set([\"GET\",\"HEAD\"]);Yt.knownHookEvents=[\"init\",\"beforeRequest\",\"beforeRedirect\",\"beforeError\",\"beforeRetry\",\"afterResponse\"];function fDe(r){for(let e in r){let t=r[e];if(!Ee.default.string(t)&&!Ee.default.number(t)&&!Ee.default.boolean(t)&&!Ee.default.null_(t)&&!Ee.default.undefined(t))throw new TypeError(`The \\`searchParams\\` value '${String(t)}' must be a string, number, boolean or null`)}}function hDe(r){return Ee.default.object(r)&&!(\"statusCode\"in r)}var CR=new aDe.default,pDe=async r=>new Promise((e,t)=>{let i=n=>{t(n)};r.pending||e(),r.once(\"error\",i),r.once(\"ready\",()=>{r.off(\"error\",i),e()})}),dDe=new Set([300,301,302,303,304,307,308]),CDe=[\"context\",\"body\",\"json\",\"form\"];Yt.setNonEnumerableProperties=(r,e)=>{let t={};for(let i of r)if(!!i)for(let n of CDe)n in i&&(t[n]={writable:!0,configurable:!0,enumerable:!1,value:i[n]});Object.defineProperties(e,t)};var ei=class extends Error{constructor(e,t,i){var n;if(super(e),Error.captureStackTrace(this,this.constructor),this.name=\"RequestError\",this.code=t.code,i instanceof gB?(Object.defineProperty(this,\"request\",{enumerable:!1,value:i}),Object.defineProperty(this,\"response\",{enumerable:!1,value:i[sB]}),Object.defineProperty(this,\"options\",{enumerable:!1,value:i.options})):Object.defineProperty(this,\"options\",{enumerable:!1,value:i}),this.timings=(n=this.request)===null||n===void 0?void 0:n.timings,Ee.default.string(t.stack)&&Ee.default.string(this.stack)){let s=this.stack.indexOf(this.message)+this.message.length,o=this.stack.slice(s).split(`\n`).reverse(),a=t.stack.slice(t.stack.indexOf(t.message)+t.message.length).split(`\n`).reverse();for(;a.length!==0&&a[0]===o[0];)o.shift();this.stack=`${this.stack.slice(0,s)}${o.reverse().join(`\n`)}${a.reverse().join(`\n`)}`}}};Yt.RequestError=ei;var oB=class extends ei{constructor(e){super(`Redirected ${e.options.maxRedirects} times. Aborting.`,{},e),this.name=\"MaxRedirectsError\"}};Yt.MaxRedirectsError=oB;var aB=class extends ei{constructor(e){super(`Response code ${e.statusCode} (${e.statusMessage})`,{},e.request),this.name=\"HTTPError\"}};Yt.HTTPError=aB;var AB=class extends ei{constructor(e,t){super(e.message,e,t),this.name=\"CacheError\"}};Yt.CacheError=AB;var lB=class extends ei{constructor(e,t){super(e.message,e,t),this.name=\"UploadError\"}};Yt.UploadError=lB;var cB=class extends ei{constructor(e,t,i){super(e.message,e,i),this.name=\"TimeoutError\",this.event=e.event,this.timings=t}};Yt.TimeoutError=cB;var QC=class extends ei{constructor(e,t){super(e.message,e,t),this.name=\"ReadError\"}};Yt.ReadError=QC;var uB=class extends ei{constructor(e){super(`Unsupported protocol \"${e.url.protocol}\"`,{},e),this.name=\"UnsupportedProtocolError\"}};Yt.UnsupportedProtocolError=uB;var mDe=[\"socket\",\"connect\",\"continue\",\"information\",\"upgrade\",\"timeout\"],gB=class extends A6.Duplex{constructor(e,t={},i){super({autoDestroy:!1,highWaterMark:0}),this[Yf]=0,this[qf]=0,this.requestInitialized=!1,this[iB]=new Set,this.redirects=[],this[Jf]=!1,this[nB]=!1,this[BC]=[],this.retryCount=0,this._progressCallbacks=[];let n=()=>this._unlockWrite(),s=()=>this._lockWrite();this.on(\"pipe\",c=>{c.prependListener(\"data\",n),c.on(\"data\",s),c.prependListener(\"end\",n),c.on(\"end\",s)}),this.on(\"unpipe\",c=>{c.off(\"data\",n),c.off(\"data\",s),c.off(\"end\",n),c.off(\"end\",s)}),this.on(\"pipe\",c=>{c instanceof hR.IncomingMessage&&(this.options.headers={...c.headers,...this.options.headers})});let{json:o,body:a,form:l}=t;if((o||a||l)&&this._lockWrite(),Yt.kIsNormalizedAlready in t)this.options=t;else try{this.options=this.constructor.normalizeArguments(e,t,i)}catch(c){Ee.default.nodeStream(t.body)&&t.body.destroy(),this.destroy(c);return}(async()=>{var c;try{this.options.body instanceof ZPe.ReadStream&&await pDe(this.options.body);let{url:u}=this.options;if(!u)throw new TypeError(\"Missing `url` property\");if(this.requestUrl=u.toString(),decodeURI(this.requestUrl),await this._finalizeBody(),await this._makeRequest(),this.destroyed){(c=this[Pi])===null||c===void 0||c.destroy();return}for(let g of this[BC])g();this[BC].length=0,this.requestInitialized=!0}catch(u){if(u instanceof ei){this._beforeError(u);return}this.destroyed||this.destroy(u)}})()}static normalizeArguments(e,t,i){var n,s,o,a,l;let c=t;if(Ee.default.object(e)&&!Ee.default.urlInstance(e))t={...i,...e,...t};else{if(e&&t&&t.url!==void 0)throw new TypeError(\"The `url` option is mutually exclusive with the `input` argument\");t={...i,...t},e!==void 0&&(t.url=e),Ee.default.urlInstance(t.url)&&(t.url=new XA.URL(t.url.toString()))}if(t.cache===!1&&(t.cache=void 0),t.dnsCache===!1&&(t.dnsCache=void 0),Ee.assert.any([Ee.default.string,Ee.default.undefined],t.method),Ee.assert.any([Ee.default.object,Ee.default.undefined],t.headers),Ee.assert.any([Ee.default.string,Ee.default.urlInstance,Ee.default.undefined],t.prefixUrl),Ee.assert.any([Ee.default.object,Ee.default.undefined],t.cookieJar),Ee.assert.any([Ee.default.object,Ee.default.string,Ee.default.undefined],t.searchParams),Ee.assert.any([Ee.default.object,Ee.default.string,Ee.default.undefined],t.cache),Ee.assert.any([Ee.default.object,Ee.default.number,Ee.default.undefined],t.timeout),Ee.assert.any([Ee.default.object,Ee.default.undefined],t.context),Ee.assert.any([Ee.default.object,Ee.default.undefined],t.hooks),Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.decompress),Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.ignoreInvalidCookies),Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.followRedirect),Ee.assert.any([Ee.default.number,Ee.default.undefined],t.maxRedirects),Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.throwHttpErrors),Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.http2),Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.allowGetBody),Ee.assert.any([Ee.default.string,Ee.default.undefined],t.localAddress),Ee.assert.any([h6.isDnsLookupIpVersion,Ee.default.undefined],t.dnsLookupIpVersion),Ee.assert.any([Ee.default.object,Ee.default.undefined],t.https),Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.rejectUnauthorized),t.https&&(Ee.assert.any([Ee.default.boolean,Ee.default.undefined],t.https.rejectUnauthorized),Ee.assert.any([Ee.default.function_,Ee.default.undefined],t.https.checkServerIdentity),Ee.assert.any([Ee.default.string,Ee.default.object,Ee.default.array,Ee.default.undefined],t.https.certificateAuthority),Ee.assert.any([Ee.default.string,Ee.default.object,Ee.default.array,Ee.default.undefined],t.https.key),Ee.assert.any([Ee.default.string,Ee.default.object,Ee.default.array,Ee.default.undefined],t.https.certificate),Ee.assert.any([Ee.default.string,Ee.default.undefined],t.https.passphrase),Ee.assert.any([Ee.default.string,Ee.default.buffer,Ee.default.array,Ee.default.undefined],t.https.pfx)),Ee.assert.any([Ee.default.object,Ee.default.undefined],t.cacheOptions),Ee.default.string(t.method)?t.method=t.method.toUpperCase():t.method=\"GET\",t.headers===(i==null?void 0:i.headers)?t.headers={...t.headers}:t.headers=iDe({...i==null?void 0:i.headers,...t.headers}),\"slashes\"in t)throw new TypeError(\"The legacy `url.Url` has been deprecated. Use `URL` instead.\");if(\"auth\"in t)throw new TypeError(\"Parameter `auth` is deprecated. Use `username` / `password` instead.\");if(\"searchParams\"in t&&t.searchParams&&t.searchParams!==(i==null?void 0:i.searchParams)){let h;if(Ee.default.string(t.searchParams)||t.searchParams instanceof XA.URLSearchParams)h=new XA.URLSearchParams(t.searchParams);else{fDe(t.searchParams),h=new XA.URLSearchParams;for(let p in t.searchParams){let C=t.searchParams[p];C===null?h.append(p,\"\"):C!==void 0&&h.append(p,C)}}(n=i==null?void 0:i.searchParams)===null||n===void 0||n.forEach((p,C)=>{h.has(C)||h.append(C,p)}),t.searchParams=h}if(t.username=(s=t.username)!==null&&s!==void 0?s:\"\",t.password=(o=t.password)!==null&&o!==void 0?o:\"\",Ee.default.undefined(t.prefixUrl)?t.prefixUrl=(a=i==null?void 0:i.prefixUrl)!==null&&a!==void 0?a:\"\":(t.prefixUrl=t.prefixUrl.toString(),t.prefixUrl!==\"\"&&!t.prefixUrl.endsWith(\"/\")&&(t.prefixUrl+=\"/\")),Ee.default.string(t.url)){if(t.url.startsWith(\"/\"))throw new Error(\"`input` must not start with a slash when using `prefixUrl`\");t.url=f6.default(t.prefixUrl+t.url,t)}else(Ee.default.undefined(t.url)&&t.prefixUrl!==\"\"||t.protocol)&&(t.url=f6.default(t.prefixUrl,t));if(t.url){\"port\"in t&&delete t.port;let{prefixUrl:h}=t;Object.defineProperty(t,\"prefixUrl\",{set:C=>{let y=t.url;if(!y.href.startsWith(C))throw new Error(`Cannot change \\`prefixUrl\\` from ${h} to ${C}: ${y.href}`);t.url=new XA.URL(C+y.href.slice(h.length)),h=C},get:()=>h});let{protocol:p}=t.url;if(p===\"unix:\"&&(p=\"http:\",t.url=new XA.URL(`http://unix${t.url.pathname}${t.url.search}`)),t.searchParams&&(t.url.search=t.searchParams.toString()),p!==\"http:\"&&p!==\"https:\")throw new uB(t);t.username===\"\"?t.username=t.url.username:t.url.username=t.username,t.password===\"\"?t.password=t.url.password:t.url.password=t.password}let{cookieJar:u}=t;if(u){let{setCookie:h,getCookieString:p}=u;Ee.assert.function_(h),Ee.assert.function_(p),h.length===4&&p.length===0&&(h=a6.promisify(h.bind(t.cookieJar)),p=a6.promisify(p.bind(t.cookieJar)),t.cookieJar={setCookie:h,getCookieString:p})}let{cache:g}=t;if(g&&(CR.has(g)||CR.set(g,new c6((h,p)=>{let C=h[Pi](h,p);return Ee.default.promise(C)&&(C.once=(y,B)=>{if(y===\"error\")C.catch(B);else if(y===\"abort\")(async()=>{try{(await C).once(\"abort\",B)}catch{}})();else throw new Error(`Unknown HTTP2 promise event: ${y}`);return C}),C},g))),t.cacheOptions={...t.cacheOptions},t.dnsCache===!0)pR||(pR=new eDe.default),t.dnsCache=pR;else if(!Ee.default.undefined(t.dnsCache)&&!t.dnsCache.lookup)throw new TypeError(`Parameter \\`dnsCache\\` must be a CacheableLookup instance or a boolean, got ${Ee.default(t.dnsCache)}`);Ee.default.number(t.timeout)?t.timeout={request:t.timeout}:i&&t.timeout!==i.timeout?t.timeout={...i.timeout,...t.timeout}:t.timeout={...t.timeout},t.context||(t.context={});let f=t.hooks===(i==null?void 0:i.hooks);t.hooks={...t.hooks};for(let h of Yt.knownHookEvents)if(h in t.hooks)if(Ee.default.array(t.hooks[h]))t.hooks[h]=[...t.hooks[h]];else throw new TypeError(`Parameter \\`${h}\\` must be an Array, got ${Ee.default(t.hooks[h])}`);else t.hooks[h]=[];if(i&&!f)for(let h of Yt.knownHookEvents)i.hooks[h].length>0&&(t.hooks[h]=[...i.hooks[h],...t.hooks[h]]);if(\"family\"in t&&ZA.default('\"options.family\" was never documented, please use \"options.dnsLookupIpVersion\"'),i!=null&&i.https&&(t.https={...i.https,...t.https}),\"rejectUnauthorized\"in t&&ZA.default('\"options.rejectUnauthorized\" is now deprecated, please use \"options.https.rejectUnauthorized\"'),\"checkServerIdentity\"in t&&ZA.default('\"options.checkServerIdentity\" was never documented, please use \"options.https.checkServerIdentity\"'),\"ca\"in t&&ZA.default('\"options.ca\" was never documented, please use \"options.https.certificateAuthority\"'),\"key\"in t&&ZA.default('\"options.key\" was never documented, please use \"options.https.key\"'),\"cert\"in t&&ZA.default('\"options.cert\" was never documented, please use \"options.https.certificate\"'),\"passphrase\"in t&&ZA.default('\"options.passphrase\" was never documented, please use \"options.https.passphrase\"'),\"pfx\"in t&&ZA.default('\"options.pfx\" was never documented, please use \"options.https.pfx\"'),\"followRedirects\"in t)throw new TypeError(\"The `followRedirects` option does not exist. Use `followRedirect` instead.\");if(t.agent){for(let h in t.agent)if(h!==\"http\"&&h!==\"https\"&&h!==\"http2\")throw new TypeError(`Expected the \\`options.agent\\` properties to be \\`http\\`, \\`https\\` or \\`http2\\`, got \\`${h}\\``)}return t.maxRedirects=(l=t.maxRedirects)!==null&&l!==void 0?l:0,Yt.setNonEnumerableProperties([i,c],t),cDe.default(t,i)}_lockWrite(){let e=()=>{throw new TypeError(\"The payload has been already provided\")};this.write=e,this.end=e}_unlockWrite(){this.write=super.write,this.end=super.end}async _finalizeBody(){let{options:e}=this,{headers:t}=e,i=!Ee.default.undefined(e.form),n=!Ee.default.undefined(e.json),s=!Ee.default.undefined(e.body),o=i||n||s,a=Yt.withoutBody.has(e.method)&&!(e.method===\"GET\"&&e.allowGetBody);if(this._cannotHaveBody=a,o){if(a)throw new TypeError(`The \\`${e.method}\\` method cannot be used with a body`);if([s,i,n].filter(l=>l).length>1)throw new TypeError(\"The `body`, `json` and `form` options are mutually exclusive\");if(s&&!(e.body instanceof A6.Readable)&&!Ee.default.string(e.body)&&!Ee.default.buffer(e.body)&&!u6.default(e.body))throw new TypeError(\"The `body` option must be a stream.Readable, string or Buffer\");if(i&&!Ee.default.object(e.form))throw new TypeError(\"The `form` option must be an Object\");{let l=!Ee.default.string(t[\"content-type\"]);s?(u6.default(e.body)&&l&&(t[\"content-type\"]=`multipart/form-data; boundary=${e.body.getBoundary()}`),this[_A]=e.body):i?(l&&(t[\"content-type\"]=\"application/x-www-form-urlencoded\"),this[_A]=new XA.URLSearchParams(e.form).toString()):(l&&(t[\"content-type\"]=\"application/json\"),this[_A]=e.stringifyJson(e.json));let c=await nDe.default(this[_A],e.headers);Ee.default.undefined(t[\"content-length\"])&&Ee.default.undefined(t[\"transfer-encoding\"])&&!a&&!Ee.default.undefined(c)&&(t[\"content-length\"]=String(c))}}else a?this._lockWrite():this._unlockWrite();this[jf]=Number(t[\"content-length\"])||void 0}async _onResponseBase(e){let{options:t}=this,{url:i}=t;this[m6]=e,t.decompress&&(e=tDe(e));let n=e.statusCode,s=e;s.statusMessage=s.statusMessage?s.statusMessage:l6.STATUS_CODES[n],s.url=t.url.toString(),s.requestUrl=this.requestUrl,s.redirectUrls=this.redirects,s.request=this,s.isFromCache=e.fromCache||!1,s.ip=this.ip,s.retryCount=this.retryCount,this[d6]=s.isFromCache,this[Gf]=Number(e.headers[\"content-length\"])||void 0,this[sB]=e,e.once(\"end\",()=>{this[Gf]=this[Yf],this.emit(\"downloadProgress\",this.downloadProgress)}),e.once(\"error\",a=>{e.destroy(),this._beforeError(new QC(a,this))}),e.once(\"aborted\",()=>{this._beforeError(new QC({name:\"Error\",message:\"The server aborted pending request\",code:\"ECONNRESET\"},this))}),this.emit(\"downloadProgress\",this.downloadProgress);let o=e.headers[\"set-cookie\"];if(Ee.default.object(t.cookieJar)&&o){let a=o.map(async l=>t.cookieJar.setCookie(l,i.toString()));t.ignoreInvalidCookies&&(a=a.map(async l=>l.catch(()=>{})));try{await Promise.all(a)}catch(l){this._beforeError(l);return}}if(t.followRedirect&&e.headers.location&&dDe.has(n)){if(e.resume(),this[Pi]&&(this[dR](),delete this[Pi],this[p6]()),(n===303&&t.method!==\"GET\"&&t.method!==\"HEAD\"||!t.methodRewriting)&&(t.method=\"GET\",\"body\"in t&&delete t.body,\"json\"in t&&delete t.json,\"form\"in t&&delete t.form,this[_A]=void 0,delete t.headers[\"content-length\"]),this.redirects.length>=t.maxRedirects){this._beforeError(new oB(this));return}try{let l=Buffer.from(e.headers.location,\"binary\").toString(),c=new XA.URL(l,i),u=c.toString();decodeURI(u),c.hostname!==i.hostname||c.port!==i.port?(\"host\"in t.headers&&delete t.headers.host,\"cookie\"in t.headers&&delete t.headers.cookie,\"authorization\"in t.headers&&delete t.headers.authorization,(t.username||t.password)&&(t.username=\"\",t.password=\"\")):(c.username=t.username,c.password=t.password),this.redirects.push(u),t.url=c;for(let g of t.hooks.beforeRedirect)await g(t,s);this.emit(\"redirect\",s,t),await this._makeRequest()}catch(l){this._beforeError(l);return}return}if(t.isStream&&t.throwHttpErrors&&!lDe.isResponseOk(s)){this._beforeError(new aB(s));return}e.on(\"readable\",()=>{this[nB]&&this._read()}),this.on(\"resume\",()=>{e.resume()}),this.on(\"pause\",()=>{e.pause()}),e.once(\"end\",()=>{this.push(null)}),this.emit(\"response\",e);for(let a of this[iB])if(!a.headersSent){for(let l in e.headers){let c=t.decompress?l!==\"content-encoding\":!0,u=e.headers[l];c&&a.setHeader(l,u)}a.statusCode=n}}async _onResponse(e){try{await this._onResponseBase(e)}catch(t){this._beforeError(t)}}_onRequest(e){let{options:t}=this,{timeout:i,url:n}=t;$Pe.default(e),this[dR]=g6.default(e,i,n);let s=t.cache?\"cacheableResponse\":\"response\";e.once(s,l=>{this._onResponse(l)}),e.once(\"error\",l=>{var c;e.destroy(),(c=e.res)===null||c===void 0||c.removeAllListeners(\"end\"),l=l instanceof g6.TimeoutError?new cB(l,this.timings,this):new ei(l.message,l,this),this._beforeError(l)}),this[p6]=sDe.default(e,this,mDe),this[Pi]=e,this.emit(\"uploadProgress\",this.uploadProgress);let o=this[_A],a=this.redirects.length===0?this:e;Ee.default.nodeStream(o)?(o.pipe(a),o.once(\"error\",l=>{this._beforeError(new lB(l,this))})):(this._unlockWrite(),Ee.default.undefined(o)?(this._cannotHaveBody||this._noPipe)&&(a.end(),this._lockWrite()):(this._writeRequest(o,void 0,()=>{}),a.end(),this._lockWrite())),this.emit(\"request\",e)}async _createCacheableRequest(e,t){return new Promise((i,n)=>{Object.assign(t,oDe.default(e)),delete t.url;let s,o=CR.get(t.cache)(t,async a=>{a._readableState.autoDestroy=!1,s&&(await s).emit(\"cacheableResponse\",a),i(a)});t.url=e,o.once(\"error\",n),o.once(\"request\",async a=>{s=a,i(s)})})}async _makeRequest(){var e,t,i,n,s;let{options:o}=this,{headers:a}=o;for(let B in a)if(Ee.default.undefined(a[B]))delete a[B];else if(Ee.default.null_(a[B]))throw new TypeError(`Use \\`undefined\\` instead of \\`null\\` to delete the \\`${B}\\` header`);if(o.decompress&&Ee.default.undefined(a[\"accept-encoding\"])&&(a[\"accept-encoding\"]=gDe?\"gzip, deflate, br\":\"gzip, deflate\"),o.cookieJar){let B=await o.cookieJar.getCookieString(o.url.toString());Ee.default.nonEmptyString(B)&&(o.headers.cookie=B)}for(let B of o.hooks.beforeRequest){let v=await B(o);if(!Ee.default.undefined(v)){o.request=()=>v;break}}o.body&&this[_A]!==o.body&&(this[_A]=o.body);let{agent:l,request:c,timeout:u,url:g}=o;if(o.dnsCache&&!(\"lookup\"in o)&&(o.lookup=o.dnsCache.lookup),g.hostname===\"unix\"){let B=/(?<socketPath>.+?):(?<path>.+)/.exec(`${g.pathname}${g.search}`);if(B!=null&&B.groups){let{socketPath:v,path:D}=B.groups;Object.assign(o,{socketPath:v,path:D,host:\"\"})}}let f=g.protocol===\"https:\",h;o.http2?h=rDe.auto:h=f?_Pe.request:l6.request;let p=(e=o.request)!==null&&e!==void 0?e:h,C=o.cache?this._createCacheableRequest:p;l&&!o.http2&&(o.agent=l[f?\"https\":\"http\"]),o[Pi]=p,delete o.request,delete o.timeout;let y=o;if(y.shared=(t=o.cacheOptions)===null||t===void 0?void 0:t.shared,y.cacheHeuristic=(i=o.cacheOptions)===null||i===void 0?void 0:i.cacheHeuristic,y.immutableMinTimeToLive=(n=o.cacheOptions)===null||n===void 0?void 0:n.immutableMinTimeToLive,y.ignoreCargoCult=(s=o.cacheOptions)===null||s===void 0?void 0:s.ignoreCargoCult,o.dnsLookupIpVersion!==void 0)try{y.family=h6.dnsLookupIpVersionToFamily(o.dnsLookupIpVersion)}catch{throw new Error(\"Invalid `dnsLookupIpVersion` option value\")}o.https&&(\"rejectUnauthorized\"in o.https&&(y.rejectUnauthorized=o.https.rejectUnauthorized),o.https.checkServerIdentity&&(y.checkServerIdentity=o.https.checkServerIdentity),o.https.certificateAuthority&&(y.ca=o.https.certificateAuthority),o.https.certificate&&(y.cert=o.https.certificate),o.https.key&&(y.key=o.https.key),o.https.passphrase&&(y.passphrase=o.https.passphrase),o.https.pfx&&(y.pfx=o.https.pfx));try{let B=await C(g,y);Ee.default.undefined(B)&&(B=h(g,y)),o.request=c,o.timeout=u,o.agent=l,o.https&&(\"rejectUnauthorized\"in o.https&&delete y.rejectUnauthorized,o.https.checkServerIdentity&&delete y.checkServerIdentity,o.https.certificateAuthority&&delete y.ca,o.https.certificate&&delete y.cert,o.https.key&&delete y.key,o.https.passphrase&&delete y.passphrase,o.https.pfx&&delete y.pfx),hDe(B)?this._onRequest(B):this.writable?(this.once(\"finish\",()=>{this._onResponse(B)}),this._unlockWrite(),this.end(),this._lockWrite()):this._onResponse(B)}catch(B){throw B instanceof c6.CacheError?new AB(B,this):new ei(B.message,B,this)}}async _error(e){try{for(let t of this.options.hooks.beforeError)e=await t(e)}catch(t){e=new ei(t.message,t,this)}this.destroy(e)}_beforeError(e){if(this[Jf])return;let{options:t}=this,i=this.retryCount+1;this[Jf]=!0,e instanceof ei||(e=new ei(e.message,e,this));let n=e,{response:s}=n;(async()=>{if(s&&!s.body){s.setEncoding(this._readableState.encoding);try{s.rawBody=await ADe.default(s),s.body=s.rawBody.toString()}catch{}}if(this.listenerCount(\"retry\")!==0){let o;try{let a;s&&\"retry-after\"in s.headers&&(a=Number(s.headers[\"retry-after\"]),Number.isNaN(a)?(a=Date.parse(s.headers[\"retry-after\"])-Date.now(),a<=0&&(a=1)):a*=1e3),o=await t.retry.calculateDelay({attemptCount:i,retryOptions:t.retry,error:n,retryAfter:a,computedValue:uDe.default({attemptCount:i,retryOptions:t.retry,error:n,retryAfter:a,computedValue:0})})}catch(a){this._error(new ei(a.message,a,this));return}if(o){let a=async()=>{try{for(let l of this.options.hooks.beforeRetry)await l(this.options,n,i)}catch(l){this._error(new ei(l.message,e,this));return}this.destroyed||(this.destroy(),this.emit(\"retry\",i,e))};this[E6]=setTimeout(a,o);return}}this._error(n)})()}_read(){this[nB]=!0;let e=this[sB];if(e&&!this[Jf]){e.readableLength&&(this[nB]=!1);let t;for(;(t=e.read())!==null;){this[Yf]+=t.length,this[C6]=!0;let i=this.downloadProgress;i.percent<1&&this.emit(\"downloadProgress\",i),this.push(t)}}}_write(e,t,i){let n=()=>{this._writeRequest(e,t,i)};this.requestInitialized?n():this[BC].push(n)}_writeRequest(e,t,i){this[Pi].destroyed||(this._progressCallbacks.push(()=>{this[qf]+=Buffer.byteLength(e,t);let n=this.uploadProgress;n.percent<1&&this.emit(\"uploadProgress\",n)}),this[Pi].write(e,t,n=>{!n&&this._progressCallbacks.length>0&&this._progressCallbacks.shift()(),i(n)}))}_final(e){let t=()=>{for(;this._progressCallbacks.length!==0;)this._progressCallbacks.shift()();if(!(Pi in this)){e();return}if(this[Pi].destroyed){e();return}this[Pi].end(i=>{i||(this[jf]=this[qf],this.emit(\"uploadProgress\",this.uploadProgress),this[Pi].emit(\"upload-complete\")),e(i)})};this.requestInitialized?t():this[BC].push(t)}_destroy(e,t){var i;this[Jf]=!0,clearTimeout(this[E6]),Pi in this&&(this[dR](),!((i=this[sB])===null||i===void 0)&&i.complete||this[Pi].destroy()),e!==null&&!Ee.default.undefined(e)&&!(e instanceof ei)&&(e=new ei(e.message,e,this)),t(e)}get _isAboutToError(){return this[Jf]}get ip(){var e;return(e=this.socket)===null||e===void 0?void 0:e.remoteAddress}get aborted(){var e,t,i;return((t=(e=this[Pi])===null||e===void 0?void 0:e.destroyed)!==null&&t!==void 0?t:this.destroyed)&&!(!((i=this[m6])===null||i===void 0)&&i.complete)}get socket(){var e,t;return(t=(e=this[Pi])===null||e===void 0?void 0:e.socket)!==null&&t!==void 0?t:void 0}get downloadProgress(){let e;return this[Gf]?e=this[Yf]/this[Gf]:this[Gf]===this[Yf]?e=1:e=0,{percent:e,transferred:this[Yf],total:this[Gf]}}get uploadProgress(){let e;return this[jf]?e=this[qf]/this[jf]:this[jf]===this[qf]?e=1:e=0,{percent:e,transferred:this[qf],total:this[jf]}}get timings(){var e;return(e=this[Pi])===null||e===void 0?void 0:e.timings}get isFromCache(){return this[d6]}pipe(e,t){if(this[C6])throw new Error(\"Failed to pipe. The response has been emitted already.\");return e instanceof hR.ServerResponse&&this[iB].add(e),super.pipe(e,t)}unpipe(e){return e instanceof hR.ServerResponse&&this[iB].delete(e),super.unpipe(e),this}};Yt.default=gB});var SC=w(ao=>{\"use strict\";var EDe=ao&&ao.__createBinding||(Object.create?function(r,e,t,i){i===void 0&&(i=t),Object.defineProperty(r,i,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,i){i===void 0&&(i=t),r[i]=e[t]}),IDe=ao&&ao.__exportStar||function(r,e){for(var t in r)t!==\"default\"&&!Object.prototype.hasOwnProperty.call(e,t)&&EDe(e,r,t)};Object.defineProperty(ao,\"__esModule\",{value:!0});ao.CancelError=ao.ParseError=void 0;var I6=bC(),mR=class extends I6.RequestError{constructor(e,t){let{options:i}=t.request;super(`${e.message} in \"${i.url.toString()}\"`,e,t.request),this.name=\"ParseError\"}};ao.ParseError=mR;var ER=class extends I6.RequestError{constructor(e){super(\"Promise was canceled\",{},e),this.name=\"CancelError\"}get isCanceled(){return!0}};ao.CancelError=ER;IDe(bC(),ao)});var w6=w(IR=>{\"use strict\";Object.defineProperty(IR,\"__esModule\",{value:!0});var y6=SC(),yDe=(r,e,t,i)=>{let{rawBody:n}=r;try{if(e===\"text\")return n.toString(i);if(e===\"json\")return n.length===0?\"\":t(n.toString());if(e===\"buffer\")return n;throw new y6.ParseError({message:`Unknown body type '${e}'`,name:\"Error\"},r)}catch(s){throw new y6.ParseError(s,r)}};IR.default=yDe});var yR=w($A=>{\"use strict\";var wDe=$A&&$A.__createBinding||(Object.create?function(r,e,t,i){i===void 0&&(i=t),Object.defineProperty(r,i,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,i){i===void 0&&(i=t),r[i]=e[t]}),BDe=$A&&$A.__exportStar||function(r,e){for(var t in r)t!==\"default\"&&!Object.prototype.hasOwnProperty.call(e,t)&&wDe(e,r,t)};Object.defineProperty($A,\"__esModule\",{value:!0});var QDe=J(\"events\"),bDe=Ya(),SDe=wz(),fB=SC(),B6=w6(),Q6=bC(),vDe=iR(),xDe=cR(),b6=uR(),PDe=[\"request\",\"response\",\"redirect\",\"uploadProgress\",\"downloadProgress\"];function S6(r){let e,t,i=new QDe.EventEmitter,n=new SDe((o,a,l)=>{let c=u=>{let g=new Q6.default(void 0,r);g.retryCount=u,g._noPipe=!0,l(()=>g.destroy()),l.shouldReject=!1,l(()=>a(new fB.CancelError(g))),e=g,g.once(\"response\",async p=>{var C;if(p.retryCount=u,p.request.aborted)return;let y;try{y=await xDe.default(g),p.rawBody=y}catch{return}if(g._isAboutToError)return;let B=((C=p.headers[\"content-encoding\"])!==null&&C!==void 0?C:\"\").toLowerCase(),v=[\"gzip\",\"deflate\",\"br\"].includes(B),{options:D}=g;if(v&&!D.decompress)p.body=y;else try{p.body=B6.default(p,D.responseType,D.parseJson,D.encoding)}catch(T){if(p.body=y.toString(),b6.isResponseOk(p)){g._beforeError(T);return}}try{for(let[T,H]of D.hooks.afterResponse.entries())p=await H(p,async j=>{let $=Q6.default.normalizeArguments(void 0,{...j,retry:{calculateDelay:()=>0},throwHttpErrors:!1,resolveBodyOnly:!1},D);$.hooks.afterResponse=$.hooks.afterResponse.slice(0,T);for(let W of $.hooks.beforeRetry)await W($);let V=S6($);return l(()=>{V.catch(()=>{}),V.cancel()}),V})}catch(T){g._beforeError(new fB.RequestError(T.message,T,g));return}if(!b6.isResponseOk(p)){g._beforeError(new fB.HTTPError(p));return}t=p,o(g.options.resolveBodyOnly?p.body:p)});let f=p=>{if(n.isCanceled)return;let{options:C}=g;if(p instanceof fB.HTTPError&&!C.throwHttpErrors){let{response:y}=p;o(g.options.resolveBodyOnly?y.body:y);return}a(p)};g.once(\"error\",f);let h=g.options.body;g.once(\"retry\",(p,C)=>{var y,B;if(h===((y=C.request)===null||y===void 0?void 0:y.options.body)&&bDe.default.nodeStream((B=C.request)===null||B===void 0?void 0:B.options.body)){f(C);return}c(p)}),vDe.default(g,i,PDe)};c(0)});n.on=(o,a)=>(i.on(o,a),n);let s=o=>{let a=(async()=>{await n;let{options:l}=t.request;return B6.default(t,o,l.parseJson,l.encoding)})();return Object.defineProperties(a,Object.getOwnPropertyDescriptors(n)),a};return n.json=()=>{let{headers:o}=e.options;return!e.writableFinished&&o.accept===void 0&&(o.accept=\"application/json\"),s(\"json\")},n.buffer=()=>s(\"buffer\"),n.text=()=>s(\"text\"),n}$A.default=S6;BDe(SC(),$A)});var v6=w(wR=>{\"use strict\";Object.defineProperty(wR,\"__esModule\",{value:!0});var DDe=SC();function kDe(r,...e){let t=(async()=>{if(r instanceof DDe.RequestError)try{for(let n of e)if(n)for(let s of n)r=await s(r)}catch(n){r=n}throw r})(),i=()=>t;return t.json=i,t.text=i,t.buffer=i,t.on=i,t}wR.default=kDe});var D6=w(BR=>{\"use strict\";Object.defineProperty(BR,\"__esModule\",{value:!0});var x6=Ya();function P6(r){for(let e of Object.values(r))(x6.default.plainObject(e)||x6.default.array(e))&&P6(e);return Object.freeze(r)}BR.default=P6});var R6=w(k6=>{\"use strict\";Object.defineProperty(k6,\"__esModule\",{value:!0})});var QR=w(bs=>{\"use strict\";var RDe=bs&&bs.__createBinding||(Object.create?function(r,e,t,i){i===void 0&&(i=t),Object.defineProperty(r,i,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,i){i===void 0&&(i=t),r[i]=e[t]}),FDe=bs&&bs.__exportStar||function(r,e){for(var t in r)t!==\"default\"&&!Object.prototype.hasOwnProperty.call(e,t)&&RDe(e,r,t)};Object.defineProperty(bs,\"__esModule\",{value:!0});bs.defaultHandler=void 0;var F6=Ya(),Qs=yR(),NDe=v6(),pB=bC(),TDe=D6(),LDe={RequestError:Qs.RequestError,CacheError:Qs.CacheError,ReadError:Qs.ReadError,HTTPError:Qs.HTTPError,MaxRedirectsError:Qs.MaxRedirectsError,TimeoutError:Qs.TimeoutError,ParseError:Qs.ParseError,CancelError:Qs.CancelError,UnsupportedProtocolError:Qs.UnsupportedProtocolError,UploadError:Qs.UploadError},ODe=async r=>new Promise(e=>{setTimeout(e,r)}),{normalizeArguments:hB}=pB.default,N6=(...r)=>{let e;for(let t of r)e=hB(void 0,t,e);return e},MDe=r=>r.isStream?new pB.default(void 0,r):Qs.default(r),KDe=r=>\"defaults\"in r&&\"options\"in r.defaults,UDe=[\"get\",\"post\",\"put\",\"patch\",\"head\",\"delete\"];bs.defaultHandler=(r,e)=>e(r);var T6=(r,e)=>{if(r)for(let t of r)t(e)},L6=r=>{r._rawHandlers=r.handlers,r.handlers=r.handlers.map(i=>(n,s)=>{let o,a=i(n,l=>(o=s(l),o));if(a!==o&&!n.isStream&&o){let l=a,{then:c,catch:u,finally:g}=l;Object.setPrototypeOf(l,Object.getPrototypeOf(o)),Object.defineProperties(l,Object.getOwnPropertyDescriptors(o)),l.then=c,l.catch=u,l.finally=g}return a});let e=(i,n={},s)=>{var o,a;let l=0,c=u=>r.handlers[l++](u,l===r.handlers.length?MDe:c);if(F6.default.plainObject(i)){let u={...i,...n};pB.setNonEnumerableProperties([i,n],u),n=u,i=void 0}try{let u;try{T6(r.options.hooks.init,n),T6((o=n.hooks)===null||o===void 0?void 0:o.init,n)}catch(f){u=f}let g=hB(i,n,s!=null?s:r.options);if(g[pB.kIsNormalizedAlready]=!0,u)throw new Qs.RequestError(u.message,u,g);return c(g)}catch(u){if(n.isStream)throw u;return NDe.default(u,r.options.hooks.beforeError,(a=n.hooks)===null||a===void 0?void 0:a.beforeError)}};e.extend=(...i)=>{let n=[r.options],s=[...r._rawHandlers],o;for(let a of i)KDe(a)?(n.push(a.defaults.options),s.push(...a.defaults._rawHandlers),o=a.defaults.mutableDefaults):(n.push(a),\"handlers\"in a&&s.push(...a.handlers),o=a.mutableDefaults);return s=s.filter(a=>a!==bs.defaultHandler),s.length===0&&s.push(bs.defaultHandler),L6({options:N6(...n),handlers:s,mutableDefaults:Boolean(o)})};let t=async function*(i,n){let s=hB(i,n,r.options);s.resolveBodyOnly=!1;let o=s.pagination;if(!F6.default.object(o))throw new TypeError(\"`options.pagination` must be implemented\");let a=[],{countLimit:l}=o,c=0;for(;c<o.requestLimit;){c!==0&&await ODe(o.backoff);let u=await e(void 0,void 0,s),g=await o.transform(u),f=[];for(let p of g)if(o.filter(p,a,f)&&(!o.shouldContinue(p,a,f)||(yield p,o.stackAllItems&&a.push(p),f.push(p),--l<=0)))return;let h=o.paginate(u,a,f);if(h===!1)return;h===u.request.options?s=u.request.options:h!==void 0&&(s=hB(void 0,h,s)),c++}};e.paginate=t,e.paginate.all=async(i,n)=>{let s=[];for await(let o of t(i,n))s.push(o);return s},e.paginate.each=t,e.stream=(i,n)=>e(i,{...n,isStream:!0});for(let i of UDe)e[i]=(n,s)=>e(n,{...s,method:i}),e.stream[i]=(n,s)=>e(n,{...s,method:i,isStream:!0});return Object.assign(e,LDe),Object.defineProperty(e,\"defaults\",{value:r.mutableDefaults?r:TDe.default(r),writable:r.mutableDefaults,configurable:r.mutableDefaults,enumerable:!0}),e.mergeOptions=N6,e};bs.default=L6;FDe(R6(),bs)});var CB=w((ja,dB)=>{\"use strict\";var HDe=ja&&ja.__createBinding||(Object.create?function(r,e,t,i){i===void 0&&(i=t),Object.defineProperty(r,i,{enumerable:!0,get:function(){return e[t]}})}:function(r,e,t,i){i===void 0&&(i=t),r[i]=e[t]}),O6=ja&&ja.__exportStar||function(r,e){for(var t in r)t!==\"default\"&&!Object.prototype.hasOwnProperty.call(e,t)&&HDe(e,r,t)};Object.defineProperty(ja,\"__esModule\",{value:!0});var GDe=J(\"url\"),M6=QR(),YDe={options:{method:\"GET\",retry:{limit:2,methods:[\"GET\",\"PUT\",\"HEAD\",\"DELETE\",\"OPTIONS\",\"TRACE\"],statusCodes:[408,413,429,500,502,503,504,521,522,524],errorCodes:[\"ETIMEDOUT\",\"ECONNRESET\",\"EADDRINUSE\",\"ECONNREFUSED\",\"EPIPE\",\"ENOTFOUND\",\"ENETUNREACH\",\"EAI_AGAIN\"],maxRetryAfter:void 0,calculateDelay:({computedValue:r})=>r},timeout:{},headers:{\"user-agent\":\"got (https://github.com/sindresorhus/got)\"},hooks:{init:[],beforeRequest:[],beforeRedirect:[],beforeRetry:[],beforeError:[],afterResponse:[]},cache:void 0,dnsCache:void 0,decompress:!0,throwHttpErrors:!0,followRedirect:!0,isStream:!1,responseType:\"text\",resolveBodyOnly:!1,maxRedirects:10,prefixUrl:\"\",methodRewriting:!0,ignoreInvalidCookies:!1,context:{},http2:!1,allowGetBody:!1,https:void 0,pagination:{transform:r=>r.request.options.responseType===\"json\"?r.body:JSON.parse(r.body),paginate:r=>{if(!Reflect.has(r.headers,\"link\"))return!1;let e=r.headers.link.split(\",\"),t;for(let i of e){let n=i.split(\";\");if(n[1].includes(\"next\")){t=n[0].trimStart().trim(),t=t.slice(1,-1);break}}return t?{url:new GDe.URL(t)}:!1},filter:()=>!0,shouldContinue:()=>!0,countLimit:1/0,backoff:0,requestLimit:1e4,stackAllItems:!0},parseJson:r=>JSON.parse(r),stringifyJson:r=>JSON.stringify(r),cacheOptions:{}},handlers:[M6.defaultHandler],mutableDefaults:!1},bR=M6.default(YDe);ja.default=bR;dB.exports=bR;dB.exports.default=bR;dB.exports.__esModule=!0;O6(QR(),ja);O6(yR(),ja)});var G6=w(Wf=>{\"use strict\";var nst=J(\"net\"),jDe=J(\"tls\"),SR=J(\"http\"),K6=J(\"https\"),qDe=J(\"events\"),sst=J(\"assert\"),JDe=J(\"util\");Wf.httpOverHttp=WDe;Wf.httpsOverHttp=zDe;Wf.httpOverHttps=VDe;Wf.httpsOverHttps=XDe;function WDe(r){var e=new qa(r);return e.request=SR.request,e}function zDe(r){var e=new qa(r);return e.request=SR.request,e.createSocket=U6,e.defaultPort=443,e}function VDe(r){var e=new qa(r);return e.request=K6.request,e}function XDe(r){var e=new qa(r);return e.request=K6.request,e.createSocket=U6,e.defaultPort=443,e}function qa(r){var e=this;e.options=r||{},e.proxyOptions=e.options.proxy||{},e.maxSockets=e.options.maxSockets||SR.Agent.defaultMaxSockets,e.requests=[],e.sockets=[],e.on(\"free\",function(i,n,s,o){for(var a=H6(n,s,o),l=0,c=e.requests.length;l<c;++l){var u=e.requests[l];if(u.host===a.host&&u.port===a.port){e.requests.splice(l,1),u.request.onSocket(i);return}}i.destroy(),e.removeSocket(i)})}JDe.inherits(qa,qDe.EventEmitter);qa.prototype.addRequest=function(e,t,i,n){var s=this,o=vR({request:e},s.options,H6(t,i,n));if(s.sockets.length>=this.maxSockets){s.requests.push(o);return}s.createSocket(o,function(a){a.on(\"free\",l),a.on(\"close\",c),a.on(\"agentRemove\",c),e.onSocket(a);function l(){s.emit(\"free\",a,o)}function c(u){s.removeSocket(a),a.removeListener(\"free\",l),a.removeListener(\"close\",c),a.removeListener(\"agentRemove\",c)}})};qa.prototype.createSocket=function(e,t){var i=this,n={};i.sockets.push(n);var s=vR({},i.proxyOptions,{method:\"CONNECT\",path:e.host+\":\"+e.port,agent:!1,headers:{host:e.host+\":\"+e.port}});e.localAddress&&(s.localAddress=e.localAddress),s.proxyAuth&&(s.headers=s.headers||{},s.headers[\"Proxy-Authorization\"]=\"Basic \"+new Buffer(s.proxyAuth).toString(\"base64\")),el(\"making CONNECT request\");var o=i.request(s);o.useChunkedEncodingByDefault=!1,o.once(\"response\",a),o.once(\"upgrade\",l),o.once(\"connect\",c),o.once(\"error\",u),o.end();function a(g){g.upgrade=!0}function l(g,f,h){process.nextTick(function(){c(g,f,h)})}function c(g,f,h){if(o.removeAllListeners(),f.removeAllListeners(),g.statusCode!==200){el(\"tunneling socket could not be established, statusCode=%d\",g.statusCode),f.destroy();var p=new Error(\"tunneling socket could not be established, statusCode=\"+g.statusCode);p.code=\"ECONNRESET\",e.request.emit(\"error\",p),i.removeSocket(n);return}if(h.length>0){el(\"got illegal response body from proxy\"),f.destroy();var p=new Error(\"got illegal response body from proxy\");p.code=\"ECONNRESET\",e.request.emit(\"error\",p),i.removeSocket(n);return}return el(\"tunneling connection has established\"),i.sockets[i.sockets.indexOf(n)]=f,t(f)}function u(g){o.removeAllListeners(),el(`tunneling socket could not be established, cause=%s\n`,g.message,g.stack);var f=new Error(\"tunneling socket could not be established, cause=\"+g.message);f.code=\"ECONNRESET\",e.request.emit(\"error\",f),i.removeSocket(n)}};qa.prototype.removeSocket=function(e){var t=this.sockets.indexOf(e);if(t!==-1){this.sockets.splice(t,1);var i=this.requests.shift();i&&this.createSocket(i,function(n){i.request.onSocket(n)})}};function U6(r,e){var t=this;qa.prototype.createSocket.call(t,r,function(i){var n=r.request.getHeader(\"host\"),s=vR({},t.options,{socket:i,servername:n?n.replace(/:.*$/,\"\"):r.host}),o=jDe.connect(0,s);t.sockets[t.sockets.indexOf(i)]=o,e(o)})}function H6(r,e,t){return typeof r==\"string\"?{host:r,port:e,localAddress:t}:r}function vR(r){for(var e=1,t=arguments.length;e<t;++e){var i=arguments[e];if(typeof i==\"object\")for(var n=Object.keys(i),s=0,o=n.length;s<o;++s){var a=n[s];i[a]!==void 0&&(r[a]=i[a])}}return r}var el;process.env.NODE_DEBUG&&/\\btunnel\\b/.test(process.env.NODE_DEBUG)?el=function(){var r=Array.prototype.slice.call(arguments);typeof r[0]==\"string\"?r[0]=\"TUNNEL: \"+r[0]:r.unshift(\"TUNNEL:\"),console.error.apply(console,r)}:el=function(){};Wf.debug=el});var j6=w((ast,Y6)=>{Y6.exports=G6()});var tV=w((IB,FR)=>{var eV=Object.assign({},J(\"fs\")),RR=function(){var r=typeof document<\"u\"&&document.currentScript?document.currentScript.src:void 0;return typeof __filename<\"u\"&&(r=r||__filename),function(e){e=e||{};var t=typeof e<\"u\"?e:{},i,n;t.ready=new Promise(function(d,E){i=d,n=E});var s={},o;for(o in t)t.hasOwnProperty(o)&&(s[o]=t[o]);var a=[],l=\"./this.program\",c=function(d,E){throw E},u=!1,g=!0,f=\"\";function h(d){return t.locateFile?t.locateFile(d,f):f+d}var p,C,y,B;g&&(u?f=J(\"path\").dirname(f)+\"/\":f=__dirname+\"/\",p=function(E,I){var k=Ca(E);return k?I?k:k.toString():(y||(y=eV),B||(B=J(\"path\")),E=B.normalize(E),y.readFileSync(E,I?null:\"utf8\"))},C=function(E){var I=p(E,!0);return I.buffer||(I=new Uint8Array(I)),re(I.buffer),I},process.argv.length>1&&(l=process.argv[1].replace(/\\\\/g,\"/\")),a=process.argv.slice(2),c=function(d){process.exit(d)},t.inspect=function(){return\"[Emscripten Module object]\"});var v=t.print||console.log.bind(console),D=t.printErr||console.warn.bind(console);for(o in s)s.hasOwnProperty(o)&&(t[o]=s[o]);s=null,t.arguments&&(a=t.arguments),t.thisProgram&&(l=t.thisProgram),t.quit&&(c=t.quit);var T=16;function H(d,E){return E||(E=T),Math.ceil(d/E)*E}var j=0,$=function(d){j=d},V;t.wasmBinary&&(V=t.wasmBinary);var W=t.noExitRuntime||!0;typeof WebAssembly!=\"object\"&&wr(\"no native wasm support detected\");function _(d,E,I){switch(E=E||\"i8\",E.charAt(E.length-1)===\"*\"&&(E=\"i32\"),E){case\"i1\":return ne[d>>0];case\"i8\":return ne[d>>0];case\"i16\":return he[d>>1];case\"i32\":return de[d>>2];case\"i64\":return de[d>>2];case\"float\":return Pt[d>>2];case\"double\":return It[d>>3];default:wr(\"invalid type for getValue: \"+E)}return null}var A,Ae=!1,ge;function re(d,E){d||wr(\"Assertion failed: \"+E)}function O(d){var E=t[\"_\"+d];return re(E,\"Cannot call unknown function \"+d+\", make sure it is exported\"),E}function F(d,E,I,k,L){var Z={string:function(it){var Et=0;if(it!=null&&it!==0){var Qe=(it.length<<2)+1;Et=Q(Qe),oe(it,Et,Qe)}return Et},array:function(it){var Et=Q(it.length);return fe(it,Et),Et}};function te(it){return E===\"string\"?Fe(it):E===\"boolean\"?Boolean(it):it}var we=O(d),me=[],Je=0;if(k)for(var nt=0;nt<k.length;nt++){var wt=Z[I[nt]];wt?(Je===0&&(Je=YE()),me[nt]=wt(k[nt])):me[nt]=k[nt]}var lt=we.apply(null,me);return lt=te(lt),Je!==0&&jE(Je),lt}function ue(d,E,I,k){I=I||[];var L=I.every(function(te){return te===\"number\"}),Z=E!==\"string\";return Z&&L&&!k?O(d):function(){return F(d,E,I,arguments,k)}}var pe=typeof TextDecoder<\"u\"?new TextDecoder(\"utf8\"):void 0;function ke(d,E,I){for(var k=E+I,L=E;d[L]&&!(L>=k);)++L;if(L-E>16&&d.subarray&&pe)return pe.decode(d.subarray(E,L));for(var Z=\"\";E<L;){var te=d[E++];if(!(te&128)){Z+=String.fromCharCode(te);continue}var we=d[E++]&63;if((te&224)==192){Z+=String.fromCharCode((te&31)<<6|we);continue}var me=d[E++]&63;if((te&240)==224?te=(te&15)<<12|we<<6|me:te=(te&7)<<18|we<<12|me<<6|d[E++]&63,te<65536)Z+=String.fromCharCode(te);else{var Je=te-65536;Z+=String.fromCharCode(55296|Je>>10,56320|Je&1023)}}return Z}function Fe(d,E){return d?ke(Y,d,E):\"\"}function Ne(d,E,I,k){if(!(k>0))return 0;for(var L=I,Z=I+k-1,te=0;te<d.length;++te){var we=d.charCodeAt(te);if(we>=55296&&we<=57343){var me=d.charCodeAt(++te);we=65536+((we&1023)<<10)|me&1023}if(we<=127){if(I>=Z)break;E[I++]=we}else if(we<=2047){if(I+1>=Z)break;E[I++]=192|we>>6,E[I++]=128|we&63}else if(we<=65535){if(I+2>=Z)break;E[I++]=224|we>>12,E[I++]=128|we>>6&63,E[I++]=128|we&63}else{if(I+3>=Z)break;E[I++]=240|we>>18,E[I++]=128|we>>12&63,E[I++]=128|we>>6&63,E[I++]=128|we&63}}return E[I]=0,I-L}function oe(d,E,I){return Ne(d,Y,E,I)}function le(d){for(var E=0,I=0;I<d.length;++I){var k=d.charCodeAt(I);k>=55296&&k<=57343&&(k=65536+((k&1023)<<10)|d.charCodeAt(++I)&1023),k<=127?++E:k<=2047?E+=2:k<=65535?E+=3:E+=4}return E}function Be(d){var E=le(d)+1,I=dt(E);return I&&Ne(d,ne,I,E),I}function fe(d,E){ne.set(d,E)}function ae(d,E){return d%E>0&&(d+=E-d%E),d}var qe,ne,Y,he,ie,de,_e,Pt,It;function Or(d){qe=d,t.HEAP8=ne=new Int8Array(d),t.HEAP16=he=new Int16Array(d),t.HEAP32=de=new Int32Array(d),t.HEAPU8=Y=new Uint8Array(d),t.HEAPU16=ie=new Uint16Array(d),t.HEAPU32=_e=new Uint32Array(d),t.HEAPF32=Pt=new Float32Array(d),t.HEAPF64=It=new Float64Array(d)}var ii=t.INITIAL_MEMORY||16777216,gi,hr=[],fi=[],ni=[],Ks=!1;function pr(){if(t.preRun)for(typeof t.preRun==\"function\"&&(t.preRun=[t.preRun]);t.preRun.length;)fa(t.preRun.shift());yo(hr)}function Ii(){Ks=!0,!t.noFSInit&&!S.init.initialized&&S.init(),ns.init(),yo(fi)}function rs(){if(t.postRun)for(typeof t.postRun==\"function\"&&(t.postRun=[t.postRun]);t.postRun.length;)cg(t.postRun.shift());yo(ni)}function fa(d){hr.unshift(d)}function CA(d){fi.unshift(d)}function cg(d){ni.unshift(d)}var is=0,mA=null,ha=null;function wp(d){return d}function EA(d){is++,t.monitorRunDependencies&&t.monitorRunDependencies(is)}function IA(d){if(is--,t.monitorRunDependencies&&t.monitorRunDependencies(is),is==0&&(mA!==null&&(clearInterval(mA),mA=null),ha)){var E=ha;ha=null,E()}}t.preloadedImages={},t.preloadedAudios={};function wr(d){t.onAbort&&t.onAbort(d),d+=\"\",D(d),Ae=!0,ge=1,d=\"abort(\"+d+\"). Build with -s ASSERTIONS=1 for more info.\";var E=new WebAssembly.RuntimeError(d);throw n(E),E}var Tl=\"data:application/octet-stream;base64,\";function ug(d){return d.startsWith(Tl)}var Io=\"data:application/octet-stream;base64,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ACgCFC0AAiAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQADIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAQgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ABSAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAGIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAcgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ACCAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAJIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAogACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ACyAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAMIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAA0gACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ADiAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAPIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhRBEGo2AhQgACAAKAIIQQFrIgE2AgggAQ0ACyAAIAAoAhhB8f8DcDYCGCAAIAAoAgxB8f8DcDYCDAwBCwsgACgCEARAA0AgACgCEEEQTwRAIAAgACgCEEEQazYCECAAIAAoAhQtAAAgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0AASAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQACIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAMgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ABCAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAFIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAYgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0AByAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAIIAAoAhhqNgIYIAAgACgCGCAAKAIMajYC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NgIYIAEoAgxCADcDICABKAIMQgA3AyggASgCDEEANgIwIAEoAgxBADYCNCABKAIMQQA2AjggASgCDEEANgI8IAEoAgxBADsBQCABKAIMQYCA2I14NgJEIAEoAgxCADcDSCABKAIMQQA7AVAgASgCDEEAOwFSIAEoAgxBADYCVAvSEwEBfyMAQbABayIDJAAgAyAANgKoASADIAE2AqQBIAMgAjYCoAEgA0EANgKQASADIAMoAqQBKAIwQQAQOjYClAEgAyADKAKkASgCOEEAEDo2ApgBAkACQAJAAkAgAygClAFBAkYEQCADKAKYAUEBRg0BCyADKAKUAUEBRgRAIAMoApgBQQJGDQELIAMoApQBQQJHDQEgAygCmAFBAkcNAQsgAygCpAEiACAALwEMQYAQcjsBDAwBCyADKAKkASIAIAAvAQxB/+8DcTsBDCADKAKUAUECRgRAIANB9eABIAMoAqQBKAIwIAMoAqgBQQhqEI4BNgKQASADKAKQAUUEQCADQX82AqwBDAMLCwJAIAMoAqABQYACcQ0AIAMoApgBQQJHDQAgA0H1xgEgAygCpAEoAjggAygCqAFBCGoQjgE2AkggAygCSEUEQCADKAKQARAjIANBfzYCrAEMAwsgAygCSCADKAKQATYCACADIAMoAkg2ApABCwsCQCADKAKkAS8BUkUEQCADKAKkASIAIAAvAQxB/v8DcTsBDAwBCyADKAKkASIAIAAvAQxBAXI7AQwLIAMgAygCpAEgAygCoAEQZUEBcToAhgEgAyADKAKgAUGACnFBgApHBH8gAy0AhgEFQQELQQFxOgCHASADAn9BASADKAKkAS8BUkGBAkYNABpBASADKAKkAS8BUkGCAkYNABogAygCpAEvAVJBgwJGC0EBcToAhQEgAy0AhwFBAXEEQCADIANBIGpCHBApNgIcIAMoAhxFBEAgAygCqAFBCGpBDkEAEBQgAygCkAEQIyADQX82AqwBDAILAkAgAygCoAFBgAJxBEACQCADKAKgAUGACHENACADKAKkASkDIEL/////D1YNACADKAKkASkDKEL/////D1gNAgsgAygCHCADKAKkASkDKBAtIAMoAhwgAygCpAEpAyAQLQwBCwJAAkAgAygCoAFBgAhxDQAgAygCpAEpAyBC/////w9WDQAgAygCpAEpAyhC/////w9WDQAgAygCpAEpA0hC/////w9YDQELIAMoAqQBKQMoQv////8PWgRAIAMoAhwgAygCpAEpAygQLQsgAygCpAEpAyBC/////w9aBEAgAygCHCADKAKkASkDIBAtCyADKAKkASkDSEL/////D1oEQCADKAIcIAMoAqQBKQNIEC0LCwsCfyMAQRBrIgAgAygCHDYCDCAAKAIMLQAAQQFxRQsEQCADKAKoAUEIakEUQQAQFCADKAIcEBYgAygCkAEQIyADQX82AqwBDAILIANBAQJ/IwBBEGsiACADKAIcNgIMAn4gACgCDC0AAEEBcQRAIAAoAgwpAxAMAQtCAAunQf//A3ELIANBIGpBgAYQVTYCjAEgAygCHBAWIAMoAowBIAMoApABNgIAIAMgAygCjAE2ApABCyADLQCFAUEBcQRAIAMgA0EVakIHECk2AhAgAygCEEUEQCADKAKoAUEIakEOQQAQFCADKAKQARAjIANBfzYCrAEMAgsgAygCEEECEB8gAygCEEG9EkECEEEgAygCECADKAKkAS8BUkH/AXEQlgEgAygCECADKAKkASgCEEH//wNxEB8CfyMAQRBrIgAgAygCEDYCDCAAKAIMLQAAQQFxRQsEQCADKAKoAUEIakEUQQAQFCADKAIQEBYgAygCkAEQIyADQX82AqwBDAILIANBgbICQQcgA0EVakGABhBVNgIMIAMoAhAQFiADKAIMIAMoApABNgIAIAMgAygCDDYCkAELIAMgA0HQAGpCLhApIgA2AkwgAEUEQCADKAKoAUEIakEOQQAQFCADKAKQARAjIANBfzYCrAEMAQsgAygCTEHxEkH2EiADKAKgAUGAAnEbQQQQQSADKAKgAUGAAnFFBEAgAygCTCADLQCGAUEBcQR/QS0FIAMoAqQBLwEIC0H//wNxEB8LIAMoAkwgAy0AhgFBAXEEf0EtBSADKAKkAS8BCgtB//8DcRAfIAMoAkwgAygCpAEvAQwQHwJAIAMtAIUBQQFxBEAgAygCTEHjABAfDAELIAMoAkwgAygCpAEoAhBB//8DcRAfCyADKAKkASgCFCADQZ4BaiADQZwBahCNASADKAJMIAMvAZ4BEB8gAygCTCADLwGcARAfAkACQCADLQCFAUEBcUUNACADKAKkASkDKEIUWg0AIAMoAkxBABAhDAELIAMoAkwgAygCpAEoAhgQIQsCQAJAIAMoAqABQYACcUGAAkcNACADKAKkASkDIEL/////D1QEQCADKAKkASkDKEL/////D1QNAQsgAygCTEF/ECEgAygCTEF/ECEMAQsCQCADKAKkASkDIEL/////D1QEQCADKAJMIAMoAqQBKQMgpxAhDAELIAMoAkxBfxAhCwJAIAMoAqQBKQMoQv////8PVARAIAMoAkwgAygCpAEpAyinECEMAQsgAygCTEF/ECELCyADKAJMIAMoAqQBKAIwEFFB//8DcRAfIAMgAygCpAEoAjQgAygCoAEQkgFB//8DcSADKAKQAUGABhCSAUH//wNxajYCiAEgAygCTCADKAKIAUH//wNxEB8gAygCoAFBgAJxRQRAIAMoAkwgAygCpAEoAjgQUUH//wNxEB8gAygCTCADKAKkASgCPEH//wNxEB8gAygCTCADKAKkAS8BQBAfIAMoAkwgAygCpAEoAkQQIQJAIAMoAqQBKQNIQv////8PVARAIAMoAkwgAygCpAEpA0inECEMAQsgAygCTEF/ECELCwJ/IwBBEGsiACADKAJMNgIMIAAoAgwtAABBAXFFCwRAIAMoAqgBQQhqQRRBABAUIAMoAkwQFiADKAKQARAjIANBfzYCrAEMAQsgAygCqAEgA0HQAGoCfiMAQRBrIgAgAygCTDYCDAJ+IAAoAgwtAABBAXEEQCAAKAIMKQMQDAELQgALCxA2QQBIBEAgAygCTBAWIAMoApABECMgA0F/NgKsAQwBCyADKAJMEBYgAygCpAEoAjAEQCADKAKoASADKAKkASgCMBCFAUEASARAIAMoApABECMgA0F/NgKsAQwCCwsgAygCkAEEQCADKAKoASADKAKQAUGABhCRAUEASARAIAMoApABECMgA0F/NgKsAQwCCwsgAygCkAEQIyADKAKkASgCNARAIAMoAqgBIAMoAqQBKAI0IAMoAqABEJEBQQBIBEAgA0F/NgKsAQwCCwsgAygCoAFBgAJxRQRAIAMoAqQBKAI4BEAgAygCqAEgAygCpAEoAjgQhQFBAEgEQCADQX82AqwBDAMLCwsgAyADLQCHAUEBcTYCrAELIAMoAqwBIQAgA0GwAWokACAAC+ACAQF/IwBBIGsiBCQAIAQgADsBGiAEIAE7ARggBCACNgIUIAQgAzYCECAEQRAQGCIANgIMAkAg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AAAgAygCHEHcFmogAygCDEECdGooAgAgAygCHEHYKGpqLQAASg0ADAELIAMoAhxB3BZqIAMoAhRBAnRqIAMoAhxB3BZqIAMoAgxBAnRqKAIANgIAIAMgAygCDDYCFCADIAMoAgxBAXQ2AgwMAQsLIAMoAhxB3BZqIAMoAhRBAnRqIAMoAhA2AgAL1xMBA38jAEEwayICJAAgAiAANgIsIAIgATYCKCACIAIoAigoAgA2AiQgAiACKAIoKAIIKAIANgIgIAIgAigCKCgCCCgCDDYCHCACQX82AhAgAigCLEEANgLQKCACKAIsQb0ENgLUKCACQQA2AhgDQCACKAIYIAIoAhxIBEACQCACKAIkIAIoAhhBAnRqLwEABEAgAiACKAIYIgE2AhAgAigCLEHcFmohAyACKAIsIgQoAtAoQQFqIQAgBCAANgLQKCAAQQJ0IANqIAE2AgAgAigCGCACKAIsQdgoampBADoAAAwBCyACKAIkIAIoAhhBAnRqQQA7AQILIAIgAigCGEEBajYCGAwBCwsDQCACKAIsKALQKEECSARAAkAgAigCEEECSARAIAIgAigCEEEBaiIANgIQDAELQQAhAAsgAigCLEHcFmohAyACKAIsIgQoAtAoQQFqIQEgBCABNgLQKCABQQJ0IANqIAA2AgAgAiAANgIMIAIoAiQgAigCDEECdGpBATsBACACKAIMIAIoAixB2ChqakEAOgAAIAIoAiwiACAAKAKoLUEBazYCqC0gAigCIARAIAIoAiwiACAAKAKsLSACKAIgIAIoAgxBAnRqLwECazYCrC0LDAELCyACKAIoIAIoAhA2AgQgAiACKAIsKALQKEECbTYCGANAIAIoAhhBAU4EQCACKAIsIAIoAiQgAigCGBB5IAIgAigCGEEBazYCGAwBCwsgAiACKAIcNgIMA0AgAiACKAIsKALgFjYCGCACKAIsQdwWaiEBIAIoAiwiAygC0CghACADIABBAWs2AtAoIAIoAiwgAEECdCABaigCADYC4BYgAigCLCACKAIkQQEQeSACIAIoAiwoAuAWNgIUIAIoAhghASACKAIsQdwWaiEDIAIoAiwiBCgC1ChBAWshACAEIAA2AtQoIABBAnQgA2ogATYCACACKAIUIQEgAigCLEHcFmohAyACKAIsIgQoAtQoQQFrIQAgBCAANgLUKCAA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AQsgAigCCEEANgIAIAIoAghCADcDECACKAIIQgA3AwggAigCCEIANwMgIAIoAghCADcDGCACKAIIQQA2AiggAigCCEEAOgAsIAIoAgggAikDECACKAIMEI8BQQFxRQRAIAIoAggQJSACQQA2AhwMAQsgAiACKAIINgIcCyACKAIcIQEgAkEgaiQAIAEL1gIBAX8jAEEgayIDJAAgAyAANgIYIAMgATYCFCADIAI2AhAgAyADQQxqQgQQKTYCCAJAIAMoAghFBEAgA0F/NgIcDAELA0AgAygCFARAIAMoAhQoAgQgAygCEHFBgAZxBEAgAygCCEIAECwaIAMoAgggAygCFC8BCBAfIAMoAgggAygCFC8BChAfAn8jAEEQayIAIAMoAgg2AgwgACgCDC0AAEEBcUULBEAgAygCGEEIakEUQQAQFCADKAIIEBYgA0F/NgIcDAQLIAMoAhggA0EMakIEEDZBAEgEQCADKAIIEBYgA0F/NgIcDAQLIAMoAhQvAQoEQCADKAIYIAMoAhQoAgwgAygCFC8BCq0QNkEASARAIAMoAggQFiADQX82AhwMBQsLCyADIAMoAhQoAgA2AhQMAQsLIAMoAggQFiADQQA2AhwLIAMoAhwhACADQSBqJAAgAAtoAQF/IwBBEGsiAiAANgIMIAIgATYCCCACQQA7AQYDQCACKAIMBEAgAigCDCgCBCACKAIIcUGABnEEQCACIAIoAgwvAQogAi8BBkEEamo7AQYLIAIgAigCDCgCADYCDAwBCwsgAi8BBgvwAQEBfyMAQRBrIgEkACABIAA2AgwgASABKAIMNgIIIAFBADYCBANAIAEoAgwEQAJAAkAgASgCDC8BCEH1xgFGDQAgASgCDC8BCEH14AFGDQAgASgCDC8BCEGBsgJGDQAgASgCDC8BCEEBRw0BCyABIAEoAgwoAgA2AgAgASgCCCABKAIMRgRAIAEgASgCADYCCAsgASgCDEEANgIAIAEoAgwQIyABKAIEBEAgASgCBCABKAIANgIACyABIAEoAgA2AgwMAgsgASABKAIMNgIEIAEgASgCDCgCADYCDAwBCwsgASgCCCEAIAFBEGokACAAC7IEAQF/IwBBQGoiBSQAIAUgADYCOCAFIAE7ATYgBSACNgIwIAUgAzYCLCAFIAQ2AiggBSAFKAI4IAUvATatECkiADYCJAJAIABFBEAgBSgCKEEOQQAQFCAFQQA6AD8MAQsgBUEANgIgIAVBADYCGANAAn8jAEEQayIAIAUoAiQ2AgwgACgCDC0AAEEBcQsEfyAFKAIkEDBCBFoFQQALQQFxBEAgBSAFKAIkEB07ARYgBSAFKAIkEB07ARQgBSAFKAIkIAUvARStEB42AhAgBSgCEEUEQCAFKAIoQRVBABAUIAUoAiQQFiAFKAIYECMgBUEAOgA/DAMLIAUgBS8BFiAFLwEUIAUoAhAgBSgCMBBVIgA2AhwgAEUEQCAFKAIoQQ5BABAUIAUoAiQQFiAFKAIYECMgBUEAOgA/DAMLAkAgBSgCGARAIAUoAiAgBSgCHDYCACAFIAUoAhw2AiAMAQsgBSAFKAIcIgA2AiAgBSAANgIYCwwBCwsgBSgCJBBHQQFxRQRAIAUgBSgCJBAwPgIMIAUgBSgCJCAFKAIMrRAeNgIIAkACQCAFKAIMQQRPDQAgBSgCCEUNACAFKAIIQZEVIAUoAgwQT0UNAQsgBSgCKEEVQQAQFCAFKAIkEBYgBSgCGBAjIAVBADoAPwwCCwsgBSgCJBAWAkAgBSgCLARAIAUoAiwgBSgCGDYCAAwBCyAFKAIYECMLIAVBAToAPwsgBS0AP0EBcSEAIAVBQGskACAAC+8CAQF/IwBBIGsiAiQAIAIgADYCGCACIAE2AhQCQCACKAIYRQRAIAIgAigCFDYCHAwBCyACIAIoAhg2AggDQCACKAIIKAIABEAgAiACKAIIKAIANgIIDAELCwNAIAIoAhQEQCACIAIoAhQoAgA2AhAgAkEANgIEIAIgAigCGDYCDANAAkAgAigCDEUNAAJAIAIoAgwvAQggAigCFC8BCEcNACACKAIMLwEKIAIoAhQvAQpHDQAgAigCDC8BCgRAIAIoAgwoAgwgAigCFCgCDCACKAIMLwEKEE8NAQsgAigCDCIAIAAoAgQgAigCFCgCBEGABnFyNgIEIAJBATYCBAwBCyACIAIoAgwoAgA2AgwMAQsLIAIoAhRBADYCAAJAIAIoAgQEQCACKAIUECMMAQsgAigCCCACKAIUIgA2AgAgAiAANgIICyACIAIoAhA2AhQMAQsLIAIgAigCGDYCHAsgAigCHCEAIAJBIGokACAAC18BAX8jAEEQayICJAAgAiAANgIIIAIgAToAByACIAIoAghCARAeNgIAAkAgAigCAEUEQCACQX82AgwMAQsgAigCACACLQAHOgAAIAJBADYCDAsgAigCDBogAkEQaiQAC1QBAX8jAEEQayIBJAAgASAANgIIIAEgASgCCEIBEB42AgQCQCABKAIERQRAIAFBADoADwwBCyABIAEoAgQtAAA6AA8LIAEtAA8hACABQRBqJAAgAAucBgECfyMAQSBrIgIkACACIAA2AhggAiABNwMQAkAgAikDECACKAIYKQMwWgRAIAIoAhhBCGpBEkEAEBQgAkF/NgIcDAELIAIoAhgoAhhBAnEEQCACKAIYQQhqQRlBABAUIAJBfzYCHAwBCyACIAIoAhggAikDEEEAIAIoAhhBCGoQTSIANgIMIABFBEAgAkF/NgIcDAELIAIoAhgoAlAgAigCDCACKAIYQQhqEFlBAXFFBEAgAkF/NgIcDAELAn8gAigCGCEDIAIpAxAhASMAQTBrIgAkACAAIAM2AiggACABNwMgIABBATYCHAJAIAApAyAgACgCKCkDMFoEQCAAKAIoQQhqQRJBABAUIABBfzYCLAwBCwJAIAAoAhwNACAAKAIoKAJAIAApAyCnQQR0aigCBEUNACAAKAIoKAJAIAApAyCnQQR0aigCBCgCAEECcUUNAAJAIAAoAigoAkAgACkDIKdBBHRqKAIABEAgACAAKAIoIAApAyBBCCAAKAIoQQhqEE0iAzYCDCADRQRAIABBfzYCLAwECyAAIAAoAiggACgCDEEAQQAQWDcDEAJAIAApAxBCAFMNACAAKQMQIAApAyBRDQAgACgCKEEIakEKQQAQFCAAQX82AiwMBAsMAQsgAEEANgIMCyAAIAAoAiggACkDIEEAIAAoAihBCGoQTSIDNgIIIANFBEAgAEF/NgIsDAILIAAoAgwEQCAAKAIoKAJQIAAoAgwgACkDIEEAIAAoAihBCGoQdEEBcUUEQCAAQX82AiwMAwsLIAAoAigoAlAgACgCCCAAKAIoQQhqEFlBAXFFBEAgACgCKCgCUCAAKAIMQQAQWRogAEF/NgIsDAILCyAAKAIoKAJAIAApAyCnQQR0aigCBBA3IAAoAigoAkAgACkDIKdBBHRqQQA2AgQgACgCKCgCQCAAKQMgp0EEdGoQXiAAQQA2AiwLIAAoAiwhAyAAQTBqJAAgAwsEQCACQX82AhwMAQsgAigCGCgCQCACKQMQp0EEdGpBAToADCACQQA2AhwLIAIoAhwhACACQSBqJAAgAAulBAEBfyMAQTBrIgUkACAFIAA2AiggBSABNwMgIAUgAjYCHCAFIAM6ABsgBSAENgIUAkAgBSgCKCAFKQMgQQBBABA/RQRAIAVBfzYCLAwBCyAFKAIoKAIYQQJxBEAgBSgCKEEIakEZQQAQFCAFQX82AiwMAQsgBSAFKAIoKAJAIAUpAyCnQQR0ajYCECAFAn8gBSgCECgCAARAIAUoAhAoAgAvAQhBCHYMAQtBAws6AAsgBQJ/IAUoAhAoAgAEQCAFKAIQKAIAKAJEDAELQYCA2I14CzYCBEEBIQAgBSAFLQAbIAUtAAtGBH8gBSgCFCAFKAIERwVBAQtBAXE2AgwCQCAFKAIMBEAgBSgCECgCBEUEQCAFKAIQKAIAEEAhACAFKAIQIAA2AgQgAEUEQCAFKAIoQQhqQQ5BABAUIAVBfzYCLAwECwsgBSgCECgCBCAFKAIQKAIELwEIQf8BcSAFLQAbQQh0cjsBCCAFKAIQKAIEIAUoAhQ2AkQgBSgCECgCBCIAIAAoAgBBEHI2AgAMAQsgBSgCECgCBARAIAUoAhAoAgQiACAAKAIAQW9xNgIAAkAgBSgCECgCBCgCAEUEQCAFKAIQKAIEEDcgBSgCEEEANgIEDAELIAUoAhAoAgQgBSgCECgCBC8BCEH/AXEgBS0AC0EIdHI7AQggBSgCECgCBCAFKAIENgJECwsLIAVBADYCLAsgBSgCLCEAIAVBMGokACAAC90PAgF/AX4jAEFAaiIEJAAgBCAANgI0IARCfzcDKCAEIAE2AiQgBCACNgIgIAQgAzYCHAJAIAQoAjQoAhhBAnEEQCAEKAI0QQhqQRlBABAUIARCfzcDOAwBCyAEIAQoAjQpAzA3AxAgBCkDKEJ/UQRAIARCfzcDCCAEKAIcQYDAAHEEQCAEIAQoAjQgBCgCJCAEKAIcQQAQWDcDCAsgBCkDCEJ/UQRAIAQoAjQhASMAQUBqIgAkACAAIAE2AjQCQCAAKAI0KQM4IAAoAjQpAzBCAXxYBEAgACAAKAI0KQM4NwMYIAAgACkDGEIBhjcDEAJAIAApAxBCEFQEQCAAQhA3AxAMAQsgACkDEEKACFYEQCAAQoAINwMQCwsgACAAKQMQIAApAxh8NwMYIAAgACkDGKdBBHStNwMIIAApAwggACgCNCkDOKdBBHStVARAIAAoAjRBCGpBDkEAEBQgAEJ/NwM4DAILIAAgACgCNCgCQCAAKQMYp0EEdBBONgIkIAAoAiRFBEAgACgCNEEIakEOQQAQFCAAQn83AzgMAgsgACgCNCAAKAIkNgJAIAAoAjQgACkDGDcDOAsgACgCNCIBKQMwIQUgASAFQgF8NwMwIAAgBTcDKCAAKAI0KAJAIAApAyinQQR0ahC1ASAAIAApAyg3AzgLIAApAzghBSAAQUBrJAAgBCAFNwMIIAVCAFMEQCAEQn83AzgMAwsLIAQgBCkDCDcDKAsCQCAEKAIkRQ0AIAQoAjQhASAEKQMoIQUgBCgCJCECIAQoAhwhAyMAQUBqIgAkACAAIAE2AjggACAFNwMwIAAgAjYCLCAAIAM2AigCQCAAKQMwIAAoAjgpAzBaBEAgACgCOEEIakESQQAQFCAAQX82AjwMAQsgACgCOCgCGEECcQRAIAAoAjhBCGpBGUEAEBQgAEF/NgI8DAELAkACQCAAKAIsRQ0AIAAoAiwsAABFDQAgACAAKAIsIAAoAiwQLkH//wNxIAAoAiggACgCOEEIahBQIgE2AiAgAUUEQCAAQX82AjwMAwsCQCAAKAIoQYAwcQ0AIAAoAiBBABA6QQNHDQAgACgCIEECNgIICwwBCyAAQQA2AiALIAAgACgCOCAAKAIsQQBBABBYIgU3AxACQCAFQgBTDQAgACkDECAAKQMwUQ0AIAAoAiAQJCAAKAI4QQhqQQpBABAUIABBfzYCPAwBCwJAIAApAxBCAFMNACAAKQMQIAApAzBSDQAgACgCIBAkIABBADYCPAwBCyAAIAAoAjgoAkAgACkDMKdBBHRqNgIkAkAgACgCJCgCAARAIAAgACgCJCgCACgCMCAAKAIgEIYBQQBHOgAfDAELIABBADoAHwsCQCAALQAfQQFxDQAgACgCJCgCBA0AIAAoAiQoAgAQQCEBIAAoAiQgATYCBCABRQRAIAAoAjhBCGpBDkEAEBQgACgCIBAkIABBfzYCPAwCCwsgAAJ/IAAtAB9BAXEEQCAAKAIkKAIAKAIwDAELIAAoAiALQQBBACAAKAI4QQhqEEYiATYCCCABRQRAIAAoAiAQJCAAQX82AjwMAQsCQCAAKAIkKAIEBEAgACAAKAIkKAIEKAIwNgIEDAELAkAgACgCJCgCAARAIAAgACgCJCgCACgCMDYCBAwBCyAAQQA2AgQLCwJAIAAoAgQEQCAAIAAoAgRBAEEAIAAoAjhBCGoQRiIBNgIMIAFFBEAgACgCIBAkIABBfzYCPAwDCwwBCyAAQQA2AgwLIAAoAjgoAlAgACgCCCAAKQMwQQAgACgCOEEIahB0QQFxRQRAIAAoAiAQJCAAQX82AjwMAQsgACgCDARAIAAoAjgoAlAgACgCDEEAEFkaCwJAIAAtAB9BAXEEQCAAKAIkKAIEBEAgACgCJCgCBCgCAEECcQRAIAAoAiQoAgQoAjAQJCAAKAIkKAIEIgEgASgCAEF9cTYCAAJAIAAoAiQoAgQoAgBFBEAgACgCJCgCBBA3IAAoAiRBADYCBAwBCyAAKAIkKAIEIAAoAiQoAgAoAjA2AjALCwsgACgCIBAkDAELIAAoAiQoAgQoAgBBAnEEQCAAKAIkKAIEKAIwECQLIAAoAiQoAgQiASABKAIAQQJyNgIAIAAoAiQoAgQgACgCIDYCMAsgAEEANgI8CyAAKAI8IQEgAEFAayQAIAFFDQAgBCgCNCkDMCAEKQMQUgRAIAQoAjQoAkAgBCkDKKdBBHRqEHcgBCgCNCAEKQMQNwMwCyAEQn83AzgMAQsgBCgCNCgCQCAEKQMop0EEdGoQXgJAIAQoAjQoAkAgBCkDKKdBBHRqKAIARQ0AIAQoAjQoAkAgBCkDKKdBBHRqKAIEBEAgBCgCNCgCQCAEKQMop0EEdGooAgQoAgBBAXENAQsgBCgCNCgCQCAEKQMop0EEdGooAgRFBEAgBCgCNCgCQCAEKQMop0EEdGooAgAQQCEAIAQoAjQoAkAgBCkDKKdBBHRqIAA2AgQgAEUEQCAEKAI0QQhqQQ5BABAUIARCfzcDOAwDCwsgBCgCNCgCQCAEKQMop0EEdGooAgRBfjYCECAEKAI0KAJAIAQpAyinQQR0aigCBCIAIAAoAgBBAXI2AgALIAQoAjQoAkAgBCkDKKdBBHRqIAQoAiA2AgggBCAEKQMoNwM4CyAEKQM4IQUgBEFAayQAIAULqgEBAX8jAEEwayICJAAgAiAANgIoIAIgATcDICACQQA2AhwCQAJAIAIoAigoAiRBAUYEQCACKAIcRQ0BIAIoAhxBAUYNASACKAIcQQJGDQELIAIoAihBDGpBEkEAEBQgAkF/NgIsDAELIAIgAikDIDcDCCACIAIoAhw2AhAgAkF/QQAgAigCKCACQQhqQhBBDBAgQgBTGzYCLAsgAigCLCEAIAJBMGokACAAC6UyAwZ/AX4BfCMAQeAAayIEJAAgBCAANgJYIAQgATYCVCAEIAI2AlACQAJAIAQoAlRBAE4EQCAEKAJYDQELIAQoAlBBEkEAEBQgBEEANgJcDAELIAQgBCgCVDYCTCMAQRBrIgAgBCgCWDYCDCAEIAAoAgwpAxg3A0BB4JoBKQMAQn9RBEAgBEF/NgIUIARBAzYCECAEQQc2AgwgBEEGNgIIIARBAjYCBCAEQQE2AgBB4JoBQQAgBBA0NwMAIARBfzYCNCAEQQ82AjAgBEENNgIsIARBDDYCKCAEQQo2AiQgBEEJNgIgQeiaAUEIIARBIGoQNDcDAAtB4JoBKQMAIAQpA0BB4JoBKQMAg1IEQCAEKAJQQRxBABAUIARBADYCXAwBC0HomgEpAwAgBCkDQEHomgEpAwCDUgRAIAQgBCgCTEEQcjYCTAsgBCgCTEEYcUEYRgRAIAQoAlBBGUEAEBQgBEEANgJcDAELIAQoAlghASAEKAJQIQIjAEHQAGsiACQAIAAgATYCSCAAIAI2AkQgAEEIahA7AkAgACgCSCAAQQhqEDkEQCMAQRBrIgEgACgCSDYCDCAAIAEoAgxBDGo2AgQjAEEQayIBIAAoAgQ2AgwCQCABKAIMKAIAQQVHDQAjAEEQayIBIAAoAgQ2AgwgASgCDCgCBEEsRw0AIABBADYCTAwCCyAAKAJEIAAoAgQQRSAAQX82AkwMAQsgAEEBNgJMCyAAKAJMIQEgAEHQAGokACAEIAE2AjwCQAJAAkAgBCgCPEEBag4CAAECCyAEQQA2AlwMAgsgBCgCTEEBcUUEQCAEKAJQQQlBABAUIARBADYCXAwCCyAEIAQoAlggBCgCTCAEKAJQEGk2AlwMAQsgBCgCTEECcQRAIAQoAlBBCkEAEBQgBEEANgJcDAELIAQoAlgQSEEASARAIAQoAlAgBCgCWBAXIARBADYCXAwBCwJAIAQoAkxBCHEEQCAEIAQoAlggBCgCTCAEKAJQEGk2AjgMAQsgBCgCWCEAIAQoAkwhASAEKAJQIQIjAEHwAGsiAyQAIAMgADYCaCADIAE2AmQgAyACNgJgIANBIGoQOwJAIAMoAmggA0EgahA5QQBIBEAgAygCYCADKAJoEBcgA0EANgJsDAELIAMpAyBCBINQBEAgAygCYEEEQYoBEBQgA0EANgJsDAELIAMgAykDODcDGCADIAMoAmggAygCZCADKAJgEGkiADYCXCAARQRAIANBADYCbAwBCwJAIAMpAxhQRQ0AIAMoAmgQngFBAXFFDQAgAyADKAJcNgJsDAELIAMoAlwhACADKQMYIQkjAEHgAGsiAiQAIAIgADYCWCACIAk3A1ACQCACKQNQQhZUBEAgAigCWEEIakETQQAQFCACQQA2AlwMAQsgAgJ+IAIpA1BCqoAEVARAIAIpA1AMAQtCqoAECzcDMCACKAJYKAIAQgAgAikDMH1BAhAnQQBIBEAjAEEQayIAIAIoAlgoAgA2AgwgAiAAKAIMQQxqNgIIAkACfyMAQRBrIgAgAigCCDYCDCAAKAIMKAIAQQRGCwRAIwBBEGsiACACKAIINgIMIAAoAgwoAgRBFkYNAQsgAigCWEEIaiACKAIIEEUgAkEANgJcDAILCyACIAIoAlgoAgAQSSIJNwM4IAlCAFMEQCACKAJYQQhqIAIoAlgoAgAQFyACQQA2AlwMAQsgAiACKAJYKAIAIAIpAzBBACACKAJYQQhqEEIiADYCDCAARQRAIAJBADYCXAwBCyACQn83AyAgAkEANgJMIAIpAzBCqoAEWgRAIAIoAgxCFBAsGgsgAkEQakETQQAQFCACIAIoAgxCABAeNgJEA0ACQCACKAJEIQEgAigCDBAwQhJ9pyEFIwBBIGsiACQAIAAgATYCGCAAIAU2AhQgAEHsEjYCECAAQQQ2AgwCQAJAIAAoAhQgACgCDE8EQCAAKAIMDQELIABBADYCHAwBCyAAIAAoAhhBAWs2AggDQAJAIAAgACgCCEEBaiAAKAIQLQAAIAAoAhggACgCCGsgACgCFCAAKAIMa2oQqwEiATYCCCABRQ0AIAAoAghBAWogACgCEEEBaiAAKAIMQQFrEE8NASAAIAAoAgg2AhwMAgsLIABBADYCHAsgACgCHCEBIABBIGokACACIAE2AkQgAUUNACACKAIMIAIoAkQCfyMAQRBrIgAgAigCDDYCDCAAKAIMKAIEC2usECwaIAIoAlghASACKAIMIQUgAikDOCEJIwBB8ABrIgAkACAAIAE2AmggACAFNgJkIAAgCTcDWCAAIAJBEGo2AlQjAEEQayIBIAAoAmQ2AgwgAAJ+IAEoAgwtAABBAXEEQCABKAIMKQMQDAELQgALNwMwAkAgACgCZBAwQhZUBEAgACgCVEETQQAQFCAAQQA2AmwMAQsgACgCZEIEEB4oAABB0JaVMEcEQCAAKAJUQRNBABAUIABBADYCbAwBCwJAAkAgACkDMEIUVA0AIwBBEGsiASAAKAJkNgIMIAEoAgwoAgQgACkDMKdqQRRrKAAAQdCWmThHDQAgACgCZCAAKQMwQhR9ECwaIAAoAmgoAgAhBSAAKAJkIQYgACkDWCEJIAAoAmgoAhQhByAAKAJUIQgjAEGwAWsiASQAIAEgBTYCqAEgASAGNgKkASABIAk3A5gBIAEgBzYClAEgASAINgKQASMAQRBrIgUgASgCpAE2AgwgAQJ+IAUoAgwtAABBAXEEQCAFKAIMKQMQDAELQgALNwMYIAEoAqQBQgQQHhogASABKAKkARAdQf//A3E2AhAgASABKAKkARAdQf//A3E2AgggASABKAKkARAxNwM4AkAgASkDOEL///////////8AVgRAIAEoApABQQRBFhAUIAFBADYCrAEMAQsgASkDOEI4fCABKQMYIAEpA5gBfFYEQCABKAKQAUEVQQAQFCABQQA2AqwBDAELAkACQCABKQM4IAEpA5gBVA0AIAEpAzhCOHwgASkDmAECfiMAQRBrIgUgASgCpAE2AgwgBSgCDCkDCAt8Vg0AIAEoAqQBIAEpAzggASkDmAF9ECwaIAFBADoAFwwBCyABKAKoASABKQM4QQAQJ0EASARAIAEoApABIAEoAqgBEBcgAUEANgKsAQwCCyABIAEoAqgBQjggAUFAayABKAKQARBCIgU2AqQBIAVFBEAgAUEANgKsAQwCCyABQQE6ABcLIAEoAqQBQgQQHigAAEHQlpkwRwRAIAEoApABQRVBABAUIAEtABdBAXEEQCABKAKkARAWCyABQQA2AqwBDAELIAEgASgCpAEQMTcDMAJAIAEoApQBQQRxRQ0AIAEpAzAgASkDOHxCDHwgASkDmAEgASkDGHxRDQAgASgCkAFBFUEAEBQgAS0AF0EBcQRAIAEoAqQBEBYLIAFBADYCrAEMAQsgASgCpAFCBBAeGiABIAEoAqQBECo2AgwgASABKAKkARAqNgIEIAEoAhBB//8DRgRAIAEgASgCDDYCEAsgASgCCEH//wNGBEAgASABKAIENgIICwJAIAEoApQBQQRxRQ0AIAEoAgggASgCBEYEQCABKAIQIAEoAgxGDQELIAEoApABQRVBABAUIAEtABdBAXEEQCABKAKkARAWCyABQQA2AqwBDAELAkAgASgCEEUEQCABKAIIRQ0BCyABKAKQAUEBQQAQFCABLQAXQQFxBEAgASgCpAEQFgsgAUEANgKsAQwBCyABIAEoAqQBEDE3AyggASABKAKkARAxNwMgIAEpAyggASkDIFIEQCABKAKQAUEBQQAQFCABLQAXQQFxBEAgASgCpAEQFgsgAUEANgKsAQwBCyABIAEoAqQBEDE3AzAgASABKAKkARAxNwOAAQJ/IwBBEGsiBSABKAKkATYCDCAFKAIMLQAAQQFxRQsEQCABKAKQAUEUQQAQFCABLQAXQQFxBEAgASgCpAEQFgsgAUEANgKsAQwBCyABLQAXQQFxBEAgASgCpAEQFgsCQCABKQOAAUL///////////8AWARAIAEpA4ABIAEpA4ABIAEpAzB8WA0BCyABKAKQAUEEQRYQFCABQQA2AqwBDAELIAEpA4ABIAEpAzB8IAEpA5gBIAEpAzh8VgRAIAEoApABQRVBABAUIAFBADYCrAEMAQsCQCABKAKUAUEEcUUNACABKQOAASABKQMwfCABKQOYASABKQM4fFENACABKAKQAUEVQQAQFCABQQA2AqwBDAELIAEpAyggASkDMEIugFYEQCABKAKQAUEVQQAQFCABQQA2AqwBDAELIAEgASkDKCABKAKQARCQASIFNgKMASAFRQRAIAFBADYCrAEMAQsgASgCjAFBAToALCABKAKMASABKQMwNwMYIAEoAowBIAEpA4ABNwMgIAEgASgCjAE2AqwBCyABKAKsASEFIAFBsAFqJAAgACAFNgJQDAELIAAoAmQgACkDMBAsGiAAKAJkIQUgACkDWCEJIAAoAmgoAhQhBiAAKAJUIQcjAEHQAGsiASQAIAEgBTYCSCABIAk3A0AgASAGNgI8IAEgBzYCOAJAIAEoAkgQMEIWVARAIAEoAjhBFUEAEBQgAUEANgJMDAELIwBBEGsiBSABKAJINgIMIAECfiAFKAIMLQAAQQFxBEAgBSgCDCkDEAwBC0IACzcDCCABKAJI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ECADQcgAEBgiADYCDAJAIABFBEAgAygCEEEBQbSbASgCABAUIANBADYCHAwBCyADKAIMIAMoAhA2AgAgAygCDCADLQAbQQFxOgAEIAMoAgwgAygCFDYCCAJAIAMoAgwoAghBAU4EQCADKAIMKAIIQQlMDQELIAMoAgxBCTYCCAsgAygCDEEAOgAMIAMoAgxBADYCMCADKAIMQQA2AjQgAygCDEEANgI4IAMgAygCDDYCHAsgAygCHCEAIANBIGokACAACzgBAX8jAEEQayIBIAA2AgwgASgCDEEANgIAIAEoAgxBADYCBCABKAIMQQA2AgggASgCDEEAOgAMC+MIAQF/IwBBQGoiAiAANgI4IAIgATYCNCACIAIoAjgoAnw2AjAgAiACKAI4KAI4IAIoAjgoAmxqNgIsIAIgAigCOCgCeDYCICACIAIoAjgoApABNgIcIAICfyACKAI4KAJsIAIoAjgoAixBhgJrSwRAIAIoAjgoAmwgAigCOCgCLEGGAmtrDAELQQALNgIYIAIgAigCOCgCQDYCFCACIAIoAjgoAjQ2AhAgAiACKAI4KAI4IAIoAjgoAmxqQYICajYCDCACIAIoAiwgAigCIEEBa2otAAA6AAsgAiACKAIsIAIoAiBqLQAAOgAKIAIoAjgoAnggAigCOCgCjAFPBEAgAiACKAIwQQJ2NgIwCyACKAIcIAIoAjgoAnRLBEAgAiACKAI4KAJ0NgIcCwNAAkAgAiACKAI4KAI4IAIoAjRqNgIoAkAgAigCKCACKAIgai0AACACLQAKRw0AIAIoAiggAigCIEEBa2otAAAgAi0AC0cNACACKAIoLQAAIAIoAiwtAABHDQAgAiACKAIoIgBBAWo2AiggAC0AASACKAIsLQABRwRADAELIAIgAigCLEECajYCLCACIAIoAihBAWo2AigDQCACIAIoAiwiAEEBajYCLCAALQABIQEgAiACKAIoIgBBAWo2AigCf0EAIAAtAAEgAUcNABogAiACKAIsIgBBAWo2AiwgAC0AASEBIAIgAigCKCIAQQFqNgIoQQAgAC0AASABRw0AGiACIAIoAiwiAEEBajYCLCAALQABIQEgAiACKAIoIgBBAWo2AihBACAALQABIAFHDQAaIAIgAigCLCIAQQFqNgIsIAAtAAEhASACIAIoAigiAEEBajYCKEEAIAAtAAEgAUcNABogAiACKAIsIgBBAWo2AiwgAC0AASEBIAIgAigCKCIAQQFqNgIoQQAgAC0AASABRw0AGiACIAIoAiwiAEEBajYCLCAALQABIQEgAiACKAIoIgBBAWo2AihBACAALQABIAFHDQAaIAIgAigCLCIAQQFqNgIsIAAtAAEhASACIAIoAigiAEEBajYCKEEAIAAtAAEgAUcNABogAiACKAIsIgBBAWo2AiwgAC0AASEBIAIgAigCKCIAQQFqNgIoQQAgAC0AASABRw0AGiACKAIsIAIoAgxJC0EBcQ0ACyACQYICIAIoAgwgAigCLGtrNgIkIAIgAigCDEGCAms2AiwgAigCJCACKAIgSgRAIAIoAjggAigCNDYCcCACIAIoAiQ2AiAgAigCJCACKAIcTg0CIAIgAigCLCACKAIgQQFrai0AADoACyACIAIoAiwgAigCIGotAAA6AAoLCyACIAIoAhQgAigCNCACKAIQcUEBdGovAQAiATYCNEEAIQAgASACKAIYSwR/IAIgAigCMEEBayIANgIwIABBAEcFQQALQQFxDQELCwJAIAIoAiAgAigCOCgCdE0EQCACIAIoAiA2AjwMAQsgAiACKAI4KAJ0NgI8CyACKAI8C5IQAQF/IwBBMGsiAiQAIAIgADYCKCACIAE2AiQgAgJ/IAIoAigoAiwgAigCKCgCDEEFa0kEQCACKAIoKAIsDAELIAIoAigoAgxBBWsLNgIgIAJBADYCECACIAIoAigoAgAoAgQ2AgwDQAJAIAJB//8DNgIcIAIgAigCKCgCvC1BKmpBA3U2AhQgAigCKCgCACgCECACKAIUSQ0AIAIgAigCKCgCACgCECACKAIUazYCFCACIAIoAigoAmwgAigCKCgCXGs2AhggAigCHCACKAIYIAIoAigoAgAoAgRqSwRAIAIgAigCGCACKAIoKAIAKAIEajYCHAsgAigCHCACKAIUSwRAIAIgAigCFDYCHAsCQCACKAIcIAIoAiBPDQACQCACKAIcRQRAIAIoAiRBBEcNAQsgAigCJEUNACACKAIcIAIoAhggAigCKCgCACgCBGpGDQELDAELQQAhACACIAIoAiRBBEYEfyACKAIcIAIoAhggAigCKCgCACgCBGpGBUEAC0EBcTYCECACKAIoQQBBACACKAIQEF0gAigCKCgCCCACKAIoKAIUQQRraiACKAIcOgAAIAIoAigoAgggAigCKCgCFEEDa2ogAigCHEEIdjoAACACKAIoKAIIIAIoAigoAhRBAmtqIAIoAhxBf3M6AAAgAigCKCgCCCACKAIoKAIUQQFraiACKAIcQX9zQQh2OgAAIAIoAigoAgAQHCACKAIYBEAgAigCGCACKAIcSwRAIAIgAigCHDYCGAsgAigCKCgCACgCDCACKAIoKAI4IAIoAigoAlxqIAIoAhgQGRogAigCKCgCACIAIAIoAhggACgCDGo2AgwgAigCKCgCACIAIAAoAhAgAigCGGs2AhAgAigCKCgCACIAIAIoAhggACgCFGo2AhQgAigCKCIAIAIoAhggACgCXGo2AlwgAiACKAIcIAIoAhhrNgIcCyACKAIcBEAgAigCKCgCACACKAIoKAIAKAIMIAIoAhwQdhogAigCKCgCACIAIAIoAhwgACgCDGo2AgwgAigCKCgCACIAIAAoAhAgAigCHGs2AhAgAigCKCgCACIAIAIoAhwgACgCFGo2AhQLIAIoAhBFDQELCyACIAIoAgwgAigCKCgCACgCBGs2AgwgAigCDARAAkAgAigCDCACKAIoKAIsTwRAIAIoAihBAjYCsC0gAigCKCgCOCACKAIoKAIAKAIAIAIoAigoAixrIAIoAigoAiwQGRogAigCKCACKAIoKAIsNgJsDAELIAIoAgwgAigCKCgCPCACKAIoKAJsa08EQCACKAIoIgAgACgCbCACKAIoKAIsazYCbCACKAIoKAI4IAIoAigoAjggAigCKCgCLGogAigCKCgCbBAZGiACKAIoKAKwLUECSQRAIAIoAigiACAAKAKwLUEBajYCsC0LCyACKAIoKAI4IAIoAigoAmxqIAIoAigoAgAoAgAgAigCDGsgAigCDBAZGiACKAIoIgAgAigCDCAAKAJsajYCbAsgAigCKCACKAIoKAJsNgJcIAIoAigiAQJ/IAIoAgwgAigCKCgCLCACKAIoKAK0LWtLBEAgAigCKCgCLCACKAIoKAK0LWsMAQsgAigCDAsgASgCtC1qNgK0LQsgAigCKCgCwC0gAigCKCgCbEkEQCACKAIoIAIoAigoAmw2AsAtCwJAIAIoAhAEQCACQQM2AiwMAQsCQCACKAIkRQ0AIAIoAiRBBEYNACACKAIoKAIAKAIEDQAgAigCKCgCbCACKAIoKAJcRw0AIAJBATYCLAwBCyACIAIoAigoAjwgAigCKCgCbGtBAWs2AhQCQCACKAIoKAIAKAIEIAIoAhRNDQAgAigCKCgCXCACKAIoKAIsSA0AIAIoAigiACAAKAJcIAIoAigoAixrNgJcIAIoAigiACAAKAJsIAIoAigoAixrNgJsIAIoAigoAjggAigCKCgCOCACKAIoKAIsaiACKAIoKAJsEBkaIAIoAigoArAtQQJJBEAgAigCKCIAIAAoArAtQQFqNgKwLQsgAiACKAIoKAIsIAIoAhRqNgIUCyACKAIUIAIoAigoAgAoAgRLBEAgAiACKAIoKAIAKAIENgIUCyACKAIUBEAgAigCKCgCACACKAIoKAI4IAIoAigoAmxqIAIoAhQQdhogAigCKCIAIAIoAhQgACgCbGo2AmwLIAIoAigoAsAtIAIoAigoAmxJBEAgAigCKCACKAIoKAJsNgLALQsgAiACKAIoKAK8LUEqakEDdTYCFCACIAIoAigoAgwgAigCFGtB//8DSwR/Qf//AwUgAigCKCgCDCACKAIUaws2AhQgAgJ/IAIoAhQgAigCKCgCLEsEQCACKAIoKAIsDAELIAIoAhQLNgIgIAIgAigCKCgCbCACKAIoKAJcazYCGAJAIAIoAhggAigCIEkEQCACKAIYRQRAIAIoAiRBBEcNAgsgAigCJEUNASACKAIoKAIAKAIEDQEgAigCGCACKAIUSw0BCyACAn8gAigCGCACKAIUSwRAIAIoAhQMAQsgAigCGAs2AhwgAgJ/QQAgAigCJEEERw0AGkEAIAIoAigoAgAoAgQNABogAigCHCACKAIYRgtBAXE2AhAgAigCKCACKAIoKAI4IAIoAigoAlxqIAIoAhwgAigCEBBdIAIoAigiACACKAIcIAAoAlxqNgJcIAIoAigoAgAQHAsgAkECQQAgAigCEBs2AiwLIAIoAiwhACACQTBqJAAgAAuyAgEBfyMAQRBrIgEkACABIAA2AggCQCABKAIIEHgEQCABQX42AgwMAQsgASABKAIIKAIcKAIENgIEIAEoAggoAhwoAggEQCABKAIIKAIoIAEoAggoAhwoAgggASgCCCgCJBEEAAsgASgCCCgCHCgCRARAIAEoAggoAiggASgCCCgCHCgCRCABKAIIKAIkEQQACyABKAIIKAIcKAJABEAgASgCCCgCKCABKAIIKAIcKAJAIAEoAggoAiQRBAALIAEoAggoAhwoAjgEQCABKAIIKAIoIAEoAggoAhwoAjggASgCCCgCJBEEAAsgASgCCCgCKCABKAIIKAIcIAEoAggoAiQRBAAgASgCCEEANgIcIAFBfUEAIAEoAgRB8QBGGzYCDAsgASgCDCEAIAFBEGokACAAC+sXAQJ/IwBB8ABrIgMgADYCbCADIAE2AmggAyACNgJkIANBfzYCXCADIAMoAmgvAQI2AlQgA0EANgJQIANBBzYCTCADQQQ2AkggAygCVEUEQCADQYoBNgJMIANBAzYCSAsgA0EANgJgA0AgAygCYCADKAJkSkUEQCADIAMoAlQ2AlggAyADKAJoIAMoAmBBAWpBAnRqLwECNgJUIAMgAygCUEEBaiIANgJQAkACQCADKAJMIABMDQAgAygCWCADKAJURw0ADAELAkAgAygCUCADKAJISARAA0AgAyADKAJsQfwUaiADKAJYQQJ0ai8BAjYCRAJAIAMoAmwoArwtQRAgAygCRGtKBEAgAyADKAJsQfwUaiADKAJYQQJ0ai8BADYCQCADKAJsIgAgAC8BuC0gAygCQEH//wNxIAMoAmwoArwtdHI7AbgtIAMoAmwvAbgtQf8BcSEBIAMoAmwoAgghAiADKAJsIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAmwvAbgtQQh2IQEgAygCbCgCCCECIAMoAmwiBCgCFCEAIAQgAEEBajYCFCAAIAJqIAE6AAAgAygCbCADKAJAQf//A3FBECADKAJsKAK8LWt1OwG4LSADKAJsIgAgACgCvC0gAygCREEQa2o2ArwtDAELIAMoAmwiACAALwG4LSADKAJsQfwUaiADKAJYQQJ0ai8BACADKAJsKAK8LXRyOwG4LSADKAJsIgAgAygCRCAAKAK8LWo2ArwtCyADIAMoAlBBAWsiADYCUCAADQALDAELAkAgAygCWARAIAMoAlggAygCXEcEQCADIAMoAmxB/BRqIAMoAlhBAnRqLwECNgI8AkAgAygCbCgCvC1BECADKAI8a0oEQCADIAMoAmxB/BRqIAMoAlhBAnRqLwEANgI4IAMoAmwiACAALwG4LSADKAI4Qf//A3EgAygCbCgCvC10cjsBuC0gAygCbC8BuC1B/wFxIQEgAygCbCgCCCECIAMoAmwiBCgCFCEAIAQgAEEBajYCFCAAIAJqIAE6AAAgAygCbC8BuC1BCHYhASADKAJsKAIIIQIgAygCbCIEKAIUIQAgBCAAQQFqNgIUIAAgAmogAToAACADKAJsIAMoAjhB//8DcUEQIAMoAmwoArwta3U7AbgtIAMoAmwiACAAKAK8LSADKAI8QRBrajYCvC0MAQsgAygCbCIAIAAvAbgtIAMoAmxB/BRqIAMoAlhBAnRqLwEAIAMoAmwoArwtdHI7AbgtIAMoAmwiACADKAI8IAAoArwtajYCvC0LIAMgAygCUEEBazYCUAsgAyADKAJsLwG+FTYCNAJAIAMoAmwoArwtQRAgAygCNGtKBEAgAyADKAJsLwG8FTYCMCADKAJsIgAgAC8BuC0gAygCMEH//wNxIAMoAmwoArwtdHI7AbgtIAMoAmwvAbgtQf8BcSEBIAMoAmwoAgghAiADKAJsIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAmwvAbgtQQh2IQEgAygCbCgCCCECIAMoAmwiBCgCFCEAIAQgAEEBajYCFCAAIAJqIAE6AAAgAygCbCADKAIwQf//A3FBECADKAJsKAK8LWt1OwG4LSADKAJsIgAgACgCvC0gAygCNEEQa2o2ArwtDAELIAMoAmwiACAALwG4LSADKAJsLwG8FSADKAJsKAK8LXRyOwG4LSADKAJsIgAgAygCNCAAKAK8LWo2ArwtCyADQQI2AiwCQCADKAJsKAK8LUEQIAMoAixrSgRAIAMgAygCUEEDazYCKCADKAJsIgAgAC8BuC0gAygCKEH//wNxIAMoAmwoArwtdHI7AbgtIAMoAmwvAbgtQf8BcSEBIAMoAmwoAgghAiADKAJsIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAmwvAbgtQQh2IQEgAygCbCgCCCECIAMoAmwiBCgCFCEAIAQgAEEBajYCFCAAIAJqIAE6AAAgAygCbCADKAIoQf//A3FBECADKAJsKAK8LWt1OwG4LSADKAJsIgAgACgCvC0gAygCLEEQa2o2ArwtDAELIAMoAmwiACAALwG4LSADKAJQQQNrQf//A3EgAygCbCgCvC10cjsBuC0gAygCbCIAIAMoAiwgACgCvC1qNgK8LQsMAQsCQCADKAJQQQpMBEAgAyADKAJsLwHCFTYCJAJAIAMoAmwoArwtQRAgAygCJGtKBEAgAyADKAJsLwHAFTYCICADKAJsIgAgAC8BuC0gAygCIEH//wNxIAMoAmwoArwtdHI7AbgtIAMoAmwvAbgtQf8BcSEBIAMoAmwoAgghAiADKAJsIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAmwvAbgtQQh2IQEgAygCbCgCCCECIAMoAmwiBCgCFCEAIAQgAEEBajYCFCAAIAJqIAE6AAAgAygCbCADKAIgQf//A3FBECADKAJsKAK8LWt1OwG4LSADKAJsIgAgACgCvC0gAygCJEEQa2o2ArwtDAELIAMoAmwiACAALwG4LSADKAJsLwHAFSADKAJsKAK8LXRyOwG4LSADKAJsIgAgAygCJCAAKAK8LWo2ArwtCyADQQM2AhwCQCADKAJsKAK8LUEQIAMoAhxrSgRAIAMgAygCUEEDazYCGCADKAJsIgAgAC8BuC0gAygCGEH//wNxIAMoAmwoArwtdHI7AbgtIAMoAmwvAbgtQf8BcSEBIAMoAmwoAgghAiADKAJsIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAmwvAbgtQQh2IQEgAygCbCgCCCECIAMoAmwiBCgCFCEAIAQgAEEBajYCFCAAIAJqIAE6AAAgAygCbCADKAIYQf//A3FBECADKAJsKAK8LWt1OwG4LSADKAJsIgAgACgCvC0gAygCHEEQa2o2ArwtDAELIAMoAmwiACAALwG4LSADKAJQQQNrQf//A3EgAygCbCgCvC10cjsBuC0gAygCbCIAIAMoAhwgACgCvC1qNgK8LQsMAQsgAyADKAJsLwHGFTYCFAJAIAMoAmwoArwtQRAgAygCFGtKBEAgAyADKAJsLwHEFTYCECADKAJsIgAgAC8BuC0gAygCEEH//wNxIAMoAmwoArwtdHI7AbgtIAMoAmwvAbgtQf8BcSEBIAMoAmwoAgghAiADKAJsIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAmwvAbgtQQh2IQEgAygCbCgCCCECIAMoAmwiBCgCFCEAIAQgAEEBajYCFCAAIAJqIAE6AAAgAygCbCADKAIQQf//A3FBECADKAJsKAK8LWt1OwG4LSADKAJsIgAgACgCvC0gAygCFEEQa2o2ArwtDAELIAMoAmwiACAALwG4LSADKAJsLwHEFSADKAJsKAK8LXRyOwG4LSADKAJsIgAgAygCFCAAKAK8LWo2ArwtCyADQQc2AgwCQCADKAJsKAK8LUEQIAMoAgxrSgRAIAMgAygCUEELazYCCCADKAJsIgAgAC8BuC0gAygCCEH//wNxIAMoAmwoArwtdHI7AbgtIAMoAmwvAbgtQf8BcSEBIAMoAmwoAgghAiADKAJsIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAmwvAbgtQQh2IQEgAygCbCgCCCECIAMoAmwiBCgCFCEAIAQgAEEBajYCFCAAIAJqIAE6AAAgAygCbCADKAIIQf//A3FBECADKAJsKAK8LWt1OwG4LSADKAJsIgAgACgCvC0gAygCDEEQa2o2ArwtDAELIAMoAmwiACAALwG4LSADKAJQQQtrQf//A3EgAygCbCgCvC10cjsBuC0gAygCbCIAIAMoAgwgACgCvC1qNgK8LQsLCwsgA0EANgJQIAMgAygCWDYCXAJAIAMoAlRFBEAgA0GKATYCTCADQQM2AkgMAQsCQCADKAJYIAMoAlRGBEAgA0EGNgJMIANBAzYCSAwBCyADQQc2AkwgA0EENgJICwsLIAMgAygCYEEBajYCYAwBCwsLkQQBAX8jAEEwayIDIAA2AiwgAyABNgIoIAMgAjYCJCADQX82AhwgAyADKAIoLwECNgIUIANBADYCECADQQc2AgwgA0EENgIIIAMoAhRFBEAgA0GKATYCDCADQQM2AggLIAMoAiggAygCJEEBakECdGpB//8DOwECIANBADYCIANAIAMoAiAgAygCJEpFBEAgAyADKAIUNgIYIAMgAygCKCADKAIgQQFqQQJ0ai8BAjYCFCADIAMoAhBBAWoiADYCEAJAAkAgAygCDCAATA0AIAMoAhggAygCFEcNAAwBCwJAIAMoAhAgAygCCEgEQCADKAIsQfwUaiADKAIYQQJ0aiIAIAMoAhAgAC8BAGo7AQAMAQsCQCADKAIYBEAgAygCGCADKAIcRwRAIAMoAiwgAygCGEECdGpB/BRqIgAgAC8BAEEBajsBAAsgAygCLCIAIABBvBVqLwEAQQFqOwG8FQwBCwJAIAMoAhBBCkwEQCADKAIsIgAgAEHAFWovAQBBAWo7AcAVDAELIAMoAiwiACAAQcQVai8BAEEBajsBxBULCwsgA0EANgIQIAMgAygCGDYCHAJAIAMoAhRFBEAgA0GKATYCDCADQQM2AggMAQsCQCADKAIYIAMoAhRGBEAgA0EGNgIMIANBAzYCCAwBCyADQQc2AgwgA0EENgIICwsLIAMgAygCIEEBajYCIAwBCwsLpxIBAn8jAEHQAGsiAyAANgJMIAMgATYCSCADIAI2AkQgA0EANgI4IAMoAkwoAqAtBEADQCADIAMoAkwoAqQtIAMoAjhBAXRqLwEANgJAIAMoAkwoApgtIQAgAyADKAI4IgFBAWo2AjggAyAAIAFqLQAANgI8AkAgAygCQEUEQCADIAMoAkggAygCPEECdGovAQI2AiwCQCADKAJMKAK8LUEQIAMoAixrSgRAIAMgAygCSCADKAI8QQJ0ai8BADYCKCADKAJMIgAgAC8BuC0gAygCKEH//wNxIAMoAkwoArwtdHI7AbgtIAMoAkwvAbgtQf8BcSEBIAMoAkwoAgghAiADKAJMIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAkwvAbgtQQh2IQEgAygCTCgCCCECIAMoAkwiBCgCFCEAIAQgAEEBajYCFCAAIAJqIAE6AAAgAygCTCADKAIoQf//A3FBECADKAJMKAK8LWt1OwG4LSADKAJMIgAgACgCvC0gAygCLEEQa2o2ArwtDAELIAMoAkwiACAALwG4LSADKAJIIAMoAjxBAnRqLwEAIAMoAkwoArwtdHI7AbgtIAMoAkwiACADKAIsIAAoArwtajYCvC0LDAELIAMgAygCPC0A0F02AjQgAyADKAJIIAMoAjRBgQJqQQJ0ai8BAjYCJAJAIAMoAkwoArwtQRAgAygCJGtKBEAgAyADKAJIIAMoAjRBgQJqQQJ0ai8BADYCICADKAJMIgAgAC8BuC0gAygCIEH//wNxIAMoAkwoArwtdHI7AbgtIAMoAkwvAbgtQf8BcSEBIAMoAkwoAgghAiADKAJMIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAkwvAbgtQQh2IQEgAygCTCgCCCECIAMoAkwiBCgCFCEAIAQgAEEBajYCFCAAIAJqIAE6AAAgAygCTCADKAIgQf//A3FBECADKAJMKAK8LWt1OwG4LSADKAJMIgAgACgCvC0gAygCJEEQa2o2ArwtDAELIAMoAkwiACAALwG4LSADKAJIIAMoAjRBgQJqQQJ0ai8BACADKAJMKAK8LXRyOwG4LSADKAJMIgAgAygCJCAAKAK8LWo2ArwtCyADIAMoAjRBAnRBkOoAaigCADYCMCADKAIwBEAgAyADKAI8IAMoAjRBAnRBgO0AaigCAGs2AjwgAyADKAIwNgIcAkAgAygCTCgCvC1BECADKAIca0oEQCADIAMoAjw2AhggAygCTCIAIAAvAbgtIAMoAhhB//8DcSADKAJMKAK8LXRyOwG4LSADKAJMLwG4LUH/AXEhASADKAJMKAIIIQIgAygCTCIEKAIUIQAgBCAAQQFqNgIUIAAgAmogAToAACADKAJMLwG4LUEIdiEBIAMoAkwoAgghAiADKAJMIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAkwgAygCGEH//wNxQRAgAygCTCgCvC1rdTsBuC0gAygCTCIAIAAoArwtIAMoAhxBEGtqNgK8LQwBCyADKAJMIgAgAC8BuC0gAygCPEH//wNxIAMoAkwoArwtdHI7AbgtIAMoAkwiACADKAIcIAAoArwtajYCvC0LCyADIAMoAkBBAWs2AkAgAwJ/IAMoAkBBgAJJBEAgAygCQC0A0FkMAQsgAygCQEEHdkGAAmotANBZCzYCNCADIAMoAkQgAygCNEECdGovAQI2AhQCQCADKAJMKAK8LUEQIAMoAhRrSgRAIAMgAygCRCADKAI0QQJ0ai8BADYCECADKAJMIgAgAC8BuC0gAygCEEH//wNxIAMoAkwoArwtdHI7AbgtIAMoAkwvAbgtQf8BcSEBIAMoAkwoAgghAiADKAJMIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAkwvAbgtQQh2IQEgAygCTCgCCCECIAMoAkwiBCgCFCEAIAQgAEEBajYCFCAAIAJqIAE6AAAgAygCTCADKAIQQf//A3FBECADKAJMKAK8LWt1OwG4LSADKAJMIgAgACgCvC0gAygCFEEQa2o2ArwtDAELIAMoAkwiACAALwG4LSADKAJEIAMoAjRBAnRqLwEAIAMoAkwoArwtdHI7AbgtIAMoAkwiACADKAIUIAAoArwtajYCvC0LIAMgAygCNEECdEGQ6wBqKAIANgIwIAMoAjAEQCADIAMoAkAgAygCNEECdEGA7gBqKAIAazYCQCADIAMoAjA2AgwCQCADKAJMKAK8LUEQIAMoAgxrSgRAIAMgAygCQDYCCCADKAJMIgAgAC8BuC0gAygCCEH//wNxIAMoAkwoArwtdHI7AbgtIAMoAkwvAbgtQf8BcSEBIAMoAkwoAgghAiADKAJMIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAkwvAbgtQQh2IQEgAygCTCgCCCECIAMoAkwiBCgCFCEAIAQgAEEBajYCFCAAIAJqIAE6AAAgAygCTCADKAIIQf//A3FBECADKAJMKAK8LWt1OwG4LSADKAJMIgAgACgCvC0gAygCDEEQa2o2ArwtDAELIAMoAkwiACAALwG4LSADKAJAQf//A3EgAygCTCgCvC10cjsBuC0gAygCTCIAIAMoAgwgACgCvC1qNgK8LQsLCyADKAI4IAMoAkwoAqAtSQ0ACwsgAyADKAJILwGCCDYCBAJAIAMoAkwoArwtQRAgAygCBGtKBEAgAyADKAJILwGACDYCACADKAJMIgAgAC8BuC0gAygCAEH//wNxIAMoAkwoArwtdHI7AbgtIAMoAkwvAbgtQf8BcSEBIAMoAkwoAgghAiADKAJMIgQoAhQhACAEIABBAWo2AhQgACACaiABOgAAIAMoAkwvAbgtQQh2IQEgAygCTCgCCCECIAMoAkwiBCgCFCEAIAQgAEEBajYCFCAAIAJqIAE6AAAgAygCTCADKAIAQf//A3FBECADKAJMKAK8LWt1OwG4LSADKAJMIgAgACgCvC0gAygCBEEQa2o2ArwtDAELIAMoAkwiACAALwG4LSADKAJILwGACCADKAJMKAK8LXRyOwG4LSADKAJMIgAgAygCBCAAKAK8LWo2ArwtCwuXAgEEfyMAQRBrIgEgADYCDAJAIAEoAgwoArwtQRBGBEAgASgCDC8BuC1B/wFxIQIgASgCDCgCCCEDIAEoAgwiBCgCFCEAIAQgAEEBajYCFCAAIANqIAI6AAAgASgCDC8BuC1BCHYhAiABKAIMKAIIIQMgASgCDCIEKAIUIQAgBCAAQQFqNgIUIAAgA2ogAjoAACABKAIMQQA7AbgtIAEoAgxBADYCvC0MAQsgASgCDCgCvC1BCE4EQCABKAIMLwG4LSECIAEoAgwoAgghAyABKAIMIgQoAhQhACAEIABBAWo2AhQgACADaiACOgAAIAEoAgwiACAALwG4LUEIdjsBuC0gASgCDCIAIAAoArwtQQhrNgK8LQsLC+8BAQR/IwBBEGsiASAANgIMAkAgASgCDCgCvC1BCEoEQCABKAIMLwG4LUH/AXEhAiABKAIMKAIIIQMgASgCDCIEKAIUIQAgBCAAQQFqNgIUIAAgA2ogAjoAACABKAIMLwG4LUEIdiECIAEoAgwoAgghAyABKAIMIgQoAhQhACAEIABBAWo2AhQgACADaiACOgAADAELIAEoAgwoArwtQQBKBEAgASgCDC8BuC0hAiABKAIMKAIIIQMgASgCDCIEKAIUIQAgBCAAQQFqNgIUIAAgA2ogAjoAAAsLIAEoAgxBADsBuC0gASgCDEEANgK8LQv8AQEBfyMAQRBrIgEgADYCDCABQQA2AggDQCABKAIIQZ4CTkUEQCABKAIMQZQBaiABKAIIQQJ0akEAOwEAIAEgASgCCEEBajYCCAwBCwsgAUEANgIIA0AgASgCCEEeTkUEQCABKAIMQYgTaiABKAIIQQJ0akEAOwEAIAEgASgCCEEBajYCCAwBCwsgAUEANgIIA0AgASgCCEETTkUEQCABKAIMQfwUaiABKAIIQQJ0akEAOwEAIAEgASgCCEEBajYCCAwBCwsgASgCDEEBOwGUCSABKAIMQQA2AqwtIAEoAgxBADYCqC0gASgCDEEANgKwLSABKAIMQQA2AqAtCyIBAX8jAEEQayIBJAAgASAANgIMIAEoAgwQFSABQRBqJAAL6QEBAX8jAEEwayICIAA2AiQgAiABNwMYIAJCADcDECACIAIoAiQpAwhCAX03AwgCQANAIAIpAxAgAikDCFQEQCACIAIpAxAgAikDCCACKQMQfUIBiHw3AwACQCACKAIkKAIEIAIpAwCnQQN0aikDACACKQMYVgRAIAIgAikDAEIBfTcDCAwBCwJAIAIpAwAgAigCJCkDCFIEQCACKAIkKAIEIAIpAwBCAXynQQN0aikDACACKQMYWA0BCyACIAIpAwA3AygMBAsgAiACKQMAQgF8NwMQCwwBCwsgAiACKQMQNwMoCyACKQMoC6cBAQF/IwBBMGsiBCQAIAQgADYCKCAEIAE2AiQgBCACNwMYIAQgAzYCFCAEIAQoAigpAzggBCgCKCkDMCAEKAIkIAQpAxggBCgCFBCIATcDCAJAIAQpAwhCAFMEQCAEQX82AiwMAQsgBCgCKCAEKQMINwM4IAQoAiggBCgCKCkDOBDAASECIAQoAiggAjcDQCAEQQA2AiwLIAQoAiwhACAEQTBqJAAgAAvrAQEBfyMAQSBrIgMkACADIAA2AhggAyABNwMQIAMgAjYCDAJAIAMpAxAgAygCGCkDEFQEQCADQQE6AB8MAQsgAyADKAIYKAIAIAMpAxBCBIanEE4iADYCCCAARQRAIAMoAgxBDkEAEBQgA0EAOgAfDAELIAMoAhggAygCCDYCACADIAMoAhgoAgQgAykDEEIBfEIDhqcQTiIANgIEIABFBEAgAygCDEEOQQAQFCADQQA6AB8MAQsgAygCGCADKAIENgIEIAMoAhggAykDEDcDECADQQE6AB8LIAMtAB9BAXEhACADQSBqJAAgAAvOAgEBfyMAQTBrIgQkACAEIAA2AiggBCABNwMgIAQgAjYCHCAEIAM2AhgCQAJAIAQoAigNACAEKQMgUA0AIAQoAhhBEkEAEBQgBEEANgIsDAELIAQgBCgCKCAEKQMgIAQoAhwgBCgCGBBMIgA2AgwgAEUEQCAEQQA2AiwMAQsgBEEYEBgiADYCFCAARQRAIAQoAhhBDkEAEBQgBCgCDBAyIARBADYCLAwBCyAEKAIUIAQoAgw2AhAgBCgCFEEANgIUQQAQASEAIAQoAhQgADYCDCMAQRBrIgAgBCgCFDYCDCAAKAIMQQA2AgAgACgCDEEANgIEIAAoAgxBADYCCCAEQQIgBCgCFCAEKAIYEIMBIgA2AhAgAEUEQCAEKAIUKAIQEDIgBCgCFBAVIARBADYCLAwBCyAEIAQoAhA2AiwLIAQoAiwhACAEQTBqJAAgAAupAQEBfyMAQTBrIgQkACAEIAA2AiggBCABNwMgIAQgAjYCHCAEIAM2AhgCQCAEKAIoRQRAIAQpAyBCAFIEQCAEKAIYQRJBABAUIARBADYCLAwCCyAEQQBCACAEKAIcIAQoAhgQwwE2AiwMAQsgBCAEKAIoNgIIIAQgBCkDIDcDECAEIARBCGpCASAEKAIcIAQoAhgQwwE2AiwLIAQoAiwhACAEQTBqJAAgAAtGAQF/IwBBIGsiAyQAIAMgADYCHCADIAE3AxAgAyACNgIMIAMoAhwgAykDECADKAIMIAMoAhxBCGoQTSEAIANBIGokACAAC4sMAQZ/IAAgAWohBQJAAkAgACgCBCICQQFxDQAgAkEDcUUNASAAKAIAIgIgAWohAQJAIAAgAmsiAEH4mwEoAgBHBEAgAkH/AU0EQCAAKAIIIgQgAkEDdiICQQN0QYycAWpGGiAAKAIMIgMgBEcNAkHkmwFB5JsBKAIAQX4gAndxNgIADAMLIAAoAhghBgJAIAAgACgCDCIDRwRAIAAoAggiAkH0mwEoAgBJGiACIAM2AgwgAyACNgIIDAELAkAgAEEUaiICKAIAIgQNACAAQRBqIgIoAgAiBA0AQQAhAwwBCwNAIAIhByAEIgNBFGoiAigCACIEDQAgA0EQaiECIAMoAhAiBA0ACyAHQQA2AgALIAZFDQICQCAAIAAoAhwiBEECdEGUngFqIgIoAgBGBEAgAiADNgIAIAMNAUHomwFB6JsBKAIAQX4gBHdxNgIADAQLIAZBEEEUIAYoAhAgAEYbaiADNgIAIANFDQMLIAMgBjYCGCAAKAIQIgIEQCADIAI2AhAgAiADNgIYCyAAKAIUIgJFDQIgAyACNgIUIAIgAzYCGAwCCyAFKAIEIgJBA3FBA0cNAUHsmwEgATYCACAFIAJBfnE2AgQgACABQQFyNgIEIAUgATYCAA8LIAQgAzYCDCADIAQ2AggLAkAgBSgCBCICQQJxRQRAIAVB/JsBKAIARgRAQfybASAANgIAQfCbAUHwmwEoAgAgAWoiATYCACAAIAFBAXI2AgQgAEH4mwEoAgBHDQNB7JsBQQA2AgBB+JsBQQA2AgAPCyAFQfibASgCAEYEQEH4mwEgADYCAEHsmwFB7JsBKAIAIAFqIgE2AgAgACABQQFyNgIEIAAgAWogATYCAA8LIAJBeHEgAWohAQJAIAJB/wFNBEAgBSgCCCIEIAJBA3YiAkEDdEGMnAFqRhogBCAFKAIMIgNGBEBB5JsBQeSbASgCAEF+IAJ3cTYCAAwCCyAEIAM2AgwgAyAENgIIDAELIAUoAhghBgJAIAUgBSgCDCIDRwRAIAUoAggiAkH0mwEoAgBJGiACIAM2AgwgAyACNgIIDAELAkAgBUEUaiIEKAIAIgINACAFQRBqIgQoAgAiAg0AQQAhAwwBCwNAIAQhByACIgNBFGoiBCgCACICDQAgA0EQaiEEIAMoAhAiAg0ACyAHQQA2AgALIAZFDQACQCAFIAUoAhwiBEECdEGUngFqIgIoAgBGBEAgAiADNgIAIAMNAUHomwFB6JsBKAIAQX4gBHdxNgIADAILIAZBEEEUIAYoAhAgBUYbaiADNgIAIANFDQELIAMgBjYCGCAFKAIQIgIEQCADIAI2AhAgAiADNgIYCyAFKAIUIgJFDQAgAyACNgIUIAIgAzYCGAsgACABQQFyNgIEIAAgAWogATYCACAAQfibASgCAEcNAUHsmwEgATYCAA8LIAUgAkF+cTYCBCAAIAFBAXI2AgQgACABaiABNgIACyABQf8BTQRAIAFBA3YiAkEDdEGMnAFqIQECf0HkmwEoAgAiA0EBIAJ0IgJxRQRAQeSbASACIANyNgIAIAEMAQsgASgCCAshAiABIAA2AgggAiAANgIMIAAgATYCDCAAIAI2AggPC0EfIQIgAEIANwIQIAFB////B00EQCABQQh2IgIgAkGA/j9qQRB2QQhxIgR0IgIgAkGA4B9qQRB2QQRxIgN0IgIgAkGAgA9qQRB2QQJxIgJ0QQ92IAMgBHIgAnJrIgJBAXQgASACQRVqdkEBcXJBHGohAgsgACACNgIcIAJBAnRBlJ4BaiEHAkACQEHomwEoAgAiBEEBIAJ0IgNxRQRAQeibASADIARyNgIAIAcgADYCACAAIAc2AhgMAQsgAUEAQRkgAkEBdmsgAkEfRht0IQIgBygCACEDA0AgAyIEKAIEQXhxIAFGDQIgAkEddiEDIAJBAXQhAiAEIANBBHFqIgdBEGooAgAiAw0ACyAHIAA2AhAgACAENgIYCyAAIAA2AgwgACAANgIIDwsgBCgCCCIBIAA2AgwgBCAANgIIIABBADYCGCAAIAQ2AgwgACABNgIICwsGAEG0mwELtQkBAX8jAEHgwABrIgUkACAFIAA2AtRAIAUgATYC0EAgBSACNgLMQCAFIAM3A8BAIAUgBDYCvEAgBSAFKALQQDYCuEACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgBSgCvEAOEQMEAAYBAgUJCgoKCgoKCAoHCgsgBUIANwPYQAwKCyAFIAUoArhAQeQAaiAFKALMQCAFKQPAQBBDNwPYQAwJCyAFKAK4QBAVIAVCADcD2EAMCAsgBSgCuEAoAhAEQCAFIAUoArhAKAIQIAUoArhAKQMYIAUoArhAQeQAahBgIgM3A5hAIANQBEAgBUJ/NwPYQAwJCyAFKAK4QCkDCCAFKAK4QCkDCCAFKQOYQHxWBEAgBSgCuEBB5ABqQRVBABAUIAVCfzcD2EAMCQsgBSgCuEAiACAFKQOYQCAAKQMAfDcDACAFKAK4QCIAIAUpA5hAIAApAwh8NwMIIAUoArhAQQA2AhALIAUoArhALQB4QQFxRQRAIAVCADcDqEADQCAFKQOoQCAFKAK4QCkDAFQEQCAFIAUoArhAKQMAIAUpA6hAfUKAwABWBH5CgMAABSAFKAK4QCkDACAFKQOoQH0LNwOgQCAFIAUoAtRAIAVBEGogBSkDoEAQKyIDNwOwQCADQgBTBEAgBSgCuEBB5ABqIAUoAtRAEBcgBUJ/NwPYQAwLCyAFKQOwQFAEQCAFKAK4QEHkAGpBEUEAEBQgBUJ/NwPYQAwLBSAFIAUpA7BAIAUpA6hAfDcDqEAMAgsACwsLIAUoArhAIAUoArhAKQMANwMgIAVCADcD2EAMBwsgBSkDwEAgBSgCuEApAwggBSgCuEApAyB9VgRAIAUgBSgCuEApAwggBSgCuEApAyB9NwPAQAsgBSkDwEBQBEAgBUIANwPYQAwHCyAFKAK4QC0AeEEBcQRAIAUoAtRAIAUoArhAKQMgQQAQJ0EASARAIAUoArhAQeQAaiAFKALUQBAXIAVCfzcD2EAMCAsLIAUgBSgC1EAgBSgCzEAgBSkDwEAQKyIDNwOwQCADQgBTBEAgBSgCuEBB5ABqQRFBABAUIAVCfzcD2EAMBwsgBSgCuEAiACAFKQOwQCAAKQMgfDcDICAFKQOwQFAEQCAFKAK4QCkDICAFKAK4QCkDCFQEQCAFKAK4QEHkAGpBEUEAEBQgBUJ/NwPYQAwICwsgBSAFKQOwQDcD2EAMBgsgBSAFKAK4QCkDICAFKAK4QCkDAH0gBSgCuEApAwggBSgCuEApAwB9IAUoAsxAIAUpA8BAIAUoArhAQeQAahCIATcDCCAFKQMIQgBTBEAgBUJ/NwPYQAwGCyAFKAK4QCAFKQMIIAUoArhAKQMAfDcDICAFQgA3A9hADAULIAUgBSgCzEA2AgQgBSgCBCAFKAK4QEEoaiAFKAK4QEHkAGoQhAFBAEgEQCAFQn83A9hADAULIAVCADcD2EAMBAsgBSAFKAK4QCwAYKw3A9hADAMLIAUgBSgCuEApA3A3A9hADAILIAUgBSgCuEApAyAgBSgCuEApAwB9NwPYQAwBCyAFKAK4QEHkAGpBHEEAEBQgBUJ/NwPYQAsgBSkD2EAhAyAFQeDAAGokACADCwgAQQFBDBB/CyIBAX8jAEEQayIBIAA2AgwgASgCDCIAIAAoAjBBAWo2AjALBwAgACgCLAsHACAAKAIoCxgBAX8jAEEQayIBIAA2AgwgASgCDEEMagsHACAAKAIYCwcAIAAoAhALBwAgACgCCAtFAEGgmwFCADcDAEGYmwFCADcDAEGQmwFCADcDAEGImwFCADcDAEGAmwFCADcDAEH4mgFCADcDAEHwmgFCADcDAEHwmgELFAAgACABrSACrUIghoQgAyAEEH4LEwEBfiAAEEkiAUIgiKcQACABpwsVACAAIAGtIAKtQiCGhCADIAQQxAELFAAgACABIAKtIAOtQiCGhCAEEH0LrQQBAX8jAEEgayIFJAAgBSAANgIYIAUgAa0gAq1CIIaENwMQIAUgAzYCDCAFIAQ2AggCQAJAIAUpAxAgBSgCGCkDMFQEQCAFKAIIQQlNDQELIAUoAhhBCGpBEkEAEBQgBUF/NgIcDAELIAUoAhgoAhhBAnEEQCAFKAIYQQhqQRlBABAUIAVBfzYCHAwBCwJ/IAUoAgwhASMAQRBrIgAkACAAIAE2AgggAEEBOgAHAkAgACgCCEUEQCAAQQE6AA8MAQsgACAAKAIIIAAtAAdBAXEQswFBAEc6AA8LIAAtAA9BAXEhASAAQRBqJAAgAUULBEAgBSgCGEEIakEQQQAQFCAFQX82AhwMAQsgBSAFKAIYKAJAIAUpAxCnQQR0ajYCBCAFIAUoAgQoAgAEfyAFKAIEKAIAKAIQBUF/CzYCAAJAIAUoAgwgBSgCAEYEQCAFKAIEKAIEBEAgBSgCBCgCBCIAIAAoAgBBfnE2AgAgBSgCBCgCBEEAOwFQIAUoAgQoAgQoAgBFBEAgBSgCBCgCBBA3IAUoAgRBADYCBAsLDAELIAUoAgQoAgRFBEAgBSgCBCgCABBAIQAgBSgCBCAANgIEIABFBEAgBSgCGEEIakEOQQAQFCAFQX82AhwMAwsLIAUoAgQoAgQgBSgCDDYCECAFKAIEKAIEIAUoAgg7AVAgBSgCBCgCBCIAIAAoAgBBAXI2AgALIAVBADYCHAsgBSgCHCEAIAVBIGokACAACxcBAX4gACABIAIQciIDQiCIpxAAIAOnCx8BAX4gACABIAKtIAOtQiCGhBArIgRCIIinEAAgBKcLrgECAX8BfgJ/IwBBIGsiAiAANgIUIAIgATYCEAJAIAIoAhRFBEAgAkJ/NwMYDAELIAIoAhBBCHEEQCACIAIoAhQpAzA3AwgDQCACKQMIQgBSBH8gAigCFCgCQCACKQMIQgF9p0EEdGooAgAFQQELRQRAIAIgAikDCEIBfTcDCAwBCwsgAiACKQMINwMYDAELIAIgAigCFCkDMDcDGAsgAikDGCIDQiCIpwsQACADpwsTACAAIAGtIAKtQiCGhCADEMUBC4gCAgF/AX4CfyMAQSBrIgQkACAEIAA2AhQgBCABNgIQIAQgAq0gA61CIIaENwMIAkAgBCgCFEUEQCAEQn83AxgMAQsgBCgCFCgCBARAIARCfzcDGAwBCyAEKQMIQv///////////wBWBEAgBCgCFEEEakESQQAQFCAEQn83AxgMAQsCQCAEKAIULQAQQQFxRQRAIAQpAwhQRQ0BCyAEQgA3AxgMAQsgBCAEKAIUKAIUIAQoAhAgBCkDCBArIgU3AwAgBUIAUwRAIAQoAhRBBGogBCgCFCgCFBAXIARCfzcDGAwBCyAEIAQpAwA3AxgLIAQpAxghBSAEQSBqJAAgBUIgiKcLEAAgBacLTwEBfyMAQSBrIgQkACAEIAA2AhwgBCABrSACrUIghoQ3AxAgBCADNgIMIAQoAhwgBCkDECAEKAIMIAQoAhwoAhwQrQEhACAEQSBqJAAgAAvZAwEBfyMAQSBrIgUkACAFIAA2AhggBSABrSACrUIghoQ3AxAgBSADNgIMIAUgBDYCCAJAIAUoAhggBSkDEEEAQQAQP0UEQCAFQX82AhwMAQsgBSgCGCgCGEECcQRAIAUoAhhBCGpBGUEAEBQgBUF/NgIcDAELIAUoAhgoAkAgBSkDEKdBBHRqKAIIBEAgBSgCGCgCQCAFKQMQp0EEdGooAgggBSgCDBBnQQBIBEAgBSgCGEEIakEPQQAQFCAFQX82AhwMAgsgBUEANgIcDAELIAUgBSgCGCgCQCAFKQMQp0EEdGo2AgQgBSAFKAIEKAIABH8gBSgCDCAFKAIEKAIAKAIURwVBAQtBAXE2AgACQCAFKAIABEAgBSgCBCgCBEUEQCAFKAIEKAIAEEAhACAFKAIEIAA2AgQgAEUEQCAFKAIYQQhqQQ5BABAUIAVBfzYCHAwECwsgBSgCBCgCBCAFKAIMNgIUIAUoAgQoAgQiACAAKAIAQSByNgIADAELIAUoAgQoAgQEQCAFKAIEKAIEIgAgACgCAEFfcTYCACAFKAIEKAIEKAIARQRAIAUoAgQoAgQQNyAFKAIEQQA2AgQLCwsgBUEANgIcCyAFKAIcIQAgBUEgaiQAIAALFwAgACABrSACrUIghoQgAyAEIAUQmQELEgAgACABrSACrUIghoQgAxAnC48BAgF/AX4CfyMAQSBrIgQkACAEIAA2AhQgBCABNgIQIAQgAjYCDCAEIAM2AggCQAJAIAQoAhAEQCAEKAIMDQELIAQoAhRBCGpBEkEAEBQgBEJ/NwMYDAELIAQgBCgCFCAEKAIQIAQoAgwgBCgCCBCaATcDGAsgBCkDGCEFIARBIGokACAFQiCIpwsQACAFpwuFBQIBfwF+An8jAEEwayIDJAAgAyAANgIkIAMgATYCICADIAI2AhwCQCADKAIkKAIYQQJxBEAgAygCJEEIakEZQQAQFCADQn83AygMAQsgAygCIEUEQCADKAIkQQhqQRJBABAUIANCfzcDKAwBCyADQQA2AgwgAyADKAIgEC42AhggAygCICADKAIYQQFraiwAAEEvRwRAIAMgAygCGEECahAYIgA2AgwgAEUEQCADKAIkQQhqQQ5BABAUIANCfzcDKAwCCwJAAkAgAygCDCIBIAMoAiAiAHNBA3ENACAAQQNxBEADQCABIAAtAAAiAjoAACACRQ0DIAFBAWohASAAQQFqIgBBA3ENAAsLIAAoAgAiAkF/cyACQYGChAhrcUGAgYKEeHENAANAIAEgAjYCACAAKAIEIQIgAUEEaiEBIABBBGohACACQYGChAhrIAJBf3NxQYCBgoR4cUUNAAsLIAEgAC0AACICOgAAIAJFDQADQCABIAAtAAEiAjoAASABQQFqIQEgAEEBaiEAIAINAAsLIAMoAgwgAygCGGpBLzoAACADKAIMIAMoAhhBAWpqQQA6AAALIAMgAygCJEEAQgBBABB9IgA2AgggAEUEQCADKAIMEBUgA0J/NwMoDAELIAMgAygCJAJ/IAMoAgwEQCADKAIMDAELIAMoAiALIAMoAgggAygCHBCaATcDECADKAIMEBUCQCADKQMQQgBTBEAgAygCCBAbDAELIAMoAiQgAykDEEEAQQNBgID8jwQQmQFBAEgEQCADKAIkIAMpAxAQmAEaIANCfzcDKAwCCwsgAyADKQMQNwMoCyADKQMoIQQgA0EwaiQAIARCIIinCxAAIASnCxEAIAAgAa0gAq1CIIaEEJgBCxcAIAAgAa0gAq1CIIaEIAMgBCAFEIoBC38CAX8BfiMAQSBrIgMkACADIAA2AhggAyABNgIUIAMgAjYCECADIAMoAhggAygCFCADKAIQEHIiBDcDCAJAIARCAFMEQCADQQA2AhwMAQsgAyADKAIYIAMpAwggAygCECADKAIYKAIcEK0BNgIcCyADKAIcIQAgA0EgaiQAIAALEAAjACAAa0FwcSIAJAAgAAsGACAAJAALBAAjAAuCAQIBfwF+IwBBIGsiBCQAIAQgADYCGCAEIAE2AhQgBCACNgIQIAQgAzYCDCAEIAQoAhggBCgCFCAEKAIQEHIiBTcDAAJAIAVCAFMEQCAEQX82AhwMAQsgBCAEKAIYIAQpAwAgBCgCECAEKAIMEH42AhwLIAQoAhwhACAEQSBqJAAgAAvQRQMGfwF+AnwjAEHgAGsiASQAIAEgADYCWAJAIAEoAlhFBEAgAUF/NgJcDAELIwBBIGsiACABKAJYNgIcIAAgAUFAazYCGCAAQQA2AhQgAEIANwMAAkAgACgCHC0AKEEBcUUEQCAAKAIcKAIYIAAoAhwoAhRGDQELIABBATYCFAsgAEIANwMIA0AgACkDCCAAKAIcKQMwVARAAkACQCAAKAIcKAJAIAApAwinQQR0aigCCA0AIAAoAhwoAkAgACkDCKdBBHRqLQAMQQFxDQAgACgCHCgCQCAAKQMIp0EEdGooAgRFDQEgACgCHCgCQCAAKQMIp0EEdGooAgQoAgBFDQELIABBATYCFAsgACgCHCgCQCAAKQMIp0EEdGotAAxBAXFFBEAgACAAKQMAQgF8NwMACyAAIAApAwhCAXw3AwgMAQsLIAAoAhgEQCAAKAIYIAApAwA3AwALIAEgACgCFDYCJCABKQNAUARAAkAgASgCWCgCBEEIcUUEQCABKAIkRQ0BCwJ/IAEoAlgoAgAhAiMAQRBrIgAkACAAIAI2AggCQCAAKAIIKAIkQQNGBEAgAEEANgIMDAELIAAoAggoAiAEQCAAKAIIEC9BAEgEQCAAQX82AgwMAgsLIAAoAggoAiQEQCAAKAIIEGILIAAoAghBAEIAQQ8QIEIAUwRAIABBfzYCDAwBCyAAKAIIQQM2AiQgAEEANgIMCyAAKAIMIQIgAEEQaiQAIAJBAEgLBEACQAJ/IwBBEGsiACABKAJYKAIANgIMIwBBEGsiAiAAKAIMQQxqNgIMIAIoAgwoAgBBFkYLBEAjAEEQayIAIAEoAlgoAgA2AgwjAEEQayICIAAoAgxBDGo2AgwgAigCDCgCBEEsRg0BCyABKAJYQQhqIAEoAlgoAgAQFyABQX82AlwMBAsLCyABKAJYEDwgAUEANgJcDAELIAEoAiRFBEAgASgCWBA8IAFBADYCXAwBCyABKQNAIAEoAlgpAzBWBEAgASgCWEEIakEUQQAQFCABQX82AlwMAQsgASABKQNAp0EDdBAYIgA2AiggAEUEQCABQX82AlwMAQsgAUJ/NwM4IAFCADcDSCABQgA3A1ADQCABKQNQIAEoAlgpAzBUBEACQCABKAJYKAJAIAEpA1CnQQR0aigCAEUNAAJAIAEoAlgoAkAgASkDUKdBBHRqKAIIDQAgASgCWCgCQCABKQNQp0EEdGotAAxBAXENACABKAJYKAJAIAEpA1CnQQR0aigCBEUNASABKAJYKAJAIAEpA1CnQQR0aigCBCgCAEUNAQsgAQJ+IAEpAzggASgCWCgCQCABKQNQp0EEdGooAgApA0hUBEAgASkDOAwBCyABKAJYKAJAIAEpA1CnQQR0aigCACkDSAs3AzgLIAEoAlgoAkAgASkDUKdBBHRqLQAMQQFxRQRAIAEpA0ggASkDQFoEQCABKAIoEBUgASgCWEEIakEUQQAQFCABQX82AlwMBAsgASgCKCABKQNIp0EDdGogASkDUDcDACABIAEpA0hCAXw3A0gLIAEgASkDUEIBfDcDUAwBCwsgASkDSCABKQNAVARAIAEoAigQFSABKAJYQQhqQRRBABAUIAFBfzYCXAwBCwJAAn8jAEEQayIAIAEoAlgoAgA2AgwgACgCDCkDGEKAgAiDUAsEQCABQgA3AzgMAQsgASkDOEJ/UQRAIAFCfzcDGCABQgA3AzggAUIANwNQA0AgASkDUCABKAJYKQMwVARAIAEoAlgoAkAgASkDUKdBBHRqKAIABEAgASgCWCgCQCABKQNQp0EEdGooAgApA0ggASkDOFoEQCABIAEoAlgoAkAgASkDUKdBBHRqKAIAKQNINwM4IAEgASkDUDcDGAsLIAEgASkDUEIBfDcDUAwBCwsgASkDGEJ/UgRAIAEoAlghAiABKQMYIQcgASgCWEEIaiEDIwBBMGsiACQAIAAgAjYCJCAAIAc3AxggACADNgIUIAAgACgCJCAAKQMYIAAoAhQQYCIHNwMIAkAgB1AEQCAAQgA3AygMAQsgACAAKAIkKAJAIAApAxinQQR0aigCADYCBAJAIAApAwggACkDCCAAKAIEKQMgfFgEQCAAKQMIIAAoAgQpAyB8Qv///////////wBYDQELIAAoAhRBBEEWEBQgAEIANwMoDAELIAAgACgCBCkDICAAKQMIfDcDCCAAKAIELwEMQQhxBEAgACgCJCgCACAAKQMIQQAQJ0EASARAIAAoAhQgACgCJCgCABAXIABCADcDKAwCCyAAKAIkKAIAIABCBBArQgRSBEAgACgCFCAAKAIkKAIAEBcgAEIANwMoDAILIAAoAABB0JadwABGBEAgACAAKQMIQgR8NwMICyAAIAApAwhCDHw3AwggACgCBEEAEGVBAXEEQCAAIAApAwhCCHw3AwgLIAApAwhC////////////AFYEQCAAKAIUQQRBFhAUIABCADcDKAwCCwsgACAAKQMINwMoCyAAKQMoIQcgAEEwaiQAIAEgBzcDOCAHUARAIAEoAigQFSABQX82AlwMBAsLCyABKQM4QgBSBEACfyABKAJYKAIAIQIgASkDOCEHIwBBEGsiACQAIAAgAjYCCCAAIAc3AwACQCAAKAIIKAIkQQFGBEAgACgCCEEMakESQQAQFCAAQX82AgwMAQsgACgCCEEAIAApAwBBERAgQgBTBEAgAEF/NgIMDAELIAAoAghBATYCJCAAQQA2AgwLIAAoAgwhAiAAQRBqJAAgAkEASAsEQCABQgA3AzgLCwsgASkDOFAEQAJ/IAEoAlgoAgAhAiMAQRBrIgAkACAAIAI2AggCQCAAKAIIKAIkQQFGBEAgACgCCEEMakESQQAQFCAAQX82AgwMAQsgACgCCEEAQgBBCBAgQgBTBEAgAEF/NgIMDAELIAAoAghBATYCJCAAQQA2AgwLIAAoAgwhAiAAQRBqJAAgAkEASAsEQCABKAJYQQhqIAEoAlgoAgAQFyABKAIoEBUgAUF/NgJcDAILCyABKAJYKAJUIQIjAEEQayIAJAAgACACNgIMIAAoAgwEQCAAKAIMRAAAAAAAAAAAOQMYIAAoAgwoAgBEAAAAAAAAAAAgACgCDCgCDCAAKAIMKAIEERYACyAAQRBqJAAgAUEANgIsIAFCADcDSANAAkAgASkDSCABKQNAWg0AIAEoAlgoAlQhAiABKQNIIge6IAEpA0C6IgijIQkjAEEgayIAJAAgACACNgIcIAAgCTkDECAAIAdCAXy6IAijOQMIIAAoAhwEQCAAKAIcIAArAxA5AyAgACgCHCAAKwMIOQMoIAAoAhxEAAAAAAAAAAAQVwsgAEEgaiQAIAEgASgCKCABKQNIp0EDdGopAwA3A1AgASABKAJYKAJAIAEpA1CnQQR0ajYCEAJAAkAgASgCECgCAEUNACABKAIQKAIAKQNIIAEpAzhaDQAMAQsgAQJ/QQEgASgCECgCCA0AGiABKAIQKAIEBEBBASABKAIQKAIEKAIAQQFxDQEaCyABKAIQKAIEBH8gASgCECgCBCgCAEHAAHFBAEcFQQALC0EBcTYCFCABKAIQKAIERQRAIAEoAhAoAgAQQCEAIAEoAhAgADYCBCAARQRAIAEoAlhBCGpBDkEAEBQgAUEBNgIsDAMLCyABIAEoAhAoAgQ2AgwCfyABKAJYIQIgASkDUCEHIwBBMGsiACQAIAAgAjYCKCAAIAc3AyACQCAAKQMgIAAoAigpAzBaBEAgACgCKEEIakESQQAQFCAAQX82AiwMAQsgACAAKAIoKAJAIAApAyCnQQR0ajYCHAJAIAAoAhwoAgAEQCAAKAIcKAIALQAEQQFxRQ0BCyAAQQA2AiwMAQsgACgCHCgCACkDSEIafEL///////////8AVgRAIAAoAihBCGpBBEEWEBQgAEF/NgIsDAELIAAoAigoAgAgACgCHCgCACkDSEIafEEAECdBAEgEQCAAKAIoQQhqIAAoAigoAgAQFyAAQX82AiwMAQsgACAAKAIoKAIAQgQgAEEYaiAAKAIoQQhqEEIiAjYCFCACRQRAIABBfzYCLAwBCyAAIAAoAhQQHTsBEiAAIAAoAhQQHTsBECAAKAIUEEdBAXFFBEAgACgCFBAWIAAoAihBCGpBFEEAEBQgAEF/NgIsDAELIAAoAhQQFiAALwEQBEAgACgCKCgCACAALwESrUEBECdBAEgEQCAAKAIoQQhqQQRBtJsBKAIAEBQgAEF/NgIsDAILIABBACAAKAIoKAIAIAAvARBBACAAKAIoQQhqEGM2AgggACgCCEUEQCAAQX82AiwMAgsgACgCCCAALwEQQYACIABBDGogACgCKEEIahCUAUEBcUUEQCAAKAIIEBUgAEF/NgIsDAILIAAoAggQFSAAKAIMBEAgACAAKAIMEJMBNgIMIAAoAhwoAgAoAjQgACgCDBCVASECIAAoAhwoAgAgAjYCNAsLIAAoAhwoAgBBAToABAJAIAAoAhwoAgRFDQAgACgCHCgCBC0ABEEBcQ0AIAAoAhwoAgQgACgCHCgCACgCNDYCNCAAKAIcKAIEQQE6AAQLIABBADYCLAsgACgCLCECIABBMGokACACQQBICwRAIAFBATYCLAwCCyABIAEoAlgoAgAQNSIHNwMwIAdCAFMEQCABQQE2AiwMAgsgASgCDCABKQMwNwNIAkAgASgCFARAIAFBADYCCCABKAIQKAIIRQRAIAEgASgCWCABKAJYIAEpA1BBCEEAEK4BIgA2AgggAEUEQCABQQE2AiwMBQsLAn8gASgCWCECAn8gASgCCARAIAEoAggMAQsgASgCECgCCAshAyABKAIMIQQjAEGgAWsiACQAIAAgAjYCmAEgACADNgKUASAAIAQ2ApABAkAgACgClAEgAEE4ahA5QQBIBEAgACgCmAFBCGogACgClAEQFyAAQX82ApwBDAELIAApAzhCwACDUARAIAAgACkDOELAAIQ3AzggAEEAOwFoCwJAAkAgACgCkAEoAhBBf0cEQCAAKAKQASgCEEF+Rw0BCyAALwFoRQ0AIAAoApABIAAvAWg2AhAMAQsCQAJAIAAoApABKAIQDQAgACkDOEIEg1ANACAAIAApAzhCCIQ3AzggACAAKQNQNwNYDAELIAAgACkDOEL3////D4M3AzgLCyAAKQM4QoABg1AEQCAAIAApAzhCgAGENwM4IABBADsBagsgAEGAAjYCJAJAIAApAzhCBINQBEAgACAAKAIkQYAIcjYCJCAAQn83A3AMAQsgACgCkAEgACkDUDcDKCAAIAApA1A3A3ACQCAAKQM4QgiDUARAAkACQAJAAkACQAJ/AkAgACgCkAEoAhBBf0cEQCAAKAKQASgCEEF+Rw0BC0EIDAELIAAoApABKAIQC0H//wNxDg0CAwMDAwMDAwEDAwMAAwsgAEKUwuTzDzcDEAwDCyAAQoODsP8PNwMQDAILIABC/////w83AxAMAQsgAEIANwMQCyAAKQNQIAApAxBWBEAgACAAKAIkQYAIcjYCJAsMAQsgACgCkAEgACkDWDcDIAsLIAAgACgCmAEoAgAQNSIHNwOIASAHQgBTBEAgACgCmAFBCGogACgCmAEoAgAQFyAAQX82ApwBDAELIAAoApABIgIgAi8BDEH3/wNxOwEMIAAgACgCmAEgACgCkAEgACgCJBBUIgI2AiggAkEASARAIABBfzYCnAEMAQsgACAALwFoAn8CQCAAKAKQASgCEEF/RwRAIAAoApABKAIQQX5HDQELQQgMAQsgACgCkAEoAhALQf//A3FHOgAiIAAgAC0AIkEBcQR/IAAvAWhBAEcFQQALQQFxOgAhIAAgAC8BaAR/IAAtACEFQQELQQFxOgAgIAAgAC0AIkEBcQR/IAAoApABKAIQQQBHBUEAC0EBcToAHyAAAn9BASAALQAiQQFxDQAaQQEgACgCkAEoAgBBgAFxDQAaIAAoApABLwFSIAAvAWpHC0EBcToAHiAAIAAtAB5BAXEEfyAALwFqQQBHBUEAC0EBcToAHSAAIAAtAB5BAXEEfyAAKAKQAS8BUkEARwVBAAtBAXE6ABwgACAAKAKUATYCNCMAQRBrIgIgACgCNDYCDCACKAIMIgIgAigCMEEBajYCMCAALQAdQQFxBEAgACAALwFqQQAQeyICNgIMIAJFBEAgACgCmAFBCGpBGEEAEBQgACgCNBAbIABBfzYCnAEMAgsgACAAKAKYASAAKAI0IAAvAWpBACAAKAKYASgCHCAAKAIMEQUAIgI2AjAgAkUEQCAAKAI0EBsgAEF/NgKcAQwCCyAAKAI0EBsgACAAKAIwNgI0CyAALQAhQQFxBEAgACAAKAKYASAAKAI0IAAvAWgQsAEiAjYCMCACRQRAIAAoAjQQGyAAQX82ApwBDAILIAAoAjQQGyAAIAAoAjA2AjQLIAAtACBBAXEEQCAAIAAoApgBIAAoAjRBABCvASICNgIwIAJFBEAgACgCNBAbIABBfzYCnAEMAgsgACgCNBAbIAAgACgCMDYCNAsgAC0AH0EBcQRAIAAoApgBIQMgACgCNCEEIAAoApABKAIQIQUgACgCkAEvAVAhBiMAQRBrIgIkACACIAM2AgwgAiAENgIIIAIgBTYCBCACIAY2AgAgAigCDCACKAIIIAIoAgRBASACKAIAELIBIQMgAkEQaiQAIAAgAyICNgIwIAJFBEAgACgCNBAbIABBfzYCnAEMAgsgACgCNBAbIAAgACgCMDYCNAsgAC0AHEEBcQRAIABBADYCBAJAIAAoApABKAJUBEAgACAAKAKQASgCVDYCBAwBCyAAKAKYASgCHARAIAAgACgCmAEoAhw2AgQLCyAAIAAoApABLwFSQQEQeyICNgIIIAJFBEAgACgCmAFBCGpBGEEAEBQgACgCNBAbIABBfzYCnAEMAgsgACAAKAKYASAAKAI0IAAoApABLwFSQQEgACgCBCAAKAIIEQUAIgI2AjAgAkUEQCAAKAI0EBsgAEF/NgKcAQwCCyAAKAI0EBsgACAAKAIwNgI0CyAAIAAoApgBKAIAEDUiBzcDgAEgB0IAUwRAIAAoApgBQQhqIAAoApgBKAIAEBcgAEF/NgKcAQwBCyAAKAKYASEDIAAoAjQhBCAAKQNwIQcjAEHAwABrIgIkACACIAM2ArhAIAIgBDYCtEAgAiAHNwOoQAJAIAIoArRAEEhBAEgEQCACKAK4QEEIaiACKAK0QBAXIAJBfzYCvEAMAQsgAkEANgIMIAJCADcDEANAAkAgAiACKAK0QCACQSBqQoDAABArIgc3AxggB0IAVw0AIAIoArhAIAJBIGogAikDGBA2QQBIBEAgAkF/NgIMBSACKQMYQoDAAFINAiACKAK4QCgCVEUNAiACKQOoQEIAVw0CIAIgAikDGCACKQMQfDcDECACKAK4QCgCVCACKQMQuSACKQOoQLmjEFcMAgsLCyACKQMYQgBTBEAgAigCuEBBCGogAigCtEAQFyACQX82AgwLIAIoArRAEC8aIAIgAigCDDYCvEALIAIoArxAIQMgAkHAwABqJAAgACADNgIsIAAoAjQgAEE4ahA5QQBIBEAgACgCmAFBCGogACgCNBAXIABBfzYCLAsgACgCNCEDIwBBEGsiAiQAIAIgAzYCCAJAA0AgAigCCARAIAIoAggpAxhCgIAEg0IAUgRAIAIgAigCCEEAQgBBEBAgNwMAIAIpAwBCAFMEQCACQf8BOgAPDAQLIAIpAwBCA1UEQCACKAIIQQxqQRRBABAUIAJB/wE6AA8MBAsgAiACKQMAPAAPDAMFIAIgAigCCCgCADYCCAwCCwALCyACQQA6AA8LIAIsAA8hAyACQRBqJAAgACADIgI6ACMgAkEYdEEYdUEASARAIAAoApgBQQhqIAAoAjQQFyAAQX82AiwLIAAoAjQQGyAAKAIsQQBIBEAgAEF/NgKcAQwBCyAAIAAoApgBKAIAEDUiBzcDeCAHQgBTBEAgACgCmAFBCGogACgCmAEoAgAQFyAAQX82ApwBDAELIAAoApgBKAIAIAApA4gBEJsBQQBIBEAgACgCmAFBCGogACgCmAEoAgAQFyAAQX82ApwBDAELIAApAzhC5ACDQuQAUgRAIAAoApgBQQhqQRRBABAUIABBfzYCnAEMAQsgACgCkAEoAgBBIHFFBEACQCAAKQM4QhCDQgBSBEAgACgCkAEgACgCYDYCFAwBCyAAKAKQAUEUahABGgsLIAAoApABIAAvAWg2AhAgACgCkAEgACgCZDYCGCAAKAKQASAAKQNQNwMoIAAoApABIAApA3ggACkDgAF9NwMgIAAoApABIAAoApABLwEMQfn/A3EgAC0AI0EBdHI7AQwgACgCkAEhAyAAKAIkQYAIcUEARyEEIwBBEGsiAiQAIAIgAzYCDCACIAQ6AAsCQCACKAIMKAIQQQ5GBEAgAigCDEE/OwEKDAELIAIoAgwoAhBBDEYEQCACKAIMQS47AQoMAQsCQCACLQALQQFxRQRAIAIoAgxBABBlQQFxRQ0BCyACKAIMQS07AQoMAQsCQCACKAIMKAIQQQhHBEAgAigCDC8BUkEBRw0BCyACKAIMQRQ7AQoMAQsgAiACKAIMKAIwEFEiAzsBCCADQf//A3EEQCACKAIMKAIwKAIAIAIvAQhBAWtqLQAAQS9GBEAgAigCDEEUOwEKDAILCyACKAIMQQo7AQoLIAJBEGokACAAIAAoApgBIAAoApABIAAoAiQQVCICNgIsIAJBAEgEQCAAQX82ApwBDAELIAAoAiggACgCLEcEQCAAKAKYAUEIakEUQQAQFCAAQX82ApwBDAELIAAoApgBKAIAIAApA3gQmwFBAEgEQCAAKAKYAUEIaiAAKAKYASgCABAXIABBfzYCnAEMAQsgAEEANgKcAQsgACgCnAEhAiAAQaABaiQAIAJBAEgLBEAgAUEBNgIsIAEoAggEQCABKAIIEBsLDAQLIAEoAggEQCABKAIIEBsLDAELIAEoAgwiACAALwEMQff/A3E7AQwgASgCWCABKAIMQYACEFRBAEgEQCABQQE2AiwMAwsgASABKAJYIAEpA1AgASgCWEEIahBgIgc3AwAgB1AEQCABQQE2AiwMAwsgASgCWCgCACABKQMAQQAQJ0EASARAIAEoAlhBCGogASgCWCgCABAXIAFBATYCLAwDCwJ/IAEoAlghAiABKAIMKQMgIQcjAEGgwABrIgAkACAAIAI2AphAIAAgBzcDkEAgACAAKQOQQLo5AwACQANAIAApA5BAUEUEQCAAIAApA5BAQoDAAFYEfkKAwAAFIAApA5BACz4CDCAAKAKYQCgCACAAQRBqIAAoAgytIAAoAphAQQhqEGRBAEgEQCAAQX82ApxADAMLIAAoAphAIABBEGogACgCDK0QNkEASARAIABBfzYCnEAMAwUgACAAKQOQQCAANQIMfTcDkEAgACgCmEAoAlQgACsDACAAKQOQQLqhIAArAwCjEFcMAgsACwsgAEEANgKcQAsgACgCnEAhAiAAQaDAAGokACACQQBICwRAIAFBATYCLAwDCwsLIAEgASkDSEIBfDcDSAwBCwsgASgCLEUEQAJ/IAEoAlghACABKAIoIQMgASkDQCEHIwBBMGsiAiQAIAIgADYCKCACIAM2AiQgAiAHNwMYIAIgAigCKCgCABA1Igc3AxACQCAHQgBTBEAgAkF/NgIsDAELIAIoAighAyACKAIkIQQgAikDGCEHIwBBwAFrIgAkACAAIAM2ArQBIAAgBDYCsAEgACAHNwOoASAAIAAoArQBKAIAEDUiBzcDIAJAIAdCAFMEQCAAKAK0AUEIaiAAKAK0ASgCABAXIABCfzcDuAEMAQsgACAAKQMgNwOgASAAQQA6ABcgAEIANwMYA0AgACkDGCAAKQOoAVQEQCAAIAAoArQBKAJAIAAoArABIAApAxinQQN0aikDAKdBBHRqNgIMIAAgACgCtAECfyAAKAIMKAIEBEAgACgCDCgCBAwBCyAAKAIMKAIAC0GABBBUIgM2AhAgA0EASARAIABCfzcDuAEMAwsgACgCEARAIABBAToAFwsgACAAKQMYQgF8NwMYDAELCyAAIAAoArQBKAIAEDUiBzcDICAHQgBTBEAgACgCtAFBCGogACgCtAEoAgAQFyAAQn83A7gBDAELIAAgACkDICAAKQOgAX03A5gBAkAgACkDoAFC/////w9YBEAgACkDqAFC//8DWA0BCyAAQQE6ABcLIAAgAEEwakLiABApIgM2AiwgA0UEQCAAKAK0AUEIakEOQQAQFCAAQn83A7gBDAELIAAtABdBAXEEQCAAKAIsQecSQQQQQSAAKAIsQiwQLSAAKAIsQS0QHyAAKAIsQS0QHyAAKAIsQQAQISAAKAIsQQAQISAAKAIsIAApA6gBEC0gACgCLCAAKQOoARAtIAAoAiwgACkDmAEQLSAAKAIsIAApA6ABEC0gACgCLEHiEkEEEEEgACgCLEEAECEgACgCLCAAKQOgASAAKQOYAXwQLSAAKAIsQQEQIQsgACgCLEHsEkEEEEEgACgCLEEAECEgACgCLCAAKQOoAUL//wNaBH5C//8DBSAAKQOoAQunQf//A3EQHyAAKAIsIAApA6gBQv//A1oEfkL//wMFIAApA6gBC6dB//8DcRAfIAAoAiwgACkDmAFC/////w9aBH9BfwUgACkDmAGnCxAhIAAoAiwgACkDoAFC/////w9aBH9BfwUgACkDoAGnCxAhIAACfyAAKAK0AS0AKEEBcQRAIAAoArQBKAIkDAELIAAoArQBKAIgCzYClAEgACgCLAJ/IAAoApQBBEAgACgClAEvAQQMAQtBAAtB//8DcRAfAn8jAEEQayIDIAAoAiw2AgwgAygCDC0AAEEBcUULBEAgACgCtAFBCGpBFEEAEBQgACgCLBAWIABCfzcDuAEMAQsgACgCtAECfyMAQRBrIgMgACgCLDYCDCADKAIMKAIECwJ+IwBBEGsiAyAAKAIsNgIMAn4gAygCDC0AAEEBcQRAIAMoAgwpAxAMAQtCAAsLEDZBAEgEQCAAKAIsEBYgAEJ/NwO4AQwBCyAAKAIsEBYgACgClAEEQCAAKAK0ASAAKAKUASgCACAAKAKUAS8BBK0QNkEASARAIABCfzcDuAEMAgsLIAAgACkDmAE3A7gBCyAAKQO4ASEHIABBwAFqJAAgAiAHNwMAIAdCAFMEQCACQX82AiwMAQsgAiACKAIoKAIAEDUiBzcDCCAHQgBTBEAgAkF/NgIsDAELIAJBADYCLAsgAigCLCEAIAJBMGokACAAQQBICwRAIAFBATYCLAsLIAEoAigQFSABKAIsRQRAAn8gASgCWCgCACECIwBBEGsiACQAIAAgAjYCCAJAIAAoAggoAiRBAUcEQCAAKAIIQQxqQRJBABAUIABBfzYCDAwBCyAAKAIIKAIgQQFLBEAgACgCCEEMakEdQQAQFCAAQX82AgwMAQsgACgCCCgCIARAIAAoAggQL0EASARAIABBfzYCDAwCCwsgACgCCEEAQgBBCRAgQgBTBEAgACgCCEECNgIkIABBfzYCDAwBCyAAKAIIQQA2AiQgAEEANgIMCyAAKAIMIQIgAEEQaiQAIAILBEAgASgCWEEIaiABKAJYKAIAEBcgAUEBNgIsCwsgASgCWCgCVCECIwBBEGsiACQAIAAgAjYCDCAAKAIMRAAAAAAAAPA/EFcgAEEQaiQAIAEoAiwEQCABKAJYKAIAEGIgAUF/NgJcDAELIAEoAlgQPCABQQA2AlwLIAEoAlwhACABQeAAaiQAIAAL0g4CB38CfiMAQTBrIgMkACADIAA2AiggAyABNgIkIAMgAjYCICMAQRBrIgAgA0EIajYCDCAAKAIMQQA2AgAgACgCDEEANgIEIAAoAgxBADYCCCADKAIoIQAjAEEgayIEJAAgBCAANgIYIARCADcDECAEQn83AwggBCADQQhqNgIEAkACQCAEKAIYBEAgBCkDCEJ/WQ0BCyAEKAIEQRJBABAUIARBADYCHAwBCyAEKAIYIQAgBCkDECEKIAQpAwghCyAEKAIEIQEjAEGgAWsiAiQAIAIgADYCmAEgAkEANgKUASACIAo3A4gBIAIgCzcDgAEgAkEANgJ8IAIgATYCeAJAAkAgAigClAENACACKAKYAQ0AIAIoAnhBEkEAEBQgAkEANgKcAQwBCyACKQOAAUIAUwRAIAJCADcDgAELAkAgAikDiAFC////////////AFgEQCACKQOIASACKQOIASACKQOAAXxYDQELIAIoAnhBEkEAEBQgAkEANgKcAQwBCyACQYgBEBgiADYCdCAARQRAIAIoAnhBDkEAEBQgAkEANgKcAQwBCyACKAJ0QQA2AhggAigCmAEEQCACKAKYASIAEC5BAWoiARAYIgUEfyAFIAAgARAZBUEACyEAIAIoAnQgADYCGCAARQRAIAIoAnhBDkEAEBQgAigCdBAVIAJBADYCnAEMAgsLIAIoAnQgAigClAE2AhwgAigCdCACKQOIATcDaCACKAJ0IAIpA4ABNwNwAkAgAigCfARAIAIoAnQiACACKAJ8IgEpAwA3AyAgACABKQMwNwNQIAAgASkDKDcDSCAAIAEpAyA3A0AgACABKQMYNwM4IAAgASkDEDcDMCAAIAEpAwg3AyggAigCdEEANgIoIAIoAnQiACAAKQMgQv7///8PgzcDIAwBCyACKAJ0QSBqEDsLIAIoAnQpA3BCAFIEQCACKAJ0IAIoAnQpA3A3AzggAigCdCIAIAApAyBCBIQ3AyALIwBBEGsiACACKAJ0QdgAajYCDCAAKAIMQQA2AgAgACgCDEEANgIEIAAoAgxBADYCCCACKAJ0QQA2AoABIAIoAnRBADYChAEjAEEQayIAIAIoAnQ2AgwgACgCDEEANgIAIAAoAgxBADYCBCAAKAIMQQA2AgggAkF/NgIEIAJBBzYCAEEOIAIQNEI/hCEKIAIoAnQgCjcDEAJAIAIoAnQoAhgEQCACIAIoAnQoAhggAkEYahCmAUEATjoAFyACLQAXQQFxRQRAAkAgAigCdCkDaFBFDQAgAigCdCkDcFBFDQAgAigCdEL//wM3AxALCwwBCwJAIAIoAnQoAhwiACgCTEEASA0ACyAAKAI8IQBBACEFIwBBIGsiBiQAAn8CQCAAIAJBGGoiCRAKIgFBeEYEQCMAQSBrIgckACAAIAdBCGoQCSIIBH9BtJsBIAg2AgBBAAVBAQshCCAHQSBqJAAgCA0BCyABQYFgTwR/QbSbAUEAIAFrNgIAQX8FIAELDAELA0AgBSAGaiIBIAVBxxJqLQAAOgAAIAVBDkchByAFQQFqIQUgBw0ACwJAIAAEQEEPIQUgACEBA0AgAUEKTwRAIAVBAWohBSABQQpuIQEMAQsLIAUgBmpBADoAAANAIAYgBUEBayIFaiAAIABBCm4iAUEKbGtBMHI6AAAgAEEJSyEHIAEhACAHDQALDAELIAFBMDoAACAGQQA6AA8LIAYgCRACIgBBgWBPBH9BtJsBQQAgAGs2AgBBfwUgAAsLIQAgBkEgaiQAIAIgAEEATjoAFwsCQCACLQAXQQFxRQRAIAIoAnRB2ABqQQVBtJsBKAIAEBQMAQsgAigCdCkDIEIQg1AEQCACKAJ0IAIoAlg2AkggAigCdCIAIAApAyBCEIQ3AyALIAIoAiRBgOADcUGAgAJGBEAgAigCdEL/gQE3AxAgAikDQCACKAJ0KQNoIAIoAnQpA3B8VARAIAIoAnhBEkEAEBQgAigCdCgCGBAVIAIoAnQQFSACQQA2ApwBDAMLIAIoAnQpA3BQBEAgAigCdCACKQNAIAIoAnQpA2h9NwM4IAIoAnQiACAAKQMgQgSENwMgAkAgAigCdCgCGEUNACACKQOIAVBFDQAgAigCdEL//wM3AxALCwsLIAIoAnQiACAAKQMQQoCAEIQ3AxAgAkEeIAIoAnQgAigCeBCDASIANgJwIABFBEAgAigCdCgCGBAVIAIoAnQQFSACQQA2ApwBDAELIAIgAigCcDYCnAELIAIoApwBIQAgAkGgAWokACAEIAA2AhwLIAQoAhwhACAEQSBqJAAgAyAANgIYAkAgAEUEQCADKAIgIANBCGoQnQEgA0EIahA4IANBADYCLAwBCyADIAMoAhggAygCJCADQQhqEJwBIgA2AhwgAEUEQCADKAIYEBsgAygCICADQQhqEJ0BIANBCGoQOCADQQA2AiwMAQsgA0EIahA4IAMgAygCHDYCLAsgAygCLCEAIANBMGokACAAC5IfAQZ/IwBB4ABrIgQkACAEIAA2AlQgBCABNgJQIAQgAjcDSCAEIAM2AkQgBCAEKAJUNgJAIAQgBCgCUDYCPAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAQoAkQOEwYHAgwEBQoOAQMJEAsPDQgREQARCyAEQgA3A1gMEQsgBCgCQCgCGEUEQCAEKAJAQRxBABAUIARCfzcDWAwRCyAEKAJAIQAjAEGAAWsiASQAIAEgADYCeCABIAEoAngoAhgQLkEIahAYIgA2AnQCQCAARQRAIAEoAnhBDkEAEBQgAUF/NgJ8DAELAkAgASgCeCgCGCABQRBqEKYBRQRAIAEgASgCHDYCbAwBCyABQX82AmwLIAEoAnQhACABIAEoAngoAhg2AgAgAEGrEiABEG8gASgCdCEDIAEoAmwhByMAQTBrIgAkACAAIAM2AiggACAHNgIkIABBADYCECAAIAAoAiggACgCKBAuajYCGCAAIAAoAhhBAWs2AhwDQCAAKAIcIAAoAihPBH8gACgCHCwAAEHYAEYFQQALQQFxBEAgACAAKAIQQQFqNgIQIAAgACgCHEEBazYCHAwBCwsCQCAAKAIQRQRAQbSbAUEcNgIAIABBfzYCLAwBCyAAIAAoAhxBAWo2AhwDQCMAQRBrIgckAAJAAn8jAEEQayIDJAAgAyAHQQhqNgIIIANBBDsBBiADQegLQQBBABBsIgU2AgACQCAFQQBIBEAgA0EAOgAPDAELAn8gAygCACEGIAMoAgghCCADLwEGIQkjAEEQayIFJAAgBSAJNgIMIAUgCDYCCCAGIAVBCGpBASAFQQRqEAYiBgR/QbSbASAGNgIAQX8FQQALIQYgBSgCBCEIIAVBEGokACADLwEGQX8gCCAGG0cLBEAgAygCABBrIANBADoADwwBCyADKAIAEGsgA0EBOgAPCyADLQAPQQFxIQUgA0EQaiQAIAULBEAgByAHKAIINgIMDAELQcCgAS0AAEEBcUUEQEEAEAEhBgJAQciZASgCACIDRQRAQcyZASgCACAGNgIADAELQdCZAUEDQQNBASADQQdGGyADQR9GGzYCAEG8oAFBADYCAEHMmQEoAgAhBSADQQFOBEAgBq0hAkEAIQYDQCAFIAZBAnRqIAJCrf7V5NSF/ajYAH5CAXwiAkIgiD4CACAGQQFqIgYgA0cNAAsLIAUgBSgCAEEBcjYCAAsLQcyZASgCACEDAkBByJkBKAIAIgVFBEAgAyADKAIAQe2cmY4EbEG54ABqQf////8HcSIDNgIADAELIANB0JkBKAIAIgZBAnRqIgggCCgCACADQbygASgCACIIQQJ0aigCAGoiAzYCAEG8oAFBACAIQQFqIgggBSAIRhs2AgBB0JkBQQAgBkEBaiIGIAUgBkYbNgIAIANBAXYhAwsgByADNgIMCyAHKAIMIQMgB0EQaiQAIAAgAzYCDCAAIAAoAhw2AhQDQCAAKAIUIAAoAhhJBEAgACAAKAIMQSRwOgALAn8gACwAC0EKSARAIAAsAAtBMGoMAQsgACwAC0HXAGoLIQMgACAAKAIUIgdBAWo2AhQgByADOgAAIAAgACgCDEEkbjYCDAwBCwsgACgCKCEDIAAgACgCJEF/RgR/QbYDBSAAKAIkCzYCACAAIANBwoEgIAAQbCIDNgIgIANBAE4EQCAAKAIkQX9HBEAgACgCKCAAKAIkEA8iA0GBYE8Ef0G0mwFBACADazYCAEEABSADCxoLIAAgACgCIDYCLAwCC0G0mwEoAgBBFEYNAAsgAEF/NgIsCyAAKAIsIQMgAEEwaiQAIAEgAyIANgJwIABBf0YEQCABKAJ4QQxBtJsBKAIAEBQgASgCdBAVIAFBfzYCfAwBCyABIAEoAnBBoxIQoQEiADYCaCAARQRAIAEoAnhBDEG0mwEoAgAQFCABKAJwEGsgASgCdBBtGiABKAJ0EBUgAUF/NgJ8DAELIAEoAnggASgCaDYChAEgASgCeCABKAJ0NgKAASABQQA2AnwLIAEoAnwhACABQYABaiQAIAQgAKw3A1gMEAsgBCgCQCgCGARAIAQoAkAoAhwQVhogBCgCQEEANgIcCyAEQgA3A1gMDwsgBCgCQCgChAEQVkEASARAIAQoAkBBADYChAEgBCgCQEEGQbSbASgCABAUCyAEKAJAQQA2AoQBIAQoAkAoAoABIAQoAkAoAhgQCCIAQYFgTwR/QbSbAUEAIABrNgIAQX8FIAALQQBIBEAgBCgCQEECQbSbASgCABAUIARCfzcDWAwPCyAEKAJAKAKAARAVIAQoAkBBADYCgAEgBEIANwNYDA4LIAQgBCgCQCAEKAJQIAQpA0gQQzcDWAwNCyAEKAJAKAIYEBUgBCgCQCgCgAEQFSAEKAJAKAIcBEAgBCgCQCgCHBBWGgsgBCgCQBAVIARCADcDWAwMCyAEKAJAKAIYBEAgBCgCQCgCGCEBIwBBIGsiACQAIAAgATYCGCAAQQA6ABcgAEGAgCA2AgwCQCAALQAXQQFxBEAgACAAKAIMQQJyNgIMDAELIAAgACgCDDYCDAsgACgCGCEBIAAoAgwhAyAAQbYDNgIAIAAgASADIAAQbCIBNgIQAkAgAUEASARAIABBADYCHAwBCyAAIAAoAhBBoxJBoBIgAC0AF0EBcRsQoQEiATYCCCABRQRAIABBADYCHAwBCyAAIAAoAgg2AhwLIAAoAhwhASAAQSBqJAAgBCgCQCABNgIcIAFFBEAgBCgCQEELQbSbASgCABAUIARCfzcDWAwNCwsgBCgCQCkDaEIAUgRAIAQoAkAoAhwgBCgCQCkDaCAEKAJAEJ8BQQBIBEAgBEJ/NwNYDA0LCyAEKAJAQgA3A3ggBEIANwNYDAsLAkAgBCgCQCkDcEIAUgRAIAQgBCgCQCkDcCAEKAJAKQN4fTcDMCAEKQMwIAQpA0hWBEAgBCAEKQNINwMwCwwBCyAEIAQpA0g3AzALIAQpAzBC/////w9WBEAgBEL/////DzcDMAsgBAJ/IAQoAjwhByAEKQMwpyEAIAQoAkAoAhwiAygCTBogAyADLQBKIgFBAWsgAXI6AEogAygCCCADKAIEIgVrIgFBAUgEfyAABSAHIAUgASAAIAAgAUsbIgEQGRogAyADKAIEIAFqNgIEIAEgB2ohByAAIAFrCyIBBEADQAJAAn8gAyADLQBKIgVBAWsgBXI6AEogAygCFCADKAIcSwRAIANBAEEAIAMoAiQRAQAaCyADQQA2AhwgA0IANwMQIAMoAgAiBUEEcQRAIAMgBUEgcjYCAEF/DAELIAMgAygCLCADKAIwaiIGNgIIIAMgBjYCBCAFQRt0QR91C0UEQCADIAcgASADKAIgEQEAIgVBAWpBAUsNAQsgACABawwDCyAFIAdqIQcgASAFayIBDQALCyAACyIANgIsIABFBEACfyAEKAJAKAIcIgAoAkxBf0wEQCAAKAIADAELIAAoAgALQQV2QQFxBEAgBCgCQEEFQbSbASgCABAUIARCfzcDWAwMCwsgBCgCQCIAIAApA3ggBCgCLK18NwN4IAQgBCgCLK03A1gMCgsgBCgCQCgCGBBtQQBIBEAgBCgCQEEWQbSbASgCABAUIARCfzcDWAwKCyAEQgA3A1gMCQsgBCgCQCgChAEEQCAEKAJAKAKEARBWGiAEKAJAQQA2AoQBCyAEKAJAKAKAARBtGiAEKAJAKAKAARAVIAQoAkBBADYCgAEgBEIANwNYDAgLIAQCfyAEKQNIQhBUBEAgBCgCQEESQQAQFEEADAELIAQoAlALNgIYIAQoAhhFBEAgBEJ/NwNYDAgLIARBATYCHAJAAkACQAJAAkAgBCgCGCgCCA4DAAIBAwsgBCAEKAIYKQMANwMgDAMLAkAgBCgCQCkDcFAEQCAEKAJAKAIcIAQoAhgpAwBBAiAEKAJAEGpBAEgEQCAEQn83A1gMDQsgBCAEKAJAKAIcEKMBIgI3AyAgAkIAUwRAIAQoAkBBBEG0mwEoAgAQFCAEQn83A1gMDQsgBCAEKQMgIAQoAkApA2h9NwMgIARBADYCHAwBCyAEIAQoAkApA3AgBCgCGCkDAHw3AyALDAILIAQgBCgCQCkDeCAEKAIYKQMAfDcDIAwBCyAEKAJAQRJBABAUIARCfzcDWAwICwJAAkAgBCkDIEIAUw0AIAQoAkApA3BCAFIEQCAEKQMgIAQoAkApA3BWDQELIAQoAkApA2ggBCkDICAEKAJAKQNofFgNAQsgBCgCQEESQQAQFCAEQn83A1gMCAsgBCgCQCAEKQMgNwN4IAQoAhwEQCAEKAJAKAIcIAQoAkApA3ggBCgCQCkDaHwgBCgCQBCfAUEASARAIARCfzcDWAwJCwsgBEIANwNYDAcLIAQCfyAEKQNIQhBUBEAgBCgCQEESQQAQFEEADAELIAQoAlALNgIUIAQoAhRFBEAgBEJ/NwNYDAcLIAQoAkAoAoQBIAQoAhQpAwAgBCgCFCgCCCAEKAJAEGpBAEgEQCAEQn83A1gMBwsgBEIANwNYDAYLIAQpA0hCOFQEQCAEQn83A1gMBgsCfyMAQRBrIgAgBCgCQEHYAGo2AgwgACgCDCgCAAsEQCAEKAJAAn8jAEEQayIAIAQoAkBB2ABqNgIMIAAoAgwoAgALAn8jAEEQayIAIAQoAkBB2ABqNgIMIAAoAgwoAgQLEBQgBEJ/NwNYDAYLIAQoAlAiACAEKAJAIgEpACA3AAAgACABKQBQNwAwIAAgASkASDcAKCAAIAEpAEA3ACAgACABKQA4NwAYIAAgASkAMDcAECAAIAEpACg3AAggBEI4NwNYDAULIAQgBCgCQCkDEDcDWAwECyAEIAQoAkApA3g3A1gMAwsgBCAEKAJAKAKEARCjATcDCCAEKQMIQgBTBEAgBCgCQEEeQbSbASgCABAUIARCfzcDWAwDCyAEIAQpAwg3A1gMAgsgBCgCQCgChAEiACgCTEEAThogACAAKAIAQU9xNgIAIAQCfyAEKAJQIQEgBCkDSKciACAAAn8gBCgCQCgChAEiAygCTEF/TARAIAEgACADEHEMAQsgASAAIAMQcQsiAUYNABogAQs2AgQCQCAEKQNIIAQoAgStUQRAAn8gBCgCQCgChAEiACgCTEF/TARAIAAoAgAMAQsgACgCAAtBBXZBAXFFDQELIAQoAkBBBkG0mwEoAgAQFCAEQn83A1gMAgsgBCAEKAIErTcDWAwBCyAEKAJAQRxBABAUIARCfzcDWAsgBCkDWCECIARB4ABqJAAgAgsJACAAKAI8EAUL5AEBBH8jAEEgayIDJAAgAyABNgIQIAMgAiAAKAIwIgRBAEdrNgIUIAAoAiwhBSADIAQ2AhwgAyAFNgIYQX8hBAJAAkAgACgCPCADQRBqQQIgA0EMahAGIgUEf0G0mwEgBTYCAEF/BUEAC0UEQCADKAIMIgRBAEoNAQsgACAAKAIAIARBMHFBEHNyNgIADAELIAQgAygCFCIGTQ0AIAAgACgCLCIFNgIEIAAgBSAEIAZrajYCCCAAKAIwBEAgACAFQQFqNgIEIAEgAmpBAWsgBS0AADoAAAsgAiEECyADQSBqJAAgBAv0AgEHfyMAQSBrIgMkACADIAAoAhwiBTYCECAAKAIUIQQgAyACNgIcIAMgATYCGCADIAQgBWsiATYCFCABIAJqIQVBAiEHIANBEGohAQJ/AkACQCAAKAI8IANBEGpBAiADQQxqEAMiBAR/QbSbASAENgIAQX8FQQALRQRAA0AgBSADKAIMIgRGDQIgBEF/TA0DIAEgBCABKAIEIghLIgZBA3RqIgkgBCAIQQAgBhtrIgggCSgCAGo2AgAgAUEMQQQgBhtqIgkgCSgCACAIazYCACAFIARrIQUgACgCPCABQQhqIAEgBhsiASAHIAZrIgcgA0EMahADIgQEf0G0mwEgBDYCAEF/BUEAC0UNAAsLIAVBf0cNAQsgACAAKAIsIgE2AhwgACABNgIUIAAgASAAKAIwajYCECACDAELIABBADYCHCAAQgA3AxAgACAAKAIAQSByNgIAQQAgB0ECRg0AGiACIAEoAgRrCyEAIANBIGokACAAC1IBAX8jAEEQayIDJAAgACgCPCABpyABQiCIpyACQf8BcSADQQhqEA0iAAR/QbSbASAANgIAQX8FQQALIQAgAykDCCEBIANBEGokAEJ/IAEgABsL1QQBBX8jAEGwAWsiASQAIAEgADYCqAEgASgCqAEQOAJAAkAgASgCqAEoAgBBAE4EQCABKAKoASgCAEGAFCgCAEgNAQsgASABKAKoASgCADYCECABQSBqQY8SIAFBEGoQbyABQQA2AqQBIAEgAUEgajYCoAEMAQsgASABKAKoASgCAEECdEGAE2ooAgA2AqQBAkACQAJAAkAgASgCqAEoAgBBAnRBkBRqKAIAQQFrDgIAAQILIAEoAqgBKAIEIQJBkJkBKAIAIQRBACEAAkACQANAIAIgAEGgiAFqLQAARwRAQdcAIQMgAEEBaiIAQdcARw0BDAILCyAAIgMNAEGAiQEhAgwBC0GAiQEhAANAIAAtAAAhBSAAQQFqIgIhACAFDQAgAiEAIANBAWsiAw0ACwsgBCgCFBogASACNgKgAQwCCyMAQRBrIgAgASgCqAEoAgQ2AgwgAUEAIAAoAgxrQQJ0QajZAGooAgA2AqABDAELIAFBADYCoAELCwJAIAEoAqABRQRAIAEgASgCpAE2AqwBDAELIAEgASgCoAEQLgJ/IAEoAqQBBEAgASgCpAEQLkECagwBC0EAC2pBAWoQGCIANgIcIABFBEAgAUG4EygCADYCrAEMAQsgASgCHCEAAn8gASgCpAEEQCABKAKkAQwBC0H6EgshA0HfEkH6EiABKAKkARshAiABIAEoAqABNgIIIAEgAjYCBCABIAM2AgAgAEG+CiABEG8gASgCqAEgASgCHDYCCCABIAEoAhw2AqwBCyABKAKsASEAIAFBsAFqJAAgAAsIAEEBQTgQfwszAQF/IAAoAhQiAyABIAIgACgCECADayIBIAEgAksbIgEQGRogACAAKAIUIAFqNgIUIAILjwUCBn4BfyABIAEoAgBBD2pBcHEiAUEQajYCACAAAnwgASkDACEDIAEpAwghBiMAQSBrIggkAAJAIAZC////////////AIMiBEKAgICAgIDAgDx9IARCgICAgICAwP/DAH1UBEAgBkIEhiADQjyIhCEEIANC//////////8PgyIDQoGAgICAgICACFoEQCAEQoGAgICAgICAwAB8IQIMAgsgBEKAgICAgICAgEB9IQIgA0KAgICAgICAgAiFQgBSDQEgAiAEQgGDfCECDAELIANQIARCgICAgICAwP//AFQgBEKAgICAgIDA//8AURtFBEAgBkIEhiADQjyIhEL/////////A4NCgICAgICAgPz/AIQhAgwBC0KAgICAgICA+P8AIQIgBEL///////+//8MAVg0AQgAhAiAEQjCIpyIAQZH3AEkNACADIQIgBkL///////8/g0KAgICAgIDAAIQiBSEHAkAgAEGB9wBrIgFBwABxBEAgAiABQUBqrYYhB0IAIQIMAQsgAUUNACAHIAGtIgSGIAJBwAAgAWutiIQhByACIASGIQILIAggAjcDECAIIAc3AxgCQEGB+AAgAGsiAEHAAHEEQCAFIABBQGqtiCEDQgAhBQwBCyAARQ0AIAVBwAAgAGuthiADIACtIgKIhCEDIAUgAoghBQsgCCADNwMAIAggBTcDCCAIKQMI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ADYCtC0gASgCFEEERgRAIAEoAhgCfyABKAIYKAJcQQBOBEAgASgCGCgCOCABKAIYKAJcagwBC0EACyABKAIYKAJsIAEoAhgoAlxrQQEQKCABKAIYIAEoAhgoAmw2AlwgASgCGCgCABAcIAEoAhgoAgAoAhBFBEAgAUECNgIcDAILIAFBAzYCHAwBCyABKAIYKAKgLQRAIAEoAhgCfyABKAIYKAJcQQBOBEAgASgCGCgCOCABKAIYKAJcagwBC0EACyABKAIYKAJsIAEoAhgoAlxrQQAQKCABKAIYIAEoAhgoAmw2AlwgASgCGCgCABAcIAEoAhgoAgAoAhBFBEAgAUEANgIcDAILCyABQQE2AhwLIAEoAhwhAiABQSBqJAAgAgwBCwJ/IAAoAiwoAogBQQNGBEAgACgCLCECIAAoAjQhAyMAQTBrIgEkACABIAI2AiggASADNgIkAkADQAJAIAEoAigoAnRBggJNBEAgASgCKBBcAkAgASgCKCgCdEGCAksNACABKAIkDQAgAUEANgIsDAQLIAEoAigoAnRFDQELIAEoAihBADYCYAJAIAEoAigoAnRBA0kNACABKAIoKAJsRQ0AIAEgASgCKCgCOCABKAIoKAJsakEBazYCGCABIAEoAhgtAAA2AhwgASgCHCECIAEgASgCGCIDQQFqNgIYAkAgAy0AASACRw0AIAEoAhwhAiABIAEoAhgiA0EBajYCGCADLQABIAJHDQAgASgCHCECIAEgASgCGCIDQQFqNgIYIAMtAAEgAkcNACABIAEoAigoAjggASgCKCgCbGpBggJqNgIUA0AgASgCHCECIAEgASgCGCIDQQFqNgIYAn9BACADLQABIAJHDQAaIAEoAhwhAiABIAEoAhgiA0EBajYCGEEAIAMtAAEgAkcNABogASgCHCECIAEgASgCGCIDQQFqNgIYQQAgAy0AASACRw0AGiABKAIcIQIgASABKAIYIgNBAWo2AhhBACADLQABIAJHDQAaIAEoAhwhAiABIAEoAhgiA0EBajYCGEEAIAMtAAEgAkcNABogASgCHCECIAEgASgCGCIDQQFqNgIYQQAgAy0AASACRw0AGiABKAIcIQIgASABKAIYIgNBAWo2AhhBACADLQABIAJHDQAaIAEoAhwhAiABIAEoAhgiA0EBajYCGEEAIAMtAAEgAkcNABog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AS8BEiECIAEgASgCSCIDQQFqNgJIIAMgAjoAAAwCCyABKAIMQRBxBEAgASABLwESNgIIIAEgASgCDEEPcTYCDCABKAIMBEAgASgCKCABKAIMSQRAIAEgASgCUCICQQFqNgJQIAEgASgCLCACLQAAIAEoAih0ajYCLCABIAEoAihBCGo2AigLIAEgASgCCCABKAIsQQEgASgCDHRBAWtxajYCCCABIAEoAiwgASgCDHY2AiwgASABKAIoIAEoAgxrNgIoCyABKAIoQQ9JBEAgASABKAJQIgJBAWo2AlAgASABKAIsIAItAAAgASgCKHRqNgIsIAEgASgCKEEIajYCKCABIAEoAlAiAkEBajYCUCABIAEoAiwgAi0AACABKAIodGo2AiwgASABKAIoQQhqNgIoCyABIAEoAiAgASgCLCABKAIYcUECdGooAQA2ARACQANAIAEgAS0AETYCDCABIAEoAiwgASgCDHY2AiwgASABKAIoIAEoAgxrNgIoIAEgAS0AEDYCDCABKAIMQRBxBEAgASABLwESNgIEIAEgASgCDEEPcTYCDCABKAIoIAEoAgxJBEAgASABKAJQIgJBAWo2AlAgASABKAIsIAItAAAgASgCKHRqNgIsIAEgASgCKEEIajYCKCABKAIoIAEoAgxJBEAgASABKAJQIgJBAWo2AlAgASABKAIsIAItAAAgASgCKHRqNgIsIAEgASgCKEEIajYCKAsLIAEgASgCBCABKAIsQQEgASgCDHRBAWtxajYCBCABIAEoAiwgASgCDHY2AiwgASABKAIoIAEoAgxrNgIoIAEgASgCSCABKAJEazYCDAJAIAEoAgQgASgCDEsEQCABIAEoAgQgASgCDGs2AgwgASgCDCABKAI4SwRAIAEoAlQoAsQ3BEAgASgCXEHdDDYCGCABKAJUQdH+ADYCBAwKCwsgASABKAIwNgIAAkAgASgCNEUEQCABIAEoAgAgASgCPCABKAIMa2o2AgAgASgCDCABKAIISQRAIAEgASgCCCABKAIMazYCCANAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgiA0EBajYCSCADIAI6AAAgASABKAIMQQFrIgI2AgwgAg0ACyABIAEoAkggASgCBGs2AgALDAELAkAgASgCNCABKAIMSQRAIAEgASgCACABKAI8IAEoAjRqIAEoAgxrajYCACABIAEoAgwgASgCNGs2AgwgASgCDCABKAIISQRAIAEgASgCCCABKAIMazYCCANAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgiA0EBajYCSCADIAI6AAAgASABKAIMQQFrIgI2AgwgAg0ACyABIAEoAjA2AgAgASgCNCABKAIISQRAIAEgASgCNDYCDCABIAEoAgggASgCDGs2AggDQCABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCDEEBayICNgIMIAINAAsgASABKAJIIAEoAgRrNgIACwsMAQsgASABKAIAIAEoAjQgASgCDGtqNgIAIAEoAgwgASgCCEkEQCABIAEoAgggASgCDGs2AggDQCABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCDEEBayICNgIMIAINAAsgASABKAJIIAEoAgRrNgIACwsLA0AgASgCCEECSwRAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgiA0EBajYCSCADIAI6AAAgASABKAIAIgJBAWo2AgAgAi0AACECIAEgASgCSCIDQQFqNgJIIAMgAjoAACABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCCEEDazYCCAwBCwsMAQsgASABKAJIIAEoAgRrNgIAA0AgASABKAIAIgJBAWo2AgAgAi0AACECIAEgASgCSCIDQQFqNgJIIAMgAjoAACABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgiA0EBajYCSCADIAI6AAAgASABKAIIQQNrNgIIIAEoAghBAksNAAsLIAEoAggEQCABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEoAghBAUsEQCABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAACwsMAgsgASgCDEHAAHFFBEAgASABKAIgIAEvARIgASgCLEEBIAEoAgx0QQFrcWpBAnRqKAEANgEQDAELCyAB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AG5hbgAvZGV2L3VyYW5kb20AaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrAGluY29ycmVjdCBoZWFkZXIgY2hlY2sAaW5jb3JyZWN0IGxlbmd0aCBjaGVjawBpbmNvcnJlY3QgZGF0YSBjaGVjawBpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjawBoZWFkZXIgY3JjIG1pc21hdGNoAGluZgBpbnZhbGlkIHdpbmRvdyBzaXplAFJlYWQtb25seSBhcmNoaXZlAE5vdCBhIHppcCBhcmNoaXZlAFJlc291cmNlIHN0aWxsIGluIHVzZQBNYWxsb2MgZmFpbHVyZQBpbnZhbGlkIGJsb2NrIHR5cGUARmFpbHVyZSB0byBjcmVhdGUgdGVtcG9yYXJ5IGZpbGUAQ2FuJ3Qgb3BlbiBmaWxlAE5vIHN1Y2ggZmlsZQBQcmVtYXR1cmUgZW5kIG9mIGZpbGUAQ2FuJ3QgcmVtb3ZlIGZpbGUAaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlAGludmFsaWQgZGlzdGFuY2UgY29kZQB1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZABzdHJlYW0gZW5kAENvbXByZXNzZWQgZGF0YSBpbnZhbGlkAE11bHRpLWRpc2sgemlwIGFyY2hpdmVzIG5vdCBzdXBwb3J0ZWQAT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQARW5jcnlwdGlvbiBtZXRob2Qgbm90IHN1cHBvcnRlZABDb21wcmVzc2lvbiBtZXRob2Qgbm90IHN1cHBvcnRlZABFbnRyeSBoYXMgYmVlbiBkZWxldGVkAENvbnRhaW5pbmcgemlwIGFyY2hpdmUgd2FzIGNsb3NlZABDbG9zaW5nIHppcCBhcmNoaXZlIGZhaWxlZABSZW5hbWluZyB0ZW1wb3JhcnkgZmlsZSBmYWlsZWQARW50cnkgaGFzIGJlZW4gY2hhbmdlZABObyBwYXNzd29yZCBwcm92aWRlZABXcm9uZyBwYXNzd29yZCBwcm92aWRlZABVbmtub3duIGVycm9yICVkAHJiAHIrYgByd2EAJXMuWFhYWFhYAE5BTgBJTkYAQUUAMS4yLjExAC9wcm9jL3NlbGYvZmQvAC4AKG51bGwpADogAFBLBgcA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0gAIADIACACyAAgAcgAIAPIACAAKAAgAigAIAEoACADKAAgAKgAIAKoACABqAAgA6gAIABoACACaAAgAWgAIANoACAA6AAgAugAIAHoACAD6AAgABgAIAIYACABGAAgAxgAIACYACACmAAgAZgAIAOYACAAWAAgAlgAIAFYACADWAAgANgAIALYACAB2AAgA9gAIAA4ACACOAAgATgAIAM4ACAAuAAgArgAIAG4ACADuAAgAHgAIAJ4ACABeAAgA3gAIAD4ACAC+AAgAfgAIAP4ACAABAAgAgQAIAEEACADBAAgAIQAIAKEACABhAAgA4QAIABEACACRAAgAUQAIANEACAAxAAgAsQAIAHEACADxAAgACQAIAIkACABJAAgAyQAIACkACACpAAgAaQAIAOkACAAZAAgAmQAIAFkACADZAAgAOQAIALkACAB5AAgA+QAIAAUACACFAAgARQAIAMUACAAlAAgApQAIAGUACADlAAgAFQAIAJUACABVAAgA1QAIADUACAC1AAgAdQAIAPUACAANAAgAjQAIAE0ACADNAAgALQAIAK0ACABtAAgA7QAIAB0ACACdAAgAXQAIAN0ACAA9AAgAvQAIAH0ACAD9AAgAEwAJABMBCQCTAAkAkwEJAFMACQBTAQkA0wAJANMBCQAzAAkAMwEJALMACQCzAQkAcwAJAHMBCQDzAAkA8wEJAAsACQALAQkAiwAJAIsBCQBLAAkASwEJAMsACQDLAQkAKwAJACsBCQCrAAkAqwEJAGsACQBrAQkA6wAJAOsBCQAbAAkAGwEJAJsACQCbAQkAWwAJAFsBCQDbAAkA2wEJADsACQA7AQkAuwAJALsBCQB7AAkAewEJAPsACQD7AQkABwAJAAcBCQCHAAkAhwEJAEcACQBHAQkAxwAJAMcBCQAnAAkAJwEJAKcACQCnAQkAZwAJAGcBCQDnAAkA5wEJABcACQAXAQkAlwAJAJcBCQBXAAkAVwEJANcACQDXAQkANwAJADcBCQC3AAkAtwEJAHcACQB3AQkA9wAJAPcBCQAPAAkADwEJAI8ACQCPAQkATwAJAE8BCQDPAAkAzwEJAC8ACQAvAQkArwAJAK8BCQBvAAkAbwEJAO8ACQDvAQkAHwAJAB8BCQCfAAkAnwEJAF8ACQBfAQkA3wAJAN8BCQA/AAkAPwEJAL8ACQC/AQkAfwAJAH8BCQD/AAkA/wEJAAAABwBAAAcAIAAHAGAABwAQAAcAUAAHADAABwBwAAcACAAHAEgABwAoAAcAaAAHABgABwBYAAcAOAAHAHgABwAEAAcARAAHACQABwBkAAcAFAAHAFQABwA0AAcAdAAHAAMACACDAAgAQwAIAMMACAAjAAgAowAIAGMACADjAAgAAAAFABAABQAIAAUAGAAFAAQABQAUAAUADAAFABwABQACAAUAEgAFAAoABQAaAAUABgAFABYABQAOAAUAHgAFAAEABQARAAUACQAFABkABQAFAAUAFQAFAA0ABQAdAAUAAwAFABMABQALAAUAGwAFAAcABQAXAAUAQbDqAAtNAQAAAAEAAAABAAAAAQAAAAIAAAACAAAAAgAAAAIAAAADAAAAAwAAAAMAAAADAAAABAAAAAQAAAAEAAAABAAAAAUAAAAFAAAABQAAAAUAQaDrAAtlAQAAAAEAAAACAAAAAgAAAAMAAAADAAAABAAAAAQAAAAFAAAABQAAAAYAAAAGAAAABwAAAAcAAAAIAAAACAAAAAkAAAAJAAAACgAAAAoAAAALAAAACwAAAAwAAAAMAAAADQAAAA0AQdDsAAsjAgAAAAMAAAAHAAAAAAAAABAREgAIBwkGCgULBAwDDQIOAQ8AQYTtAAtpAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAKAAAADAAAAA4AAAAQAAAAFAAAABgAAAAcAAAAIAAAACgAAAAwAAAAOAAAAEAAAABQAAAAYAAAAHAAAACAAAAAoAAAAMAAAADgAEGE7gALegEAAAACAAAAAwAAAAQAAAAGAAAACAAAAAwAAAAQAAAAGAAAACAAAAAwAAAAQAAAAGAAAACAAAAAwAAAAAABAACAAQAAAAIAAAADAAAABAAAAAYAAAAIAAAADAAAABAAAAAYAAAAIAAAADAAAABAAAAAYAAAMS4yLjExAEGI7wALbQcAAAAEAAQACAAEAAgAAAAEAAUAEAAIAAgAAAAEAAYAIAAgAAgAAAAEAAQAEAAQAAkAAAAIABAAIAAgAAkAAAAIABAAgACAAAkAAAAIACAAgAAAAQkAAAAgAIAAAgEABAkAAAAgAAIBAgEAEAkAQYDwAAulAgMABAAFAAYABwAIAAkACgALAA0ADwARABMAFwAbAB8AIwArADMAOwBDAFMAYwBzAIMAowDDAOMAAgEAAAAAAAAQABAAEAAQABAAEAAQABAAEQARABEAEQASABIAEgASABMAEwATABMAFAAUABQAFAAVABUAFQAVABAATQDKAAAAAQACAAMABAAFAAcACQANABEAGQAhADEAQQBhAIEAwQABAYEBAQIBAwEEAQYBCAEMARABGAEgATABQAFgAAAAABAAEAAQABAAEQARABIAEgATABMAFAAUABUAFQAWABYAFwAXABgAGAAZABkAGgAaABsAGwAcABwAHQAdAEAAQAAQABEAEgAAAAgABwAJAAYACgAFAAsABAAMAAMADQACAA4AAQAPAEGw8gALwRFgBwAAAAhQAAAIEAAUCHMAEgcfAAAIcAAACDAAAAnAABAHCgAACGAAAAggAAAJoAAACAAAAAiAAAAIQAAACeAAEAcGAAAIWAAACBgAAAmQABMHOwAACHgAAAg4AAAJ0AARBxEAAAhoAAAIKAAACbAAAAgIAAAIiAAACEgAAAnwABAHBAAACFQAAAgUABUI4wATBysAAAh0AAAINAAACcgAEQcNAAAIZAAACCQAAAmoAAAIBAAACIQAAAhEAAAJ6AAQBwgAAAhcAAAIHAAACZgAFAdTAAAIfAAACDwAAAnYABIHFwAACGwAAAgsAAAJuAAACAwAAAiMAAAITAAACfgAEAcDAAAIUgAACBIAFQijABMHIwAACHIAAAgyAAAJxAARBwsAAAhiAAAIIgAACaQAAAgCAAAIggAACEIAAAnkABAHBwAACFoAAAgaAAAJlAAUB0MAAAh6AAAIOgAACdQAEgcTAAAIagAACCoAAAm0AAAICgAACIoAAAhKAAAJ9AAQBwUAAAhWAAAIFgBACAAAEwczAAAIdgAACDYAAAnMABEHDwAACGYAAAgmAAAJrAAACAYAAAiGAAAIRgAACewAEAcJAAAIXgAACB4AAAmcABQHYwAACH4AAAg+AAAJ3AASBxsAAAhuAAAILgAACbwAAAgOAAAIjgAACE4AAAn8AGAHAAAACFEAAAgRABUIgwASBx8AAAhxAAAIMQAACcIAEAcKAAAIYQAACCEAAAmiAAAIAQAACIEAAAhBAAAJ4gAQBwYAAAhZAAAIGQAACZIAEwc7AAAIeQAACDkAAAnSABEHEQAACGkAAAgpAAAJsgAACAkAAAiJAAAISQAACfIAEAcEAAAIVQAACBUAEAgCARMHKwAACHUAAAg1AAAJygARBw0AAAhlAAAIJQAACaoAAAgFAAAIhQAACEUAAAnqABAHCAAACF0AAAgdAAAJmgAUB1MAAAh9AAAIPQAACdoAEgcXAAAIbQAACC0AAAm6AAAIDQAACI0AAAhNAAAJ+gAQBwMAAAhTAAAIEwAVCMMAEwcjAAAIcwAACDMAAAnGABEHCwAACGMAAAgjAAAJpgAACAMAAAiDAAAIQwAACeYAEAcHAAAIWwAACBsAAAmWABQHQwAACHsAAAg7AAAJ1gASBxMAAAhrAAAIKwAACbYAAAgLAAAIiwAACEsAAAn2ABAHBQAACFcAAAgXAEAIAAATBzMAAAh3AAAINwAACc4AEQcPAAAIZwAACCcAAAmuAAAIBwAACIcAAAhHAAAJ7gAQBwkAAAhfAAAIHwAACZ4AFAdjAAAIfwAACD8AAAneABIHGwAACG8AAAgvAAAJvgAACA8AAAiPAAAITwAACf4AYAcAAAAIUAAACBAAFAhzABIHHwAACHAAAAgwAAAJwQAQBwoAAAhgAAAIIAAACaEAAAgAAAAIgAAACEAAAAnhABAHBgAACFgAAAgYAAAJkQATBzsAAAh4AAAIOAAACdEAEQcRAAAIaAAACCgAAAmxAAAICAAACIgAAAhIAAAJ8QAQBwQAAAhUAAAIFAAVCOMAEwcrAAAIdAAACDQAAAnJABEHDQAACGQAAAgkAAAJqQAACAQAAAiEAAAIRAAACekAEAcIAAAIXAAACBwAAAmZABQHUwAACHwAAAg8AAAJ2QASBxcAAAhsAAAILAAACbkAAAgMAAAIjAAACEwAAAn5ABAHAwAACFIAAAgSABUIowATByMAAAhyAAAIMgAACcUAEQcLAAAIYgAACCIAAAmlAAAIAgAACIIAAAhCAAAJ5QAQBwcAAAhaAAAIGgAACZUAFAdDAAAIegAACDoAAAnVABIHEwAACGoAAAgqAAAJtQAACAoAAAiKAAAISgAACfUAEAcFAAAIVgAACBYAQAgAABMHMwAACHYAAAg2AAAJzQARBw8AAAhmAAAIJgAACa0AAAgGAAAIhgAACEYAAAntABAHCQAACF4AAAgeAAAJnQAUB2MAAAh+AAAIPgAACd0AEgcbAAAIbgAACC4AAAm9AAAIDgAACI4AAAhOAAAJ/QBgBwAAAAhRAAAIEQAVCIMAEgcfAAAIcQAACDEAAAnDABAHCgAACGEAAAghAAAJowAACAEAAAiBAAAIQQAACeMAEAcGAAAIWQAACBkAAAmTABMHOwAACHkAAAg5AAAJ0wARBxEAAAhpAAAIKQAACbMAAAgJAAAIiQAACEkAAAnzABAHBAAACFUAAAgVABAIAgETBysAAAh1AAAINQAACcsAEQcNAAAIZQAACCUAAAmrAAAIBQAACIUAAAhFAAAJ6wAQBwgAAAhdAAAIHQAACZsAFAdTAAAIfQAACD0AAAnbABIHFwAACG0AAAgtAAAJuwAACA0AAAiNAAAITQAACfsAEAcDAAAIUwAACBMAFQjDABMHIwAACHMAAAgzAAAJxwARBwsAAAhjAAAIIwAACacAAAgDAAAIgwAACEMAAAnnABAHBwAACFsAAAgbAAAJlwAUB0MAAAh7AAAIOwAACdcAEgcTAAAIawAACCsAAAm3AAAICwAACIsAAAhLAAAJ9wAQBwUAAAhXAAAIFwBACAAAEwczAAAIdwAACDcAAAnPABEHDwAACGcAAAgnAAAJrwAACAcAAAiHAAAIRwAACe8AEAcJAAAIXwAACB8AAAmfABQHYwAACH8AAAg/AAAJ3wASBxsAAAhvAAAILwAACb8AAAgPAAAIjwAACE8AAAn/ABAFAQAXBQEBEwURABsFARARBQUAGQUBBBUFQQAdBQFAEAUDABgFAQIUBSEAHAUBIBIFCQAaBQEIFgWBAEAFAAAQBQIAFwWBARMFGQAbBQEYEQUHABkFAQYVBWEAHQUBYBAFBAAYBQEDFAUxABwFATASBQ0AGgUBDBYFwQBABQAAEQAKABEREQAAAAAFAAAAAAAACQAAAAALAAAAAAAAAAARAA8KERERAwoHAAEACQsLAAAJBgsAAAsABhEAAAAREREAQYGEAQshCwAAAAAAAAAAEQAKChEREQAKAAACAAkLAAAACQALAAALAEG7hAELAQwAQceEAQsVDAAAAAAMAAAAAAkMAAAAAAAMAAAMAEH1hAELAQ4AQYGFAQsVDQAAAAQNAAAAAAkOAAAAAAAOAAAOAEGvhQELARAAQbuFAQseDwAAAAAPAAAAAAkQAAAAAAAQAAAQAAASAAAAEhISAEHyhQELDhIAAAASEhIAAAAAAAAJAEGjhgELAQsAQa+GAQsVCgAAAAAKAAAAAAkLAAAAAAALAAALAEHdhgELAQwAQemGAQsnDAAAAAAMAAAAAAkMAAAAAAAMAAAMAAAwMTIzNDU2Nzg5QUJDREVGAEG0hwELARkAQduHAQsF//////8AQaCIAQtXGRJEOwI/LEcUPTMwChsGRktFNw9JDo4XA0AdPGkrNh9KLRwBICUpIQgMFRYiLhA4Pgs0MRhkdHV2L0EJfzkRI0MyQomKiwUEJignDSoeNYwHGkiTE5SVAEGAiQELig5JbGxlZ2FsIGJ5dGUgc2VxdWVuY2UARG9tYWluIGVycm9yAFJlc3VsdCBub3QgcmVwcmVzZW50YWJsZQBOb3QgYSB0dHkAUGVybWlzc2lvbiBkZW5pZWQAT3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQATm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQBObyBzdWNoIHByb2Nlc3MARmlsZSBleGlzdHMAVmFsdWUgdG9vIGxhcmdlIGZvciBkYXRhIHR5cGUATm8gc3BhY2UgbGVmdCBvbiBkZXZpY2UAT3V0IG9mIG1lbW9yeQBSZXNvdXJjZSBidXN5AEludGVycnVwdGVkIHN5c3RlbSBjYWxsAFJlc291cmNlIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlAEludmFsaWQgc2VlawBDcm9zcy1kZXZpY2UgbGluawBSZWFkLW9ubHkgZmlsZSBzeXN0ZW0ARGlyZWN0b3J5IG5vdCBlbXB0eQBDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIAT3BlcmF0aW9uIHRpbWVkIG91dABDb25uZWN0aW9uIHJlZnVzZWQASG9zdCBpcyBkb3duAEhvc3QgaXMgdW5yZWFjaGFibGUAQWRkcmVzcyBpbiB1c2UAQnJva2VuIHBpcGUASS9PIGVycm9yAE5vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3MAQmxvY2sgZGV2aWNlIHJlcXVpcmVkAE5vIHN1Y2ggZGV2aWNlAE5vdCBhIGRpcmVjdG9yeQBJcyBhIGRpcmVjdG9yeQBUZXh0IGZpbGUgYnVzeQBFeGVjIGZvcm1hdCBlcnJvcgBJbnZhbGlkIGFyZ3VtZW50AEFyZ3VtZW50IGxpc3QgdG9vIGxvbmcAU3ltYm9saWMgbGluayBsb29wAEZpbGVuYW1lIHRvbyBsb25nAFRvbyBtYW55IG9wZW4gZmlsZXMgaW4gc3lzdGVtAE5vIGZpbGUgZGVzY3JpcHRvcnMgYXZhaWxhYmxlAEJhZCBmaWxlIGRlc2NyaXB0b3IATm8gY2hpbGQgcHJvY2VzcwBCYWQgYWRkcmVzcwBGaWxlIHRvbyBsYXJnZQBUb28gbWFueSBsaW5rcwBObyBsb2NrcyBhdmFpbGFibGUAUmVzb3VyY2UgZGVhZGxvY2sgd291bGQgb2NjdXIAU3RhdGUgbm90IHJlY292ZXJhYmxlAFByZXZpb3VzIG93bmVyIGRpZWQAT3BlcmF0aW9uIGNhbmNlbGVkAEZ1bmN0aW9uIG5vdCBpbXBsZW1lbnRlZABObyBtZXNzYWdlIG9mIGRlc2lyZWQgdHlwZQBJZGVudGlmaWVyIHJlbW92ZWQARGV2aWNlIG5vdCBhIHN0cmVhbQBObyBkYXRhIGF2YWlsYWJsZQBEZXZpY2UgdGltZW91dABPdXQgb2Ygc3RyZWFtcyByZXNvdXJjZXMATGluayBoYXMgYmVlbiBzZXZlcmVkAFByb3RvY29sIGVycm9yAEJhZCBtZXNzYWdlAEZpbGUgZGVzY3JpcHRvciBpbiBiYWQgc3RhdGUATm90IGEgc29ja2V0AERlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQATWVzc2FnZSB0b28gbGFyZ2UAUHJvdG9jb2wgd3JvbmcgdHlwZSBmb3Igc29ja2V0AFByb3RvY29sIG5vdCBhdmFpbGFibGUAUHJvdG9jb2wgbm90IHN1cHBvcnRlZABTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkAE5vdCBzdXBwb3J0ZWQAUHJvdG9jb2wgZmFtaWx5IG5vdCBzdXBwb3J0ZWQAQWRkcmVzcyBmYW1pbHkgbm90IHN1cHBvcnRlZCBieSBwcm90b2NvbABBZGRyZXNzIG5vdCBhdmFpbGFibGUATmV0d29yayBpcyBkb3duAE5ldHdvcmsgdW5yZWFjaGFibGUAQ29ubmVjdGlvbiByZXNldCBieSBuZXR3b3JrAENvbm5lY3Rpb24gYWJvcnRlZABObyBidWZmZXIgc3BhY2UgYXZhaWxhYmxlAFNvY2tldCBpcyBjb25uZWN0ZWQAU29ja2V0IG5vdCBjb25uZWN0ZWQAQ2Fubm90IHNlbmQgYWZ0ZXIgc29ja2V0IHNodXRkb3duAE9wZXJhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzAE9wZXJhdGlvbiBpbiBwcm9ncmVzcwBTdGFsZSBmaWxlIGhhbmRsZQBSZW1vdGUgSS9PIGVycm9yAFF1b3RhIGV4Y2VlZGVkAE5vIG1lZGl1bSBmb3VuZABXcm9uZyBtZWRpdW0gdHlwZQBObyBlcnJvciBpbmZvcm1hdGlvbgBBkJcBC1JQUFAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABEAAAASAAAACwAAAAwAAAANAAAADgAAAA8AAAAQAAAAEQAAAAEAAAAIAAAAlEsAALRLAEGQmQELAgxQAEHImQELCR8AAADkTAAAAwBB5JkBC4wBLfRRWM+MscBG9rXLKTEDxwRbcDC0Xf0geH+LmthZKVBoSImrp1YDbP+3zYg/1He0K6WjcPG65Kj8QYP92W/hinovLXSWBx8NCV4Ddixw90ClLKdvV0GoqnTfoFhkA0rHxDxTrq9fGAQVseNtKIarDKS/Q/DpUIE5VxZSN/////////////////////8=\";ug(Io)||(Io=h(Io));function gg(d){try{if(d==Io&&V)return new Uint8Array(V);var E=Ca(d);if(E)return E;if(C)return C(d);throw\"sync fetching of the wasm failed: you can preload it to Module['wasmBinary'] manually, or emcc.py will do that for you when generating HTML (but not JS)\"}catch(I){wr(I)}}function Bp(d,E){var I,k,L;try{L=gg(d),k=new WebAssembly.Module(L),I=new WebAssembly.Instance(k,E)}catch(te){var Z=te.toString();throw D(\"failed to compile wasm module: \"+Z),(Z.includes(\"imported Memory\")||Z.includes(\"memory import\"))&&D(\"Memory size incompatibility issues may be due to changing INITIAL_MEMORY at runtime to something too large. Use ALLOW_MEMORY_GROWTH to allow any size memory (and also make sure not to set INITIAL_MEMORY at runtime to something smaller than it was at compile time).\"),te}return[I,k]}function Qp(){var d={a:ma};function E(L,Z){var te=L.exports;t.asm=te,A=t.asm.u,Or(A.buffer),gi=t.asm.pa,CA(t.asm.v),IA(\"wasm-instantiate\")}if(EA(\"wasm-instantiate\"),t.instantiateWasm)try{var I=t.instantiateWasm(d,E);return I}catch(L){return D(\"Module.instantiateWasm callback failed with error: \"+L),!1}var k=Bp(Io,d);return E(k[0]),t.asm}var vr,se;function yo(d){for(;d.length>0;){var E=d.shift();if(typeof E==\"function\"){E(t);continue}var I=E.func;typeof I==\"number\"?E.arg===void 0?gi.get(I)():gi.get(I)(E.arg):I(E.arg===void 0?null:E.arg)}}function Fn(d,E){var I=new Date(de[d>>2]*1e3);de[E>>2]=I.getUTCSeconds(),de[E+4>>2]=I.getUTCMinutes(),de[E+8>>2]=I.getUTCHours(),de[E+12>>2]=I.getUTCDate(),de[E+16>>2]=I.getUTCMonth(),de[E+20>>2]=I.getUTCFullYear()-1900,de[E+24>>2]=I.getUTCDay(),de[E+36>>2]=0,de[E+32>>2]=0;var k=Date.UTC(I.getUTCFullYear(),0,1,0,0,0,0),L=(I.getTime()-k)/(1e3*60*60*24)|0;return de[E+28>>2]=L,Fn.GMTString||(Fn.GMTString=Be(\"GMT\")),de[E+40>>2]=Fn.GMTString,E}function fg(d,E){return Fn(d,E)}var Qt={splitPath:function(d){var E=/^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/;return E.exec(d).slice(1)},normalizeArray:function(d,E){for(var I=0,k=d.length-1;k>=0;k--){var L=d[k];L===\".\"?d.splice(k,1):L===\"..\"?(d.splice(k,1),I++):I&&(d.splice(k,1),I--)}if(E)for(;I;I--)d.unshift(\"..\");return d},normalize:function(d){var E=d.charAt(0)===\"/\",I=d.substr(-1)===\"/\";return d=Qt.normalizeArray(d.split(\"/\").filter(function(k){return!!k}),!E).join(\"/\"),!d&&!E&&(d=\".\"),d&&I&&(d+=\"/\"),(E?\"/\":\"\")+d},dirname:function(d){var E=Qt.splitPath(d),I=E[0],k=E[1];return!I&&!k?\".\":(k&&(k=k.substr(0,k.length-1)),I+k)},basename:function(d){if(d===\"/\")return\"/\";d=Qt.normalize(d),d=d.replace(/\\/$/,\"\");var E=d.lastIndexOf(\"/\");return E===-1?d:d.substr(E+1)},extname:function(d){return Qt.splitPath(d)[3]},join:function(){var d=Array.prototype.slice.call(arguments,0);return Qt.normalize(d.join(\"/\"))},join2:function(d,E){return Qt.normalize(d+\"/\"+E)}};function Ll(){if(typeof crypto==\"object\"&&typeof crypto.getRandomValues==\"function\"){var d=new Uint8Array(1);return function(){return crypto.getRandomValues(d),d[0]}}else if(g)try{var E=J(\"crypto\");return function(){return E.randomBytes(1)[0]}}catch{}return function(){wr(\"randomDevice\")}}var Nn={resolve:function(){for(var d=\"\",E=!1,I=arguments.length-1;I>=-1&&!E;I--){var k=I>=0?arguments[I]:S.cwd();if(typeof k!=\"string\")throw new TypeError(\"Arguments to path.resolve must be strings\");if(!k)return\"\";d=k+\"/\"+d,E=k.charAt(0)===\"/\"}return d=Qt.normalizeArray(d.split(\"/\").filter(function(L){return!!L}),!E).join(\"/\"),(E?\"/\":\"\")+d||\".\"},relative:function(d,E){d=Nn.resolve(d).substr(1),E=Nn.resolve(E).substr(1);function I(Je){for(var nt=0;nt<Je.length&&Je[nt]===\"\";nt++);for(var wt=Je.length-1;wt>=0&&Je[wt]===\"\";wt--);return nt>wt?[]:Je.slice(nt,wt-nt+1)}for(var k=I(d.split(\"/\")),L=I(E.split(\"/\")),Z=Math.min(k.length,L.length),te=Z,we=0;we<Z;we++)if(k[we]!==L[we]){te=we;break}for(var me=[],we=te;we<k.length;we++)me.push(\"..\");return me=me.concat(L.slice(te)),me.join(\"/\")}},ns={ttys:[],init:function(){},shutdown:function(){},register:function(d,E){ns.ttys[d]={input:[],output:[],ops:E},S.registerDevice(d,ns.stream_ops)},stream_ops:{open:function(d){var E=ns.ttys[d.node.rdev];if(!E)throw new S.ErrnoError(43);d.tty=E,d.seekable=!1},close:function(d){d.tty.ops.flush(d.tty)},flush:function(d){d.tty.ops.flush(d.tty)},read:function(d,E,I,k,L){if(!d.tty||!d.tty.ops.get_char)throw new S.ErrnoError(60);for(var Z=0,te=0;te<k;te++){var we;try{we=d.tty.ops.get_char(d.tty)}catch{throw new S.ErrnoError(29)}if(we===void 0&&Z===0)throw new S.ErrnoError(6);if(we==null)break;Z++,E[I+te]=we}return Z&&(d.node.timestamp=Date.now()),Z},write:function(d,E,I,k,L){if(!d.tty||!d.tty.ops.put_char)throw new S.ErrnoError(60);try{for(var Z=0;Z<k;Z++)d.tty.ops.put_char(d.tty,E[I+Z])}catch{throw new S.ErrnoError(29)}return k&&(d.node.timestamp=Date.now()),Z}},default_tty_ops:{get_char:function(d){if(!d.input.length){var E=null;if(g){var I=256,k=Buffer.alloc?Buffer.alloc(I):new Buffer(I),L=0;try{L=y.readSync(process.stdin.fd,k,0,I,null)}catch(Z){if(Z.toString().includes(\"EOF\"))L=0;else throw Z}L>0?E=k.slice(0,L).toString(\"utf-8\"):E=null}else typeof window<\"u\"&&typeof window.prompt==\"function\"?(E=window.prompt(\"Input: \"),E!==null&&(E+=`\n`)):typeof readline==\"function\"&&(E=readline(),E!==null&&(E+=`\n`));if(!E)return null;d.input=wA(E,!0)}return d.input.shift()},put_char:function(d,E){E===null||E===10?(v(ke(d.output,0)),d.output=[]):E!=0&&d.output.push(E)},flush:function(d){d.output&&d.output.length>0&&(v(ke(d.output,0)),d.output=[])}},default_tty1_ops:{put_char:function(d,E){E===null||E===10?(D(ke(d.output,0)),d.output=[]):E!=0&&d.output.push(E)},flush:function(d){d.output&&d.output.length>0&&(D(ke(d.output,0)),d.output=[])}}};function ss(d){for(var E=H(d,65536),I=dt(E);d<E;)ne[I+d++]=0;return I}var gt={ops_table:null,mount:function(d){return gt.createNode(null,\"/\",16895,0)},createNode:function(d,E,I,k){if(S.isBlkdev(I)||S.isFIFO(I))throw new S.ErrnoError(63);gt.ops_table||(gt.ops_table={dir:{node:{getattr:gt.node_ops.getattr,setattr:gt.node_ops.setattr,lookup:gt.node_ops.lookup,mknod:gt.node_ops.mknod,rename:gt.node_ops.rename,unlink:gt.node_ops.unlink,rmdir:gt.node_ops.rmdir,readdir:gt.node_ops.readdir,symlink:gt.node_ops.symlink},stream:{llseek:gt.stream_ops.llseek}},file:{node:{getattr:gt.node_ops.getattr,setattr:gt.node_ops.setattr},stream:{llseek:gt.stream_ops.llseek,read:gt.stream_ops.read,write:gt.stream_ops.write,allocate:gt.stream_ops.allocate,mmap:gt.stream_ops.mmap,msync:gt.stream_ops.msync}},link:{node:{getattr:gt.node_ops.getattr,setattr:gt.node_ops.setattr,readlink:gt.node_ops.readlink},stream:{}},chrdev:{node:{getattr:gt.node_ops.getattr,setattr:gt.node_ops.setattr},stream:S.chrdev_stream_ops}});var L=S.createNode(d,E,I,k);return S.isDir(L.mode)?(L.node_ops=gt.ops_table.dir.node,L.stream_ops=gt.ops_table.dir.stream,L.contents={}):S.isFile(L.mode)?(L.node_ops=gt.ops_table.file.node,L.stream_ops=gt.ops_table.file.stream,L.usedBytes=0,L.contents=null):S.isLink(L.mode)?(L.node_ops=gt.ops_table.link.node,L.stream_ops=gt.ops_table.link.stream):S.isChrdev(L.mode)&&(L.node_ops=gt.ops_table.chrdev.node,L.stream_ops=gt.ops_table.chrdev.stream),L.timestamp=Date.now(),d&&(d.contents[E]=L,d.timestamp=L.timestamp),L},getFileDataAsTypedArray:function(d){return d.contents?d.contents.subarray?d.contents.subarray(0,d.usedBytes):new Uint8Array(d.contents):new Uint8Array(0)},expandFileStorage:function(d,E){var I=d.contents?d.contents.length:0;if(!(I>=E)){var k=1024*1024;E=Math.max(E,I*(I<k?2:1.125)>>>0),I!=0&&(E=Math.max(E,256));var L=d.contents;d.contents=new Uint8Array(E),d.usedBytes>0&&d.contents.set(L.subarray(0,d.usedBytes),0)}},resizeFileStorage:function(d,E){if(d.usedBytes!=E)if(E==0)d.contents=null,d.usedBytes=0;else{var I=d.contents;d.contents=new Uint8Array(E),I&&d.contents.set(I.subarray(0,Math.min(E,d.usedBytes))),d.usedBytes=E}},node_ops:{getattr:function(d){var E={};return E.dev=S.isChrdev(d.mode)?d.id:1,E.ino=d.id,E.mode=d.mode,E.nlink=1,E.uid=0,E.gid=0,E.rdev=d.rdev,S.isDir(d.mode)?E.size=4096:S.isFile(d.mode)?E.size=d.usedBytes:S.isLink(d.mode)?E.size=d.link.length:E.size=0,E.atime=new Date(d.timestamp),E.mtime=new Date(d.timestamp),E.ctime=new Date(d.timestamp),E.blksize=4096,E.blocks=Math.ceil(E.size/E.blksize),E},setattr:function(d,E){E.mode!==void 0&&(d.mode=E.mode),E.timestamp!==void 0&&(d.timestamp=E.timestamp),E.size!==void 0&&gt.resizeFileStorage(d,E.size)},lookup:function(d,E){throw S.genericErrors[44]},mknod:function(d,E,I,k){return gt.createNode(d,E,I,k)},rename:function(d,E,I){if(S.isDir(d.mode)){var k;try{k=S.lookupNode(E,I)}catch{}if(k)for(var L in k.contents)throw new S.ErrnoError(55)}delete d.parent.contents[d.name],d.parent.timestamp=Date.now(),d.name=I,E.contents[I]=d,E.timestamp=d.parent.timestamp,d.parent=E},unlink:function(d,E){delete d.contents[E],d.timestamp=Date.now()},rmdir:function(d,E){var I=S.lookupNode(d,E);for(var k in I.contents)throw new S.ErrnoError(55);delete d.contents[E],d.timestamp=Date.now()},readdir:function(d){var E=[\".\",\"..\"];for(var I in d.contents)!d.contents.hasOwnProperty(I)||E.push(I);return E},symlink:function(d,E,I){var k=gt.createNode(d,E,41471,0);return k.link=I,k},readlink:function(d){if(!S.isLink(d.mode))throw new S.ErrnoError(28);return d.link}},stream_ops:{read:function(d,E,I,k,L){var Z=d.node.contents;if(L>=d.node.usedBytes)return 0;var te=Math.min(d.node.usedBytes-L,k);if(te>8&&Z.subarray)E.set(Z.subarray(L,L+te),I);else for(var we=0;we<te;we++)E[I+we]=Z[L+we];return te},write:function(d,E,I,k,L,Z){if(E.buffer===ne.buffer&&(Z=!1),!k)return 0;var te=d.node;if(te.timestamp=Date.now(),E.subarray&&(!te.contents||te.contents.subarray)){if(Z)return te.contents=E.subarray(I,I+k),te.usedBytes=k,k;if(te.usedBytes===0&&L===0)return te.contents=E.slice(I,I+k),te.usedBytes=k,k;if(L+k<=te.usedBytes)return te.contents.set(E.subarray(I,I+k),L),k}if(gt.expandFileStorage(te,L+k),te.contents.subarray&&E.subarray)te.contents.set(E.subarray(I,I+k),L);else for(var we=0;we<k;we++)te.contents[L+we]=E[I+we];return te.usedBytes=Math.max(te.usedBytes,L+k),k},llseek:function(d,E,I){var k=E;if(I===1?k+=d.position:I===2&&S.isFile(d.node.mode)&&(k+=d.node.usedBytes),k<0)throw new S.ErrnoError(28);return k},allocate:function(d,E,I){gt.expandFileStorage(d.node,E+I),d.node.usedBytes=Math.max(d.node.usedBytes,E+I)},mmap:function(d,E,I,k,L,Z){if(E!==0)throw new S.ErrnoError(28);if(!S.isFile(d.node.mode))throw new S.ErrnoError(43);var te,we,me=d.node.contents;if(!(Z&2)&&me.buffer===qe)we=!1,te=me.byteOffset;else{if((k>0||k+I<me.length)&&(me.subarray?me=me.subarray(k,k+I):me=Array.prototype.slice.call(me,k,k+I)),we=!0,te=ss(I),!te)throw new S.ErrnoError(48);ne.set(me,te)}return{ptr:te,allocated:we}},msync:function(d,E,I,k,L){if(!S.isFile(d.node.mode))throw new S.ErrnoError(43);if(L&2)return 0;var Z=gt.stream_ops.write(d,E,0,k,I,!1);return 0}}},wo={EPERM:63,ENOENT:44,ESRCH:71,EINTR:27,EIO:29,ENXIO:60,E2BIG:1,ENOEXEC:45,EBADF:8,ECHILD:12,EAGAIN:6,EWOULDBLOCK:6,ENOMEM:48,EACCES:2,EFAULT:21,ENOTBLK:105,EBUSY:10,EEXIST:20,EXDEV:75,ENODEV:43,ENOTDIR:54,EISDIR:31,EINVAL:28,ENFILE:41,EMFILE:33,ENOTTY:59,ETXTBSY:74,EFBIG:22,ENOSPC:51,ESPIPE:70,EROFS:69,EMLINK:34,EPIPE:64,EDOM:18,ERANGE:68,ENOMSG:49,EIDRM:24,ECHRNG:106,EL2NSYNC:156,EL3HLT:107,EL3RST:108,ELNRNG:109,EUNATCH:110,ENOCSI:111,EL2HLT:112,EDEADLK:16,ENOLCK:46,EBADE:113,EBADR:114,EXFULL:115,ENOANO:104,EBADRQC:103,EBADSLT:102,EDEADLOCK:16,EBFONT:101,ENOSTR:100,ENODATA:116,ETIME:117,ENOSR:118,ENONET:119,ENOPKG:120,EREMOTE:121,ENOLINK:47,EADV:122,ESRMNT:123,ECOMM:124,EPROTO:65,EMULTIHOP:36,EDOTDOT:125,EBADMSG:9,ENOTUNIQ:126,EBADFD:127,EREMCHG:128,ELIBACC:129,ELIBBAD:130,ELIBSCN:131,ELIBMAX:132,ELIBEXEC:133,ENOSYS:52,ENOTEMPTY:55,ENAMETOOLONG:37,ELOOP:32,EOPNOTSUPP:138,EPFNOSUPPORT:139,ECONNRESET:15,ENOBUFS:42,EAFNOSUPPORT:5,EPROTOTYPE:67,ENOTSOCK:57,ENOPROTOOPT:50,ESHUTDOWN:140,ECONNREFUSED:14,EADDRINUSE:3,ECONNABORTED:13,ENETUNREACH:40,ENETDOWN:38,ETIMEDOUT:73,EHOSTDOWN:142,EHOSTUNREACH:23,EINPROGRESS:26,EALREADY:7,EDESTADDRREQ:17,EMSGSIZE:35,EPROTONOSUPPORT:66,ESOCKTNOSUPPORT:137,EADDRNOTAVAIL:4,ENETRESET:39,EISCONN:30,ENOTCONN:53,ETOOMANYREFS:141,EUSERS:136,EDQUOT:19,ESTALE:72,ENOTSUP:138,ENOMEDIUM:148,EILSEQ:25,EOVERFLOW:61,ECANCELED:11,ENOTRECOVERABLE:56,EOWNERDEAD:62,ESTRPIPE:135},At={isWindows:!1,staticInit:function(){At.isWindows=!!process.platform.match(/^win/);var d={fs:Le.constants};d.fs&&(d=d.fs),At.flagsForNodeMap={1024:d.O_APPEND,64:d.O_CREAT,128:d.O_EXCL,256:d.O_NOCTTY,0:d.O_RDONLY,2:d.O_RDWR,4096:d.O_SYNC,512:d.O_TRUNC,1:d.O_WRONLY}},bufferFrom:function(d){return Buffer.alloc?Buffer.from(d):new Buffer(d)},convertNodeCode:function(d){var E=d.code;return wo[E]},mount:function(d){return At.createNode(null,\"/\",At.getMode(d.opts.root),0)},createNode:function(d,E,I,k){if(!S.isDir(I)&&!S.isFile(I)&&!S.isLink(I))throw new S.ErrnoError(28);var L=S.createNode(d,E,I);return L.node_ops=At.node_ops,L.stream_ops=At.stream_ops,L},getMode:function(d){var E;try{E=Le.lstatSync(d),At.isWindows&&(E.mode=E.mode|(E.mode&292)>>2)}catch(I){throw I.code?new S.ErrnoError(At.convertNodeCode(I)):I}return E.mode},realPath:function(d){for(var E=[];d.parent!==d;)E.push(d.name),d=d.parent;return E.push(d.mount.opts.root),E.reverse(),Qt.join.apply(null,E)},flagsForNode:function(d){d&=-2097153,d&=-2049,d&=-32769,d&=-524289;var E=0;for(var I in At.flagsForNodeMap)d&I&&(E|=At.flagsForNodeMap[I],d^=I);if(d)throw new S.ErrnoError(28);return E},node_ops:{getattr:function(d){var E=At.realPath(d),I;try{I=Le.lstatSync(E)}catch(k){throw k.code?new S.ErrnoError(At.convertNodeCode(k)):k}return At.isWindows&&!I.blksize&&(I.blksize=4096),At.isWindows&&!I.blocks&&(I.blocks=(I.size+I.blksize-1)/I.blksize|0),{dev:I.dev,ino:I.ino,mode:I.mode,nlink:I.nlink,uid:I.uid,gid:I.gid,rdev:I.rdev,size:I.size,atime:I.atime,mtime:I.mtime,ctime:I.ctime,blksize:I.blksize,blocks:I.blocks}},setattr:function(d,E){var I=At.realPath(d);try{if(E.mode!==void 0&&(Le.chmodSync(I,E.mode),d.mode=E.mode),E.timestamp!==void 0){var k=new Date(E.timestamp);Le.utimesSync(I,k,k)}E.size!==void 0&&Le.truncateSync(I,E.size)}catch(L){throw L.code?new S.ErrnoError(At.convertNodeCode(L)):L}},lookup:function(d,E){var I=Qt.join2(At.realPath(d),E),k=At.getMode(I);return At.createNode(d,E,k)},mknod:function(d,E,I,k){var L=At.createNode(d,E,I,k),Z=At.realPath(L);try{S.isDir(L.mode)?Le.mkdirSync(Z,L.mode):Le.writeFileSync(Z,\"\",{mode:L.mode})}catch(te){throw te.code?new S.ErrnoError(At.convertNodeCode(te)):te}return L},rename:function(d,E,I){var k=At.realPath(d),L=Qt.join2(At.realPath(E),I);try{Le.renameSync(k,L)}catch(Z){throw Z.code?new S.ErrnoError(At.convertNodeCode(Z)):Z}d.name=I},unlink:function(d,E){var I=Qt.join2(At.realPath(d),E);try{Le.unlinkSync(I)}catch(k){throw k.code?new S.ErrnoError(At.convertNodeCode(k)):k}},rmdir:function(d,E){var I=Qt.join2(At.realPath(d),E);try{Le.rmdirSync(I)}catch(k){throw k.code?new S.ErrnoError(At.convertNodeCode(k)):k}},readdir:function(d){var E=At.realPath(d);try{return Le.readdirSync(E)}catch(I){throw I.code?new S.ErrnoError(At.convertNodeCode(I)):I}},symlink:function(d,E,I){var k=Qt.join2(At.realPath(d),E);try{Le.symlinkSync(I,k)}catch(L){throw L.code?new S.ErrnoError(At.convertNodeCode(L)):L}},readlink:function(d){var E=At.realPath(d);try{return E=Le.readlinkSync(E),E=dg.relative(dg.resolve(d.mount.opts.root),E),E}catch(I){throw I.code?new S.ErrnoError(At.convertNodeCode(I)):I}}},stream_ops:{open:function(d){var E=At.realPath(d.node);try{S.isFile(d.node.mode)&&(d.nfd=Le.openSync(E,At.flagsForNode(d.flags)))}catch(I){throw I.code?new S.ErrnoError(At.convertNodeCode(I)):I}},close:function(d){try{S.isFile(d.node.mode)&&d.nfd&&Le.closeSync(d.nfd)}catch(E){throw E.code?new S.ErrnoError(At.convertNodeCode(E)):E}},read:function(d,E,I,k,L){if(k===0)return 0;try{return Le.readSync(d.nfd,At.bufferFrom(E.buffer),I,k,L)}catch(Z){throw new S.ErrnoError(At.convertNodeCode(Z))}},write:function(d,E,I,k,L){try{return Le.writeSync(d.nfd,At.bufferFrom(E.buffer),I,k,L)}catch(Z){throw new S.ErrnoError(At.convertNodeCode(Z))}},llseek:function(d,E,I){var k=E;if(I===1)k+=d.position;else if(I===2&&S.isFile(d.node.mode))try{var L=Le.fstatSync(d.nfd);k+=L.size}catch(Z){throw new S.ErrnoError(At.convertNodeCode(Z))}if(k<0)throw new S.ErrnoError(28);return k},mmap:function(d,E,I,k,L,Z){if(E!==0)throw new S.ErrnoError(28);if(!S.isFile(d.node.mode))throw new S.ErrnoError(43);var te=ss(I);return At.stream_ops.read(d,ne,te,I,k),{ptr:te,allocated:!0}},msync:function(d,E,I,k,L){if(!S.isFile(d.node.mode))throw new S.ErrnoError(43);if(L&2)return 0;var Z=At.stream_ops.write(d,E,0,k,I,!1);return 0}}},ln={lookupPath:function(d){return{path:d,node:{mode:At.getMode(d)}}},createStandardStreams:function(){S.streams[0]={fd:0,nfd:0,position:0,path:\"\",flags:0,tty:!0,seekable:!1};for(var d=1;d<3;d++)S.streams[d]={fd:d,nfd:d,position:0,path:\"\",flags:577,tty:!0,seekable:!1}},cwd:function(){return process.cwd()},chdir:function(){process.chdir.apply(void 0,arguments)},mknod:function(d,E){S.isDir(d)?Le.mkdirSync(d,E):Le.writeFileSync(d,\"\",{mode:E})},mkdir:function(){Le.mkdirSync.apply(void 0,arguments)},symlink:function(){Le.symlinkSync.apply(void 0,arguments)},rename:function(){Le.renameSync.apply(void 0,arguments)},rmdir:function(){Le.rmdirSync.apply(void 0,arguments)},readdir:function(){Le.readdirSync.apply(void 0,arguments)},unlink:function(){Le.unlinkSync.apply(void 0,arguments)},readlink:function(){return Le.readlinkSync.apply(void 0,arguments)},stat:function(){return Le.statSync.apply(void 0,arguments)},lstat:function(){return Le.lstatSync.apply(void 0,arguments)},chmod:function(){Le.chmodSync.apply(void 0,arguments)},fchmod:function(){Le.fchmodSync.apply(void 0,arguments)},chown:function(){Le.chownSync.apply(void 0,arguments)},fchown:function(){Le.fchownSync.apply(void 0,arguments)},truncate:function(){Le.truncateSync.apply(void 0,arguments)},ftruncate:function(d,E){if(E<0)throw new S.ErrnoError(28);Le.ftruncateSync.apply(void 0,arguments)},utime:function(){Le.utimesSync.apply(void 0,arguments)},open:function(d,E,I,k){typeof E==\"string\"&&(E=Hs.modeStringToFlags(E));var L=Le.openSync(d,At.flagsForNode(E),I),Z=k!=null?k:S.nextfd(L),te={fd:Z,nfd:L,position:0,path:d,flags:E,seekable:!0};return S.streams[Z]=te,te},close:function(d){d.stream_ops||Le.closeSync(d.nfd),S.closeStream(d.fd)},llseek:function(d,E,I){if(d.stream_ops)return Hs.llseek(d,E,I);var k=E;if(I===1)k+=d.position;else if(I===2)k+=Le.fstatSync(d.nfd).size;else if(I!==0)throw new S.ErrnoError(wo.EINVAL);if(k<0)throw new S.ErrnoError(wo.EINVAL);return d.position=k,k},read:function(d,E,I,k,L){if(d.stream_ops)return Hs.read(d,E,I,k,L);var Z=typeof L<\"u\";!Z&&d.seekable&&(L=d.position);var te=Le.readSync(d.nfd,At.bufferFrom(E.buffer),I,k,L);return Z||(d.position+=te),te},write:function(d,E,I,k,L){if(d.stream_ops)return Hs.write(d,E,I,k,L);d.flags&+\"1024\"&&S.llseek(d,0,+\"2\");var Z=typeof L<\"u\";!Z&&d.seekable&&(L=d.position);var te=Le.writeSync(d.nfd,At.bufferFrom(E.buffer),I,k,L);return Z||(d.position+=te),te},allocate:function(){throw new S.ErrnoError(wo.EOPNOTSUPP)},mmap:function(d,E,I,k,L,Z){if(d.stream_ops)return Hs.mmap(d,E,I,k,L,Z);if(E!==0)throw new S.ErrnoError(28);var te=ss(I);return S.read(d,ne,te,I,k),{ptr:te,allocated:!0}},msync:function(d,E,I,k,L){return d.stream_ops?Hs.msync(d,E,I,k,L):(L&2||S.write(d,E,0,k,I),0)},munmap:function(){return 0},ioctl:function(){throw new S.ErrnoError(wo.ENOTTY)}},S={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:\"/\",initialized:!1,ignorePermissions:!0,trackingDelegate:{},tracking:{openFlags:{READ:1,WRITE:2}},ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,lookupPath:function(d,E){if(d=Nn.resolve(S.cwd(),d),E=E||{},!d)return{path:\"\",node:null};var I={follow_mount:!0,recurse_count:0};for(var k in I)E[k]===void 0&&(E[k]=I[k]);if(E.recurse_count>8)throw new S.ErrnoError(32);for(var L=Qt.normalizeArray(d.split(\"/\").filter(function(lt){return!!lt}),!1),Z=S.root,te=\"/\",we=0;we<L.length;we++){var me=we===L.length-1;if(me&&E.parent)break;if(Z=S.lookupNode(Z,L[we]),te=Qt.join2(te,L[we]),S.isMountpoint(Z)&&(!me||me&&E.follow_mount)&&(Z=Z.mounted.root),!me||E.follow)for(var Je=0;S.isLink(Z.mode);){var nt=S.readlink(te);te=Nn.resolve(Qt.dirname(te),nt);var wt=S.lookupPath(te,{recurse_count:E.recurse_count});if(Z=wt.node,Je++>40)throw new S.ErrnoError(32)}}return{path:te,node:Z}},getPath:function(d){for(var E;;){if(S.isRoot(d)){var I=d.mount.mountpoint;return E?I[I.length-1]!==\"/\"?I+\"/\"+E:I+E:I}E=E?d.name+\"/\"+E:d.name,d=d.parent}},hashName:function(d,E){for(var I=0,k=0;k<E.length;k++)I=(I<<5)-I+E.charCodeAt(k)|0;return(d+I>>>0)%S.nameTable.length},hashAddNode:function(d){var E=S.hashName(d.parent.id,d.name);d.name_next=S.nameTable[E],S.nameTable[E]=d},hashRemoveNode:function(d){var E=S.hashName(d.parent.id,d.name);if(S.nameTable[E]===d)S.nameTable[E]=d.name_next;else for(var I=S.nameTable[E];I;){if(I.name_next===d){I.name_next=d.name_next;break}I=I.name_next}},lookupNode:function(d,E){var I=S.mayLookup(d);if(I)throw new S.ErrnoError(I,d);for(var k=S.hashName(d.id,E),L=S.nameTable[k];L;L=L.name_next){var Z=L.name;if(L.parent.id===d.id&&Z===E)return L}return S.lookup(d,E)},createNode:function(d,E,I,k){var L=new S.FSNode(d,E,I,k);return S.hashAddNode(L),L},destroyNode:function(d){S.hashRemoveNode(d)},isRoot:function(d){return d===d.parent},isMountpoint:function(d){return!!d.mounted},isFile:function(d){return(d&61440)===32768},isDir:function(d){return(d&61440)===16384},isLink:function(d){return(d&61440)===40960},isChrdev:function(d){return(d&61440)===8192},isBlkdev:function(d){return(d&61440)===24576},isFIFO:function(d){return(d&61440)===4096},isSocket:function(d){return(d&49152)===49152},flagModes:{r:0,\"r+\":2,w:577,\"w+\":578,a:1089,\"a+\":1090},modeStringToFlags:function(d){var E=S.flagModes[d];if(typeof E>\"u\")throw new Error(\"Unknown file open mode: \"+d);return E},flagsToPermissionString:function(d){var E=[\"r\",\"w\",\"rw\"][d&3];return d&512&&(E+=\"w\"),E},nodePermissions:function(d,E){return S.ignorePermissions?0:E.includes(\"r\")&&!(d.mode&292)||E.includes(\"w\")&&!(d.mode&146)||E.includes(\"x\")&&!(d.mode&73)?2:0},mayLookup:function(d){var E=S.nodePermissions(d,\"x\");return E||(d.node_ops.lookup?0:2)},mayCreate:function(d,E){try{var I=S.lookupNode(d,E);return 20}catch{}return S.nodePermissions(d,\"wx\")},mayDelete:function(d,E,I){var k;try{k=S.lookupNode(d,E)}catch(Z){return Z.errno}var L=S.nodePermissions(d,\"wx\");if(L)return L;if(I){if(!S.isDir(k.mode))return 54;if(S.isRoot(k)||S.getPath(k)===S.cwd())return 10}else if(S.isDir(k.mode))return 31;return 0},mayOpen:function(d,E){return d?S.isLink(d.mode)?32:S.isDir(d.mode)&&(S.flagsToPermissionString(E)!==\"r\"||E&512)?31:S.nodePermissions(d,S.flagsToPermissionString(E)):44},MAX_OPEN_FDS:4096,nextfd:function(d,E){d=d||0,E=E||S.MAX_OPEN_FDS;for(var I=d;I<=E;I++)if(!S.streams[I])return I;throw new S.ErrnoError(33)},getStream:function(d){return S.streams[d]},createStream:function(d,E,I){S.FSStream||(S.FSStream=function(){},S.FSStream.prototype={object:{get:function(){return this.node},set:function(te){this.node=te}},isRead:{get:function(){return(this.flags&2097155)!==1}},isWrite:{get:function(){return(this.flags&2097155)!==0}},isAppend:{get:function(){return this.flags&1024}}});var k=new S.FSStream;for(var L in d)k[L]=d[L];d=k;var Z=S.nextfd(E,I);return d.fd=Z,S.streams[Z]=d,d},closeStream:function(d){S.streams[d]=null},chrdev_stream_ops:{open:function(d){var E=S.getDevice(d.node.rdev);d.stream_ops=E.stream_ops,d.stream_ops.open&&d.stream_ops.open(d)},llseek:function(){throw new S.ErrnoError(70)}},major:function(d){return d>>8},minor:function(d){return d&255},makedev:function(d,E){return d<<8|E},registerDevice:function(d,E){S.devices[d]={stream_ops:E}},getDevice:function(d){return S.devices[d]},getMounts:function(d){for(var E=[],I=[d];I.length;){var k=I.pop();E.push(k),I.push.apply(I,k.mounts)}return E},syncfs:function(d,E){typeof d==\"function\"&&(E=d,d=!1),S.syncFSRequests++,S.syncFSRequests>1&&D(\"warning: \"+S.syncFSRequests+\" FS.syncfs operations in flight at once, probably just doing extra work\");var I=S.getMounts(S.root.mount),k=0;function L(te){return S.syncFSRequests--,E(te)}function Z(te){if(te)return Z.errored?void 0:(Z.errored=!0,L(te));++k>=I.length&&L(null)}I.forEach(function(te){if(!te.type.syncfs)return Z(null);te.type.syncfs(te,d,Z)})},mount:function(d,E,I){var k=I===\"/\",L=!I,Z;if(k&&S.root)throw new S.ErrnoError(10);if(!k&&!L){var te=S.lookupPath(I,{follow_mount:!1});if(I=te.path,Z=te.node,S.isMountpoint(Z))throw new S.ErrnoError(10);if(!S.isDir(Z.mode))throw new S.ErrnoError(54)}var we={type:d,opts:E,mountpoint:I,mounts:[]},me=d.mount(we);return me.mount=we,we.root=me,k?S.root=me:Z&&(Z.mounted=we,Z.mount&&Z.mount.mounts.push(we)),me},unmount:function(d){var E=S.lookupPath(d,{follow_mount:!1});if(!S.isMountpoint(E.node))throw new S.ErrnoError(28);var I=E.node,k=I.mounted,L=S.getMounts(k);Object.keys(S.nameTable).forEach(function(te){for(var we=S.nameTable[te];we;){var me=we.name_next;L.includes(we.mount)&&S.destroyNode(we),we=me}}),I.mounted=null;var Z=I.mount.mounts.indexOf(k);I.mount.mounts.splice(Z,1)},lookup:function(d,E){return d.node_ops.lookup(d,E)},mknod:function(d,E,I){var k=S.lookupPath(d,{parent:!0}),L=k.node,Z=Qt.basename(d);if(!Z||Z===\".\"||Z===\"..\")throw new S.ErrnoError(28);var te=S.mayCreate(L,Z);if(te)throw new S.ErrnoError(te);if(!L.node_ops.mknod)throw new S.ErrnoError(63);return L.node_ops.mknod(L,Z,E,I)},create:function(d,E){return E=E!==void 0?E:438,E&=4095,E|=32768,S.mknod(d,E,0)},mkdir:function(d,E){return E=E!==void 0?E:511,E&=1023,E|=16384,S.mknod(d,E,0)},mkdirTree:function(d,E){for(var I=d.split(\"/\"),k=\"\",L=0;L<I.length;++L)if(!!I[L]){k+=\"/\"+I[L];try{S.mkdir(k,E)}catch(Z){if(Z.errno!=20)throw Z}}},mkdev:function(d,E,I){return typeof I>\"u\"&&(I=E,E=438),E|=8192,S.mknod(d,E,I)},symlink:function(d,E){if(!Nn.resolve(d))throw new S.ErrnoError(44);var I=S.lookupPath(E,{parent:!0}),k=I.node;if(!k)throw new S.ErrnoError(44);var L=Qt.basename(E),Z=S.mayCreate(k,L);if(Z)throw new S.ErrnoError(Z);if(!k.node_ops.symlink)throw new S.ErrnoError(63);return k.node_ops.symlink(k,L,d)},rename:function(d,E){var I=Qt.dirname(d),k=Qt.dirname(E),L=Qt.basename(d),Z=Qt.basename(E),te,we,me;if(te=S.lookupPath(d,{parent:!0}),we=te.node,te=S.lookupPath(E,{parent:!0}),me=te.node,!we||!me)throw new S.ErrnoError(44);if(we.mount!==me.mount)throw new S.ErrnoError(75);var Je=S.lookupNode(we,L),nt=Nn.relative(d,k);if(nt.charAt(0)!==\".\")throw new S.ErrnoError(28);if(nt=Nn.relative(E,I),nt.charAt(0)!==\".\")throw new S.ErrnoError(55);var wt;try{wt=S.lookupNode(me,Z)}catch{}if(Je!==wt){var lt=S.isDir(Je.mode),it=S.mayDelete(we,L,lt);if(it)throw new S.ErrnoError(it);if(it=wt?S.mayDelete(me,Z,lt):S.mayCreate(me,Z),it)throw new S.ErrnoError(it);if(!we.node_ops.rename)throw new S.ErrnoError(63);if(S.isMountpoint(Je)||wt&&S.isMountpoint(wt))throw new S.ErrnoError(10);if(me!==we&&(it=S.nodePermissions(we,\"w\"),it))throw new S.ErrnoError(it);try{S.trackingDelegate.willMovePath&&S.trackingDelegate.willMovePath(d,E)}catch(Et){D(\"FS.trackingDelegate['willMovePath']('\"+d+\"', '\"+E+\"') threw an exception: \"+Et.message)}S.hashRemoveNode(Je);try{we.node_ops.rename(Je,me,Z)}catch(Et){throw Et}finally{S.hashAddNode(Je)}try{S.trackingDelegate.onMovePath&&S.trackingDelegate.onMovePath(d,E)}catch(Et){D(\"FS.trackingDelegate['onMovePath']('\"+d+\"', '\"+E+\"') threw an exception: \"+Et.message)}}},rmdir:function(d){var E=S.lookupPath(d,{parent:!0}),I=E.node,k=Qt.basename(d),L=S.lookupNode(I,k),Z=S.mayDelete(I,k,!0);if(Z)throw new S.ErrnoError(Z);if(!I.node_ops.rmdir)throw new S.ErrnoError(63);if(S.isMountpoint(L))throw new S.ErrnoError(10);try{S.trackingDelegate.willDeletePath&&S.trackingDelegate.willDeletePath(d)}catch(te){D(\"FS.trackingDelegate['willDeletePath']('\"+d+\"') threw an exception: \"+te.message)}I.node_ops.rmdir(I,k),S.destroyNode(L);try{S.trackingDelegate.onDeletePath&&S.trackingDelegate.onDeletePath(d)}catch(te){D(\"FS.trackingDelegate['onDeletePath']('\"+d+\"') threw an exception: \"+te.message)}},readdir:function(d){var E=S.lookupPath(d,{follow:!0}),I=E.node;if(!I.node_ops.readdir)throw new S.ErrnoError(54);return I.node_ops.readdir(I)},unlink:function(d){var E=S.lookupPath(d,{parent:!0}),I=E.node,k=Qt.basename(d),L=S.lookupNode(I,k),Z=S.mayDelete(I,k,!1);if(Z)throw new S.ErrnoError(Z);if(!I.node_ops.unlink)throw new S.ErrnoError(63);if(S.isMountpoint(L))throw new S.ErrnoError(10);try{S.trackingDelegate.willDeletePath&&S.trackingDelegate.willDeletePath(d)}catch(te){D(\"FS.trackingDelegate['willDeletePath']('\"+d+\"') threw an exception: \"+te.message)}I.node_ops.unlink(I,k),S.destroyNode(L);try{S.trackingDelegate.onDeletePath&&S.trackingDelegate.onDeletePath(d)}catch(te){D(\"FS.trackingDelegate['onDeletePath']('\"+d+\"') threw an exception: \"+te.message)}},readlink:function(d){var E=S.lookupPath(d),I=E.node;if(!I)throw new S.ErrnoError(44);if(!I.node_ops.readlink)throw new S.ErrnoError(28);return Nn.resolve(S.getPath(I.parent),I.node_ops.readlink(I))},stat:function(d,E){var I=S.lookupPath(d,{follow:!E}),k=I.node;if(!k)throw new S.ErrnoError(44);if(!k.node_ops.getattr)throw new S.ErrnoError(63);return k.node_ops.getattr(k)},lstat:function(d){return S.stat(d,!0)},chmod:function(d,E,I){var k;if(typeof d==\"string\"){var L=S.lookupPath(d,{follow:!I});k=L.node}else k=d;if(!k.node_ops.setattr)throw new S.ErrnoError(63);k.node_ops.setattr(k,{mode:E&4095|k.mode&-4096,timestamp:Date.now()})},lchmod:function(d,E){S.chmod(d,E,!0)},fchmod:function(d,E){var I=S.getStream(d);if(!I)throw new S.ErrnoError(8);S.chmod(I.node,E)},chown:function(d,E,I,k){var L;if(typeof d==\"string\"){var Z=S.lookupPath(d,{follow:!k});L=Z.node}else L=d;if(!L.node_ops.setattr)throw new S.ErrnoError(63);L.node_ops.setattr(L,{timestamp:Date.now()})},lchown:function(d,E,I){S.chown(d,E,I,!0)},fchown:function(d,E,I){var k=S.getStream(d);if(!k)throw new S.ErrnoError(8);S.chown(k.node,E,I)},truncate:function(d,E){if(E<0)throw new S.ErrnoError(28);var I;if(typeof d==\"string\"){var k=S.lookupPath(d,{follow:!0});I=k.node}else I=d;if(!I.node_ops.setattr)throw new S.ErrnoError(63);if(S.isDir(I.mode))throw new S.ErrnoError(31);if(!S.isFile(I.mode))throw new S.ErrnoError(28);var L=S.nodePermissions(I,\"w\");if(L)throw new S.ErrnoError(L);I.node_ops.setattr(I,{size:E,timestamp:Date.now()})},ftruncate:function(d,E){var I=S.getStream(d);if(!I)throw new S.ErrnoError(8);if((I.flags&2097155)===0)throw new S.ErrnoError(28);S.truncate(I.node,E)},utime:function(d,E,I){var k=S.lookupPath(d,{follow:!0}),L=k.node;L.node_ops.setattr(L,{timestamp:Math.max(E,I)})},open:function(d,E,I,k,L){if(d===\"\")throw new S.ErrnoError(44);E=typeof E==\"string\"?S.modeStringToFlags(E):E,I=typeof I>\"u\"?438:I,E&64?I=I&4095|32768:I=0;var Z;if(typeof d==\"object\")Z=d;else{d=Qt.normalize(d);try{var te=S.lookupPath(d,{follow:!(E&131072)});Z=te.node}catch{}}var we=!1;if(E&64)if(Z){if(E&128)throw new S.ErrnoError(20)}else Z=S.mknod(d,I,0),we=!0;if(!Z)throw new S.ErrnoError(44);if(S.isChrdev(Z.mode)&&(E&=-513),E&65536&&!S.isDir(Z.mode))throw new S.ErrnoError(54);if(!we){var me=S.mayOpen(Z,E);if(me)throw new S.ErrnoError(me)}E&512&&S.truncate(Z,0),E&=-131713;var Je=S.createStream({node:Z,path:S.getPath(Z),flags:E,seekable:!0,position:0,stream_ops:Z.stream_ops,ungotten:[],error:!1},k,L);Je.stream_ops.open&&Je.stream_ops.open(Je),t.logReadFiles&&!(E&1)&&(S.readFiles||(S.readFiles={}),d in S.readFiles||(S.readFiles[d]=1,D(\"FS.trackingDelegate error on read file: \"+d)));try{if(S.trackingDelegate.onOpenFile){var nt=0;(E&2097155)!==1&&(nt|=S.tracking.openFlags.READ),(E&2097155)!==0&&(nt|=S.tracking.openFlags.WRITE),S.trackingDelegate.onOpenFile(d,nt)}}catch(wt){D(\"FS.trackingDelegate['onOpenFile']('\"+d+\"', flags) threw an exception: \"+wt.message)}return Je},close:function(d){if(S.isClosed(d))throw new S.ErrnoError(8);d.getdents&&(d.getdents=null);try{d.stream_ops.close&&d.stream_ops.close(d)}catch(E){throw E}finally{S.closeStream(d.fd)}d.fd=null},isClosed:function(d){return d.fd===null},llseek:function(d,E,I){if(S.isClosed(d))throw new S.ErrnoError(8);if(!d.seekable||!d.stream_ops.llseek)throw new S.ErrnoError(70);if(I!=0&&I!=1&&I!=2)throw new S.ErrnoError(28);return d.position=d.stream_ops.llseek(d,E,I),d.ungotten=[],d.position},read:function(d,E,I,k,L){if(k<0||L<0)throw new S.ErrnoError(28);if(S.isClosed(d))throw new S.ErrnoError(8);if((d.flags&2097155)===1)throw new S.ErrnoError(8);if(S.isDir(d.node.mode))throw new S.ErrnoError(31);if(!d.stream_ops.read)throw new S.ErrnoError(28);var Z=typeof L<\"u\";if(!Z)L=d.position;else if(!d.seekable)throw new S.ErrnoError(70);var te=d.stream_ops.read(d,E,I,k,L);return Z||(d.position+=te),te},write:function(d,E,I,k,L,Z){if(k<0||L<0)throw new S.ErrnoError(28);if(S.isClosed(d))throw new S.ErrnoError(8);if((d.flags&2097155)===0)throw new S.ErrnoError(8);if(S.isDir(d.node.mode))throw new S.ErrnoError(31);if(!d.stream_ops.write)throw new S.ErrnoError(28);d.seekable&&d.flags&1024&&S.llseek(d,0,2);var te=typeof L<\"u\";if(!te)L=d.position;else if(!d.seekable)throw new S.ErrnoError(70);var we=d.stream_ops.write(d,E,I,k,L,Z);te||(d.position+=we);try{d.path&&S.trackingDelegate.onWriteToFile&&S.trackingDelegate.onWriteToFile(d.path)}catch(me){D(\"FS.trackingDelegate['onWriteToFile']('\"+d.path+\"') threw an exception: \"+me.message)}return we},allocate:function(d,E,I){if(S.isClosed(d))throw new S.ErrnoError(8);if(E<0||I<=0)throw new S.ErrnoError(28);if((d.flags&2097155)===0)throw new S.ErrnoError(8);if(!S.isFile(d.node.mode)&&!S.isDir(d.node.mode))throw new S.ErrnoError(43);if(!d.stream_ops.allocate)throw new S.ErrnoError(138);d.stream_ops.allocate(d,E,I)},mmap:function(d,E,I,k,L,Z){if((L&2)!==0&&(Z&2)===0&&(d.flags&2097155)!==2)throw new S.ErrnoError(2);if((d.flags&2097155)===1)throw new S.ErrnoError(2);if(!d.stream_ops.mmap)throw new S.ErrnoError(43);return d.stream_ops.mmap(d,E,I,k,L,Z)},msync:function(d,E,I,k,L){return!d||!d.stream_ops.msync?0:d.stream_ops.msync(d,E,I,k,L)},munmap:function(d){return 0},ioctl:function(d,E,I){if(!d.stream_ops.ioctl)throw new S.ErrnoError(59);return d.stream_ops.ioctl(d,E,I)},readFile:function(d,E){if(E=E||{},E.flags=E.flags||0,E.encoding=E.encoding||\"binary\",E.encoding!==\"utf8\"&&E.encoding!==\"binary\")throw new Error('Invalid encoding type \"'+E.encoding+'\"');var I,k=S.open(d,E.flags),L=S.stat(d),Z=L.size,te=new Uint8Array(Z);return S.read(k,te,0,Z,0),E.encoding===\"utf8\"?I=ke(te,0):E.encoding===\"binary\"&&(I=te),S.close(k),I},writeFile:function(d,E,I){I=I||{},I.flags=I.flags||577;var k=S.open(d,I.flags,I.mode);if(typeof E==\"string\"){var L=new Uint8Array(le(E)+1),Z=Ne(E,L,0,L.length);S.write(k,L,0,Z,void 0,I.canOwn)}else if(ArrayBuffer.isView(E))S.write(k,E,0,E.byteLength,void 0,I.canOwn);else throw new Error(\"Unsupported data type\");S.close(k)},cwd:function(){return S.currentPath},chdir:function(d){var E=S.lookupPath(d,{follow:!0});if(E.node===null)throw new S.ErrnoError(44);if(!S.isDir(E.node.mode))throw new S.ErrnoError(54);var I=S.nodePermissions(E.node,\"x\");if(I)throw new S.ErrnoError(I);S.currentPath=E.path},createDefaultDirectories:function(){S.mkdir(\"/tmp\"),S.mkdir(\"/home\"),S.mkdir(\"/home/web_user\")},createDefaultDevices:function(){S.mkdir(\"/dev\"),S.registerDevice(S.makedev(1,3),{read:function(){return 0},write:function(E,I,k,L,Z){return L}}),S.mkdev(\"/dev/null\",S.makedev(1,3)),ns.register(S.makedev(5,0),ns.default_tty_ops),ns.register(S.makedev(6,0),ns.default_tty1_ops),S.mkdev(\"/dev/tty\",S.makedev(5,0)),S.mkdev(\"/dev/tty1\",S.makedev(6,0));var d=Ll();S.createDevice(\"/dev\",\"random\",d),S.createDevice(\"/dev\",\"urandom\",d),S.mkdir(\"/dev/shm\"),S.mkdir(\"/dev/shm/tmp\")},createSpecialDirectories:function(){S.mkdir(\"/proc\");var d=S.mkdir(\"/proc/self\");S.mkdir(\"/proc/self/fd\"),S.mount({mount:function(){var E=S.createNode(d,\"fd\",16895,73);return E.node_ops={lookup:function(I,k){var L=+k,Z=S.getStream(L);if(!Z)throw new S.ErrnoError(8);var te={parent:null,mount:{mountpoint:\"fake\"},node_ops:{readlink:function(){return Z.path}}};return te.parent=te,te}},E}},{},\"/proc/self/fd\")},createStandardStreams:function(){t.stdin?S.createDevice(\"/dev\",\"stdin\",t.stdin):S.symlink(\"/dev/tty\",\"/dev/stdin\"),t.stdout?S.createDevice(\"/dev\",\"stdout\",null,t.stdout):S.symlink(\"/dev/tty\",\"/dev/stdout\"),t.stderr?S.createDevice(\"/dev\",\"stderr\",null,t.stderr):S.symlink(\"/dev/tty1\",\"/dev/stderr\");var d=S.open(\"/dev/stdin\",0),E=S.open(\"/dev/stdout\",1),I=S.open(\"/dev/stderr\",1)},ensureErrnoError:function(){S.ErrnoError||(S.ErrnoError=function(E,I){this.node=I,this.setErrno=function(k){this.errno=k},this.setErrno(E),this.message=\"FS error\"},S.ErrnoError.prototype=new Error,S.ErrnoError.prototype.constructor=S.ErrnoError,[44].forEach(function(d){S.genericErrors[d]=new S.ErrnoError(d),S.genericErrors[d].stack=\"<generic error, no stack>\"}))},staticInit:function(){S.ensureErrnoError(),S.nameTable=new Array(4096),S.mount(gt,{},\"/\"),S.createDefaultDirectories(),S.createDefaultDevices(),S.createSpecialDirectories(),S.filesystems={MEMFS:gt,NODEFS:At}},init:function(d,E,I){S.init.initialized=!0,S.ensureErrnoError(),t.stdin=d||t.stdin,t.stdout=E||t.stdout,t.stderr=I||t.stderr,S.createStandardStreams()},quit:function(){S.init.initialized=!1;var d=t._fflush;d&&d(0);for(var E=0;E<S.streams.length;E++){var I=S.streams[E];!I||S.close(I)}},getMode:function(d,E){var I=0;return d&&(I|=365),E&&(I|=146),I},findObject:function(d,E){var I=S.analyzePath(d,E);return I.exists?I.object:null},analyzePath:function(d,E){try{var I=S.lookupPath(d,{follow:!E});d=I.path}catch{}var k={isRoot:!1,exists:!1,error:0,name:null,path:null,object:null,parentExists:!1,parentPath:null,parentObject:null};try{var I=S.lookupPath(d,{parent:!0});k.parentExists=!0,k.parentPath=I.path,k.parentObject=I.node,k.name=Qt.basename(d),I=S.lookupPath(d,{follow:!E}),k.exists=!0,k.path=I.path,k.object=I.node,k.name=I.node.name,k.isRoot=I.path===\"/\"}catch(L){k.error=L.errno}return k},createPath:function(d,E,I,k){d=typeof d==\"string\"?d:S.getPath(d);for(var L=E.split(\"/\").reverse();L.length;){var Z=L.pop();if(!!Z){var te=Qt.join2(d,Z);try{S.mkdir(te)}catch{}d=te}}return te},createFile:function(d,E,I,k,L){var Z=Qt.join2(typeof d==\"string\"?d:S.getPath(d),E),te=S.getMode(k,L);return S.create(Z,te)},createDataFile:function(d,E,I,k,L,Z){var te=E?Qt.join2(typeof d==\"string\"?d:S.getPath(d),E):d,we=S.getMode(k,L),me=S.create(te,we);if(I){if(typeof I==\"string\"){for(var Je=new Array(I.length),nt=0,wt=I.length;nt<wt;++nt)Je[nt]=I.charCodeAt(nt);I=Je}S.chmod(me,we|146);var lt=S.open(me,577);S.write(lt,I,0,I.length,0,Z),S.close(lt),S.chmod(me,we)}return me},createDevice:function(d,E,I,k){var L=Qt.join2(typeof d==\"string\"?d:S.getPath(d),E),Z=S.getMode(!!I,!!k);S.createDevice.major||(S.createDevice.major=64);var te=S.makedev(S.createDevice.major++,0);return S.registerDevice(te,{open:function(we){we.seekable=!1},close:function(we){k&&k.buffer&&k.buffer.length&&k(10)},read:function(we,me,Je,nt,wt){for(var lt=0,it=0;it<nt;it++){var Et;try{Et=I()}catch{throw new S.ErrnoError(29)}if(Et===void 0&&lt===0)throw new S.ErrnoError(6);if(Et==null)break;lt++,me[Je+it]=Et}return lt&&(we.node.timestamp=Date.now()),lt},write:function(we,me,Je,nt,wt){for(var lt=0;lt<nt;lt++)try{k(me[Je+lt])}catch{throw new S.ErrnoError(29)}return nt&&(we.node.timestamp=Date.now()),lt}}),S.mkdev(L,Z,te)},forceLoadFile:function(d){if(d.isDevice||d.isFolder||d.link||d.contents)return!0;if(typeof XMLHttpRequest<\"u\")throw new Error(\"Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.\");if(p)try{d.contents=wA(p(d.url),!0),d.usedBytes=d.contents.length}catch{throw new S.ErrnoError(29)}else throw new Error(\"Cannot load without read() or XMLHttpRequest.\")},createLazyFile:function(d,E,I,k,L){function Z(){this.lengthKnown=!1,this.chunks=[]}if(Z.prototype.get=function(lt){if(!(lt>this.length-1||lt<0)){var it=lt%this.chunkSize,Et=lt/this.chunkSize|0;return this.getter(Et)[it]}},Z.prototype.setDataGetter=function(lt){this.getter=lt},Z.prototype.cacheLength=function(){var lt=new XMLHttpRequest;if(lt.open(\"HEAD\",I,!1),lt.send(null),!(lt.status>=200&&lt.status<300||lt.status===304))throw new Error(\"Couldn't load \"+I+\". Status: \"+lt.status);var it=Number(lt.getResponseHeader(\"Content-length\")),Et,Qe=(Et=lt.getResponseHeader(\"Accept-Ranges\"))&&Et===\"bytes\",On=(Et=lt.getResponseHeader(\"Content-Encoding\"))&&Et===\"gzip\",Ri=1024*1024;Qe||(Ri=it);var vA=function(os,Ea){if(os>Ea)throw new Error(\"invalid range (\"+os+\", \"+Ea+\") or no bytes requested!\");if(Ea>it-1)throw new Error(\"only \"+it+\" bytes available! programmer error!\");var Kr=new XMLHttpRequest;if(Kr.open(\"GET\",I,!1),it!==Ri&&Kr.setRequestHeader(\"Range\",\"bytes=\"+os+\"-\"+Ea),typeof Uint8Array<\"u\"&&(Kr.responseType=\"arraybuffer\"),Kr.overrideMimeType&&Kr.overrideMimeType(\"text/plain; charset=x-user-defined\"),Kr.send(null),!(Kr.status>=200&&Kr.status<300||Kr.status===304))throw new Error(\"Couldn't load \"+I+\". Status: \"+Kr.status);return Kr.response!==void 0?new Uint8Array(Kr.response||[]):wA(Kr.responseText||\"\",!0)},Mr=this;Mr.setDataGetter(function(os){var Ea=os*Ri,Kr=(os+1)*Ri-1;if(Kr=Math.min(Kr,it-1),typeof Mr.chunks[os]>\"u\"&&(Mr.chunks[os]=vA(Ea,Kr)),typeof Mr.chunks[os]>\"u\")throw new Error(\"doXHR failed!\");return Mr.chunks[os]}),(On||!it)&&(Ri=it=1,it=this.getter(0).length,Ri=it,v(\"LazyFiles on gzip forces download of the whole file when length is accessed\")),this._length=it,this._chunkSize=Ri,this.lengthKnown=!0},typeof XMLHttpRequest<\"u\"){if(!u)throw\"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc\";var te=new Z;Object.defineProperties(te,{length:{get:function(){return this.lengthKnown||this.cacheLength(),this._length}},chunkSize:{get:function(){return this.lengthKnown||this.cacheLength(),this._chunkSize}}});var we={isDevice:!1,contents:te}}else var we={isDevice:!1,url:I};var me=S.createFile(d,E,we,k,L);we.contents?me.contents=we.contents:we.url&&(me.contents=null,me.url=we.url),Object.defineProperties(me,{usedBytes:{get:function(){return this.contents.length}}});var Je={},nt=Object.keys(me.stream_ops);return nt.forEach(function(wt){var lt=me.stream_ops[wt];Je[wt]=function(){return S.forceLoadFile(me),lt.apply(null,arguments)}}),Je.read=function(lt,it,Et,Qe,On){S.forceLoadFile(me);var Ri=lt.node.contents;if(On>=Ri.length)return 0;var vA=Math.min(Ri.length-On,Qe);if(Ri.slice)for(var Mr=0;Mr<vA;Mr++)it[Et+Mr]=Ri[On+Mr];else for(var Mr=0;Mr<vA;Mr++)it[Et+Mr]=Ri.get(On+Mr);return vA},me.stream_ops=Je,me},createPreloadedFile:function(d,E,I,k,L,Z,te,we,me,Je){Browser.init();var nt=E?Nn.resolve(Qt.join2(d,E)):d,wt=\"cp \"+nt;function lt(it){function Et(On){Je&&Je(),we||S.createDataFile(d,E,On,k,L,me),Z&&Z(),IA(wt)}var Qe=!1;t.preloadPlugins.forEach(function(On){Qe||On.canHandle(nt)&&(On.handle(it,nt,Et,function(){te&&te(),IA(wt)}),Qe=!0)}),Qe||Et(it)}EA(wt),typeof I==\"string\"?Browser.asyncLoad(I,function(it){lt(it)},te):lt(I)},indexedDB:function(){return window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB},DB_NAME:function(){return\"EM_FS_\"+window.location.pathname},DB_VERSION:20,DB_STORE_NAME:\"FILE_DATA\",saveFilesToDB:function(d,E,I){E=E||function(){},I=I||function(){};var k=S.indexedDB();try{var L=k.open(S.DB_NAME(),S.DB_VERSION)}catch(Z){return I(Z)}L.onupgradeneeded=function(){v(\"creating db\");var te=L.result;te.createObjectStore(S.DB_STORE_NAME)},L.onsuccess=function(){var te=L.result,we=te.transaction([S.DB_STORE_NAME],\"readwrite\"),me=we.objectStore(S.DB_STORE_NAME),Je=0,nt=0,wt=d.length;function lt(){nt==0?E():I()}d.forEach(function(it){var Et=me.put(S.analyzePath(it).object.contents,it);Et.onsuccess=function(){Je++,Je+nt==wt&&lt()},Et.onerror=function(){nt++,Je+nt==wt&&lt()}}),we.onerror=I},L.onerror=I},loadFilesFromDB:function(d,E,I){E=E||function(){},I=I||function(){};var k=S.indexedDB();try{var L=k.open(S.DB_NAME(),S.DB_VERSION)}catch(Z){return I(Z)}L.onupgradeneeded=I,L.onsuccess=function(){var te=L.result;try{var we=te.transaction([S.DB_STORE_NAME],\"readonly\")}catch(it){I(it);return}var me=we.objectStore(S.DB_STORE_NAME),Je=0,nt=0,wt=d.length;function lt(){nt==0?E():I()}d.forEach(function(it){var Et=me.get(it);Et.onsuccess=function(){S.analyzePath(it).exists&&S.unlink(it),S.createDataFile(Qt.dirname(it),Qt.basename(it),Et.result,!0,!0,!0),Je++,Je+nt==wt&&lt()},Et.onerror=function(){nt++,Je+nt==wt&&lt()}}),we.onerror=I},L.onerror=I}},Lt={mappings:{},DEFAULT_POLLMASK:5,umask:511,calculateAt:function(d,E,I){if(E[0]===\"/\")return E;var k;if(d===-100)k=S.cwd();else{var L=S.getStream(d);if(!L)throw new S.ErrnoError(8);k=L.path}if(E.length==0){if(!I)throw new S.ErrnoError(44);return k}return Qt.join2(k,E)},doStat:function(d,E,I){try{var k=d(E)}catch(L){if(L&&L.node&&Qt.normalize(E)!==Qt.normalize(S.getPath(L.node)))return-54;throw L}return de[I>>2]=k.dev,de[I+4>>2]=0,de[I+8>>2]=k.ino,de[I+12>>2]=k.mode,de[I+16>>2]=k.nlink,de[I+20>>2]=k.uid,de[I+24>>2]=k.gid,de[I+28>>2]=k.rdev,de[I+32>>2]=0,se=[k.size>>>0,(vr=k.size,+Math.abs(vr)>=1?vr>0?(Math.min(+Math.floor(vr/4294967296),4294967295)|0)>>>0:~~+Math.ceil((vr-+(~~vr>>>0))/4294967296)>>>0:0)],de[I+40>>2]=se[0],de[I+44>>2]=se[1],de[I+48>>2]=4096,de[I+52>>2]=k.blocks,de[I+56>>2]=k.atime.getTime()/1e3|0,de[I+60>>2]=0,de[I+64>>2]=k.mtime.getTime()/1e3|0,de[I+68>>2]=0,de[I+72>>2]=k.ctime.getTime()/1e3|0,de[I+76>>2]=0,se=[k.ino>>>0,(vr=k.ino,+Math.abs(vr)>=1?vr>0?(Math.min(+Math.floor(vr/4294967296),4294967295)|0)>>>0:~~+Math.ceil((vr-+(~~vr>>>0))/4294967296)>>>0:0)],de[I+80>>2]=se[0],de[I+84>>2]=se[1],0},doMsync:function(d,E,I,k,L){var Z=Y.slice(d,d+I);S.msync(E,Z,L,I,k)},doMkdir:function(d,E){return d=Qt.normalize(d),d[d.length-1]===\"/\"&&(d=d.substr(0,d.length-1)),S.mkdir(d,E,0),0},doMknod:function(d,E,I){switch(E&61440){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-28}return S.mknod(d,E,I),0},doReadlink:function(d,E,I){if(I<=0)return-28;var k=S.readlink(d),L=Math.min(I,le(k)),Z=ne[E+L];return oe(k,E,I+1),ne[E+L]=Z,L},doAccess:function(d,E){if(E&-8)return-28;var I,k=S.lookupPath(d,{follow:!0});if(I=k.node,!I)return-44;var L=\"\";return E&4&&(L+=\"r\"),E&2&&(L+=\"w\"),E&1&&(L+=\"x\"),L&&S.nodePermissions(I,L)?-2:0},doDup:function(d,E,I){var k=S.getStream(I);return k&&S.close(k),S.open(d,E,0,I,I).fd},doReadv:function(d,E,I,k){for(var L=0,Z=0;Z<I;Z++){var te=de[E+Z*8>>2],we=de[E+(Z*8+4)>>2],me=S.read(d,ne,te,we,k);if(me<0)return-1;if(L+=me,me<we)break}return L},doWritev:function(d,E,I,k){for(var L=0,Z=0;Z<I;Z++){var te=de[E+Z*8>>2],we=de[E+(Z*8+4)>>2],me=S.write(d,ne,te,we,k);if(me<0)return-1;L+=me}return L},varargs:void 0,get:function(){Lt.varargs+=4;var d=de[Lt.varargs-4>>2];return d},getStr:function(d){var E=Fe(d);return E},getStreamFromFD:function(d){var E=S.getStream(d);if(!E)throw new S.ErrnoError(8);return E},get64:function(d,E){return d}};function hg(d,E){try{return d=Lt.getStr(d),S.chmod(d,E),0}catch(I){return(typeof S>\"u\"||!(I instanceof S.ErrnoError))&&wr(I),-I.errno}}function Ol(d){return de[Ft()>>2]=d,d}function bp(d,E,I){Lt.varargs=I;try{var k=Lt.getStreamFromFD(d);switch(E){case 0:{var L=Lt.get();if(L<0)return-28;var Z;return Z=S.open(k.path,k.flags,0,L),Z.fd}case 1:case 2:return 0;case 3:return k.flags;case 4:{var L=Lt.get();return k.flags|=L,0}case 12:{var L=Lt.get(),te=0;return he[L+te>>1]=2,0}case 13:case 14:return 0;case 16:case 8:return-28;case 9:return Ol(28),-1;default:return-28}}catch(we){return(typeof S>\"u\"||!(we instanceof S.ErrnoError))&&wr(we),-we.errno}}function Sp(d,E){try{var I=Lt.getStreamFromFD(d);return Lt.doStat(S.stat,I.path,E)}catch(k){return(typeof S>\"u\"||!(k instanceof S.ErrnoError))&&wr(k),-k.errno}}function vp(d,E,I){Lt.varargs=I;try{var k=Lt.getStreamFromFD(d);switch(E){case 21509:case 21505:return k.tty?0:-59;case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:return k.tty?0:-59;case 21519:{if(!k.tty)return-59;var L=Lt.get();return de[L>>2]=0,0}case 21520:return k.tty?-28:-59;case 21531:{var L=Lt.get();return S.ioctl(k,E,L)}case 21523:return k.tty?0:-59;case 21524:return k.tty?0:-59;default:wr(\"bad ioctl syscall \"+E)}}catch(Z){return(typeof S>\"u\"||!(Z instanceof S.ErrnoError))&&wr(Z),-Z.errno}}function xp(d,E,I){Lt.varargs=I;try{var k=Lt.getStr(d),L=I?Lt.get():0,Z=S.open(k,E,L);return Z.fd}catch(te){return(typeof S>\"u\"||!(te instanceof S.ErrnoError))&&wr(te),-te.errno}}function Pp(d,E){try{return d=Lt.getStr(d),E=Lt.getStr(E),S.rename(d,E),0}catch(I){return(typeof S>\"u\"||!(I instanceof S.ErrnoError))&&wr(I),-I.errno}}function G(d){try{return d=Lt.getStr(d),S.rmdir(d),0}catch(E){return(typeof S>\"u\"||!(E instanceof S.ErrnoError))&&wr(E),-E.errno}}function yt(d,E){try{return d=Lt.getStr(d),Lt.doStat(S.stat,d,E)}catch(I){return(typeof S>\"u\"||!(I instanceof S.ErrnoError))&&wr(I),-I.errno}}function yA(d){try{return d=Lt.getStr(d),S.unlink(d),0}catch(E){return(typeof S>\"u\"||!(E instanceof S.ErrnoError))&&wr(E),-E.errno}}function zi(d,E,I){Y.copyWithin(d,E,E+I)}function Ml(d){try{return A.grow(d-qe.byteLength+65535>>>16),Or(A.buffer),1}catch{}}function Xe(d){var E=Y.length;d=d>>>0;var I=2147483648;if(d>I)return!1;for(var k=1;k<=4;k*=2){var L=E*(1+.2/k);L=Math.min(L,d+100663296);var Z=Math.min(I,ae(Math.max(d,L),65536)),te=Ml(Z);if(te)return!0}return!1}function pa(d){try{var E=Lt.getStreamFromFD(d);return S.close(E),0}catch(I){return(typeof S>\"u\"||!(I instanceof S.ErrnoError))&&wr(I),I.errno}}function pg(d,E){try{var I=Lt.getStreamFromFD(d),k=I.tty?2:S.isDir(I.mode)?3:S.isLink(I.mode)?7:4;return ne[E>>0]=k,0}catch(L){return(typeof S>\"u\"||!(L instanceof S.ErrnoError))&&wr(L),L.errno}}function OE(d,E,I,k){try{var L=Lt.getStreamFromFD(d),Z=Lt.doReadv(L,E,I);return de[k>>2]=Z,0}catch(te){return(typeof S>\"u\"||!(te instanceof S.ErrnoError))&&wr(te),te.errno}}function Dp(d,E,I,k,L){try{var Z=Lt.getStreamFromFD(d),te=4294967296,we=I*te+(E>>>0),me=9007199254740992;return we<=-me||we>=me?-61:(S.llseek(Z,we,k),se=[Z.position>>>0,(vr=Z.position,+Math.abs(vr)>=1?vr>0?(Math.min(+Math.floor(vr/4294967296),4294967295)|0)>>>0:~~+Math.ceil((vr-+(~~vr>>>0))/4294967296)>>>0:0)],de[L>>2]=se[0],de[L+4>>2]=se[1],Z.getdents&&we===0&&k===0&&(Z.getdents=null),0)}catch(Je){return(typeof S>\"u\"||!(Je instanceof S.ErrnoError))&&wr(Je),Je.errno}}function ME(d,E,I,k){try{var L=Lt.getStreamFromFD(d),Z=Lt.doWritev(L,E,I);return de[k>>2]=Z,0}catch(te){return(typeof S>\"u\"||!(te instanceof S.ErrnoError))&&wr(te),te.errno}}function ar(d){$(d)}function Tn(d){var E=Date.now()/1e3|0;return d&&(de[d>>2]=E),E}function Kl(){if(Kl.called)return;Kl.called=!0;var d=new Date().getFullYear(),E=new Date(d,0,1),I=new Date(d,6,1),k=E.getTimezoneOffset(),L=I.getTimezoneOffset(),Z=Math.max(k,L);de[iS()>>2]=Z*60,de[rS()>>2]=Number(k!=L);function te(wt){var lt=wt.toTimeString().match(/\\(([A-Za-z ]+)\\)$/);return lt?lt[1]:\"GMT\"}var we=te(E),me=te(I),Je=Be(we),nt=Be(me);L<k?(de[wg()>>2]=Je,de[wg()+4>>2]=nt):(de[wg()>>2]=nt,de[wg()+4>>2]=Je)}function kp(d){Kl();var E=Date.UTC(de[d+20>>2]+1900,de[d+16>>2],de[d+12>>2],de[d+8>>2],de[d+4>>2],de[d>>2],0),I=new Date(E);de[d+24>>2]=I.getUTCDay();var k=Date.UTC(I.getUTCFullYear(),0,1,0,0,0,0),L=(I.getTime()-k)/(1e3*60*60*24)|0;return de[d+28>>2]=L,I.getTime()/1e3|0}var Us=function(d,E,I,k){d||(d=this),this.parent=d,this.mount=d.mount,this.mounted=null,this.id=S.nextInode++,this.name=E,this.mode=I,this.node_ops={},this.stream_ops={},this.rdev=k},da=365,cn=146;if(Object.defineProperties(Us.prototype,{read:{get:function(){return(this.mode&da)===da},set:function(d){d?this.mode|=da:this.mode&=~da}},write:{get:function(){return(this.mode&cn)===cn},set:function(d){d?this.mode|=cn:this.mode&=~cn}},isFolder:{get:function(){return S.isDir(this.mode)}},isDevice:{get:function(){return S.isChrdev(this.mode)}}}),S.FSNode=Us,S.staticInit(),g){var Le=eV,dg=J(\"path\");At.staticInit()}if(g){var Ul=function(d){return function(){try{return d.apply(this,arguments)}catch(E){throw E.code?new S.ErrnoError(wo[E.code]):E}}},Hs=Object.assign({},S);for(var Hl in ln)S[Hl]=Ul(ln[Hl])}else throw new Error(\"NODERAWFS is currently only supported on Node.js environment.\");function wA(d,E,I){var k=I>0?I:le(d)+1,L=new Array(k),Z=Ne(d,L,0,L.length);return E&&(L.length=Z),L}var Cg=typeof atob==\"function\"?atob:function(d){var E=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\",I=\"\",k,L,Z,te,we,me,Je,nt=0;d=d.replace(/[^A-Za-z0-9\\+\\/\\=]/g,\"\");do te=E.indexOf(d.charAt(nt++)),we=E.indexOf(d.charAt(nt++)),me=E.indexOf(d.charAt(nt++)),Je=E.indexOf(d.charAt(nt++)),k=te<<2|we>>4,L=(we&15)<<4|me>>2,Z=(me&3)<<6|Je,I=I+String.fromCharCode(k),me!==64&&(I=I+String.fromCharCode(L)),Je!==64&&(I=I+String.fromCharCode(Z));while(nt<d.length);return I};function mg(d){if(typeof g==\"boolean\"&&g){var E;try{E=Buffer.from(d,\"base64\")}catch{E=new Buffer(d,\"base64\")}return new Uint8Array(E.buffer,E.byteOffset,E.byteLength)}try{for(var I=Cg(d),k=new Uint8Array(I.length),L=0;L<I.length;++L)k[L]=I.charCodeAt(L);return k}catch{throw new Error(\"Converting base64 string to bytes failed.\")}}function Ca(d){if(!!ug(d))return mg(d.slice(Tl.length))}var ma={s:fg,p:hg,e:bp,k:Sp,o:vp,q:xp,i:Pp,r:G,c:yt,h:yA,l:zi,m:Xe,f:pa,j:pg,g:OE,n:Dp,d:ME,a:ar,b:Tn,t:kp},rt=Qp(),Bo=t.___wasm_call_ctors=rt.v,BA=t._zip_ext_count_symlinks=rt.w,Gl=t._zip_file_get_external_attributes=rt.x,Gs=t._zipstruct_stat=rt.y,Yl=t._zipstruct_statS=rt.z,KE=t._zipstruct_stat_name=rt.A,Rp=t._zipstruct_stat_index=rt.B,Eg=t._zipstruct_stat_size=rt.C,Fp=t._zipstruct_stat_mtime=rt.D,UE=t._zipstruct_stat_crc=rt.E,jl=t._zipstruct_error=rt.F,HE=t._zipstruct_errorS=rt.G,Ig=t._zipstruct_error_code_zip=rt.H,QA=t._zipstruct_stat_comp_size=rt.I,Rr=t._zipstruct_stat_comp_method=rt.J,GE=t._zip_close=rt.K,Ys=t._zip_delete=rt.L,js=t._zip_dir_add=rt.M,yg=t._zip_discard=rt.N,bA=t._zip_error_init_with_code=rt.O,R=t._zip_get_error=rt.P,q=t._zip_file_get_error=rt.Q,Ce=t._zip_error_strerror=rt.R,Ke=t._zip_fclose=rt.S,Re=t._zip_file_add=rt.T,ze=t._free=rt.U,dt=t._malloc=rt.V,Ft=t.___errno_location=rt.W,Ln=t._zip_source_error=rt.X,Jb=t._zip_source_seek=rt.Y,P1=t._zip_file_set_external_attributes=rt.Z,D1=t._zip_file_set_mtime=rt._,Wb=t._zip_fopen=rt.$,k1=t._zip_fopen_index=rt.aa,R1=t._zip_fread=rt.ba,zb=t._zip_get_name=rt.ca,F1=t._zip_get_num_entries=rt.da,N1=t._zip_source_read=rt.ea,Vb=t._zip_name_locate=rt.fa,T1=t._zip_open=rt.ga,L1=t._zip_open_from_source=rt.ha,Xb=t._zip_set_file_compression=rt.ia,O1=t._zip_source_buffer=rt.ja,M1=t._zip_source_buffer_create=rt.ka,K1=t._zip_source_close=rt.la,U1=t._zip_source_free=rt.ma,Zb=t._zip_source_keep=rt.na,_b=t._zip_source_open=rt.oa,$b=t._zip_source_set_mtime=rt.qa,eS=t._zip_source_tell=rt.ra,tS=t._zip_stat=rt.sa,H1=t._zip_stat_index=rt.ta,wg=t.__get_tzname=rt.ua,rS=t.__get_daylight=rt.va,iS=t.__get_timezone=rt.wa,YE=t.stackSave=rt.xa,jE=t.stackRestore=rt.ya,Q=t.stackAlloc=rt.za;t.cwrap=ue,t.getValue=_;var Me;ha=function d(){Me||SA(),Me||(ha=d)};function SA(d){if(d=d||a,is>0||(pr(),is>0))return;function E(){Me||(Me=!0,t.calledRun=!0,!Ae&&(Ii(),i(t),t.onRuntimeInitialized&&t.onRuntimeInitialized(),rs()))}t.setStatus?(t.setStatus(\"Running...\"),setTimeout(function(){setTimeout(function(){t.setStatus(\"\")},1),E()},1)):E()}if(t.run=SA,t.preInit)for(typeof t.preInit==\"function\"&&(t.preInit=[t.preInit]);t.preInit.length>0;)t.preInit.pop()();return SA(),e}}();typeof IB==\"object\"&&typeof FR==\"object\"?FR.exports=RR:typeof define==\"function\"&&define.amd?define([],function(){return RR}):typeof IB==\"object\"&&(IB.createModule=RR)});var bV=w((Gst,QV)=>{function hke(r,e){for(var t=-1,i=r==null?0:r.length,n=Array(i);++t<i;)n[t]=e(r[t],t,r);return n}QV.exports=hke});var vs=w((Yst,SV)=>{var pke=Array.isArray;SV.exports=pke});var RV=w((jst,kV)=>{var vV=Rc(),dke=bV(),Cke=vs(),mke=gC(),Eke=1/0,xV=vV?vV.prototype:void 0,PV=xV?xV.toString:void 0;function DV(r){if(typeof r==\"string\")return r;if(Cke(r))return dke(r,DV)+\"\";if(mke(r))return PV?PV.call(r):\"\";var e=r+\"\";return e==\"0\"&&1/r==-Eke?\"-0\":e}kV.exports=DV});var Vf=w((qst,FV)=>{var Ike=RV();function yke(r){return r==null?\"\":Ike(r)}FV.exports=yke});var HR=w((Jst,NV)=>{function wke(r,e,t){var i=-1,n=r.length;e<0&&(e=-e>n?0:n+e),t=t>n?n:t,t<0&&(t+=n),n=e>t?0:t-e>>>0,e>>>=0;for(var s=Array(n);++i<n;)s[i]=r[i+e];return s}NV.exports=wke});var LV=w((Wst,TV)=>{var Bke=HR();function Qke(r,e,t){var i=r.length;return t=t===void 0?i:t,!e&&t>=i?r:Bke(r,e,t)}TV.exports=Qke});var GR=w((zst,OV)=>{var bke=\"\\\\ud800-\\\\udfff\",Ske=\"\\\\u0300-\\\\u036f\",vke=\"\\\\ufe20-\\\\ufe2f\",xke=\"\\\\u20d0-\\\\u20ff\",Pke=Ske+vke+xke,Dke=\"\\\\ufe0e\\\\ufe0f\",kke=\"\\\\u200d\",Rke=RegExp(\"[\"+kke+bke+Pke+Dke+\"]\");function Fke(r){return Rke.test(r)}OV.exports=Fke});var KV=w((Vst,MV)=>{function Nke(r){return r.split(\"\")}MV.exports=Nke});var WV=w((Xst,JV)=>{var UV=\"\\\\ud800-\\\\udfff\",Tke=\"\\\\u0300-\\\\u036f\",Lke=\"\\\\ufe20-\\\\ufe2f\",Oke=\"\\\\u20d0-\\\\u20ff\",Mke=Tke+Lke+Oke,Kke=\"\\\\ufe0e\\\\ufe0f\",Uke=\"[\"+UV+\"]\",YR=\"[\"+Mke+\"]\",jR=\"\\\\ud83c[\\\\udffb-\\\\udfff]\",Hke=\"(?:\"+YR+\"|\"+jR+\")\",HV=\"[^\"+UV+\"]\",GV=\"(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}\",YV=\"[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]\",Gke=\"\\\\u200d\",jV=Hke+\"?\",qV=\"[\"+Kke+\"]?\",Yke=\"(?:\"+Gke+\"(?:\"+[HV,GV,YV].join(\"|\")+\")\"+qV+jV+\")*\",jke=qV+jV+Yke,qke=\"(?:\"+[HV+YR+\"?\",YR,GV,YV,Uke].join(\"|\")+\")\",Jke=RegExp(jR+\"(?=\"+jR+\")|\"+qke+jke,\"g\");function Wke(r){return r.match(Jke)||[]}JV.exports=Wke});var VV=w((Zst,zV)=>{var zke=KV(),Vke=GR(),Xke=WV();function Zke(r){return Vke(r)?Xke(r):zke(r)}zV.exports=Zke});var ZV=w((_st,XV)=>{var _ke=LV(),$ke=GR(),eRe=VV(),tRe=Vf();function rRe(r){return function(e){e=tRe(e);var t=$ke(e)?eRe(e):void 0,i=t?t[0]:e.charAt(0),n=t?_ke(t,1).join(\"\"):e.slice(1);return i[r]()+n}}XV.exports=rRe});var $V=w(($st,_V)=>{var iRe=ZV(),nRe=iRe(\"toUpperCase\");_V.exports=nRe});var PB=w((eot,e9)=>{var sRe=Vf(),oRe=$V();function aRe(r){return oRe(sRe(r).toLowerCase())}e9.exports=aRe});var t9=w((tot,DB)=>{function ARe(){var r=0,e=1,t=2,i=3,n=4,s=5,o=6,a=7,l=8,c=9,u=10,g=11,f=12,h=13,p=14,C=15,y=16,B=17,v=0,D=1,T=2,H=3,j=4;function $(A,Ae){return 55296<=A.charCodeAt(Ae)&&A.charCodeAt(Ae)<=56319&&56320<=A.charCodeAt(Ae+1)&&A.charCodeAt(Ae+1)<=57343}function V(A,Ae){Ae===void 0&&(Ae=0);var ge=A.charCodeAt(Ae);if(55296<=ge&&ge<=56319&&Ae<A.length-1){var re=ge,O=A.charCodeAt(Ae+1);return 56320<=O&&O<=57343?(re-55296)*1024+(O-56320)+65536:re}if(56320<=ge&&ge<=57343&&Ae>=1){var re=A.charCodeAt(Ae-1),O=ge;return 55296<=re&&re<=56319?(re-55296)*1024+(O-56320)+65536:O}return ge}function W(A,Ae,ge){var re=[A].concat(Ae).concat([ge]),O=re[re.length-2],F=ge,ue=re.lastIndexOf(p);if(ue>1&&re.slice(1,ue).every(function(Fe){return Fe==i})&&[i,h,B].indexOf(A)==-1)return T;var pe=re.lastIndexOf(n);if(pe>0&&re.slice(1,pe).every(function(Fe){return Fe==n})&&[f,n].indexOf(O)==-1)return re.filter(function(Fe){return Fe==n}).length%2==1?H:j;if(O==r&&F==e)return v;if(O==t||O==r||O==e)return F==p&&Ae.every(function(Fe){return Fe==i})?T:D;if(F==t||F==r||F==e)return D;if(O==o&&(F==o||F==a||F==c||F==u))return v;if((O==c||O==a)&&(F==a||F==l))return v;if((O==u||O==l)&&F==l)return v;if(F==i||F==C)return v;if(F==s)return v;if(O==f)return v;var ke=re.indexOf(i)!=-1?re.lastIndexOf(i)-1:re.length-2;return[h,B].indexOf(re[ke])!=-1&&re.slice(ke+1,-1).every(function(Fe){return Fe==i})&&F==p||O==C&&[y,B].indexOf(F)!=-1?v:Ae.indexOf(n)!=-1?T:O==n&&F==n?v:D}this.nextBreak=function(A,Ae){if(Ae===void 0&&(Ae=0),Ae<0)return 0;if(Ae>=A.length-1)return A.length;for(var ge=_(V(A,Ae)),re=[],O=Ae+1;O<A.length;O++)if(!$(A,O-1)){var F=_(V(A,O));if(W(ge,re,F))return O;re.push(F)}return A.length},this.splitGraphemes=function(A){for(var Ae=[],ge=0,re;(re=this.nextBreak(A,ge))<A.length;)Ae.push(A.slice(ge,re)),ge=re;return ge<A.length&&Ae.push(A.slice(ge)),Ae},this.iterateGraphemes=function(A){var Ae=0,ge={next:function(){var re,O;return(O=this.nextBreak(A,Ae))<A.length?(re=A.slice(Ae,O),Ae=O,{value:re,done:!1}):Ae<A.length?(re=A.slice(Ae),Ae=A.length,{value:re,done:!1}):{value:void 0,done:!0}}.bind(this)};return typeof Symbol<\"u\"&&Symbol.iterator&&(ge[Symbol.iterator]=function(){return ge}),ge},this.countGraphemes=function(A){for(var Ae=0,ge=0,re;(re=this.nextBreak(A,ge))<A.length;)ge=re,Ae++;return ge<A.length&&Ae++,Ae};function _(A){return 1536<=A&&A<=1541||A==1757||A==1807||A==2274||A==3406||A==69821||70082<=A&&A<=70083||A==72250||72326<=A&&A<=72329||A==73030?f:A==13?r:A==10?e:0<=A&&A<=9||11<=A&&A<=12||14<=A&&A<=31||127<=A&&A<=159||A==173||A==1564||A==6158||A==8203||8206<=A&&A<=8207||A==8232||A==8233||8234<=A&&A<=8238||8288<=A&&A<=8292||A==8293||8294<=A&&A<=8303||55296<=A&&A<=57343||A==65279||65520<=A&&A<=65528||65529<=A&&A<=65531||113824<=A&&A<=113827||119155<=A&&A<=119162||A==917504||A==917505||917506<=A&&A<=917535||917632<=A&&A<=917759||918e3<=A&&A<=921599?t:768<=A&&A<=879||1155<=A&&A<=1159||1160<=A&&A<=1161||1425<=A&&A<=1469||A==1471||1473<=A&&A<=1474||1476<=A&&A<=1477||A==1479||1552<=A&&A<=1562||1611<=A&&A<=1631||A==1648||1750<=A&&A<=1756||1759<=A&&A<=1764||1767<=A&&A<=1768||1770<=A&&A<=1773||A==1809||1840<=A&&A<=1866||1958<=A&&A<=1968||2027<=A&&A<=2035||2070<=A&&A<=2073||2075<=A&&A<=2083||2085<=A&&A<=2087||2089<=A&&A<=2093||2137<=A&&A<=2139||2260<=A&&A<=2273||2275<=A&&A<=2306||A==2362||A==2364||2369<=A&&A<=2376||A==2381||2385<=A&&A<=2391||2402<=A&&A<=2403||A==2433||A==2492||A==2494||2497<=A&&A<=2500||A==2509||A==2519||2530<=A&&A<=2531||2561<=A&&A<=2562||A==2620||2625<=A&&A<=2626||2631<=A&&A<=2632||2635<=A&&A<=2637||A==2641||2672<=A&&A<=2673||A==2677||2689<=A&&A<=2690||A==2748||2753<=A&&A<=2757||2759<=A&&A<=2760||A==2765||2786<=A&&A<=2787||2810<=A&&A<=2815||A==2817||A==2876||A==2878||A==2879||2881<=A&&A<=2884||A==2893||A==2902||A==2903||2914<=A&&A<=2915||A==2946||A==3006||A==3008||A==3021||A==3031||A==3072||3134<=A&&A<=3136||3142<=A&&A<=3144||3146<=A&&A<=3149||3157<=A&&A<=3158||3170<=A&&A<=3171||A==3201||A==3260||A==3263||A==3266||A==3270||3276<=A&&A<=3277||3285<=A&&A<=3286||3298<=A&&A<=3299||3328<=A&&A<=3329||3387<=A&&A<=3388||A==3390||3393<=A&&A<=3396||A==3405||A==3415||3426<=A&&A<=3427||A==3530||A==3535||3538<=A&&A<=3540||A==3542||A==3551||A==3633||3636<=A&&A<=3642||3655<=A&&A<=3662||A==3761||3764<=A&&A<=3769||3771<=A&&A<=3772||3784<=A&&A<=3789||3864<=A&&A<=3865||A==3893||A==3895||A==3897||3953<=A&&A<=3966||3968<=A&&A<=3972||3974<=A&&A<=3975||3981<=A&&A<=3991||3993<=A&&A<=4028||A==4038||4141<=A&&A<=4144||4146<=A&&A<=4151||4153<=A&&A<=4154||4157<=A&&A<=4158||4184<=A&&A<=4185||4190<=A&&A<=4192||4209<=A&&A<=4212||A==4226||4229<=A&&A<=4230||A==4237||A==4253||4957<=A&&A<=4959||5906<=A&&A<=5908||5938<=A&&A<=5940||5970<=A&&A<=5971||6002<=A&&A<=6003||6068<=A&&A<=6069||6071<=A&&A<=6077||A==6086||6089<=A&&A<=6099||A==6109||6155<=A&&A<=6157||6277<=A&&A<=6278||A==6313||6432<=A&&A<=6434||6439<=A&&A<=6440||A==6450||6457<=A&&A<=6459||6679<=A&&A<=6680||A==6683||A==6742||6744<=A&&A<=6750||A==6752||A==6754||6757<=A&&A<=6764||6771<=A&&A<=6780||A==6783||6832<=A&&A<=6845||A==6846||6912<=A&&A<=6915||A==6964||6966<=A&&A<=6970||A==6972||A==6978||7019<=A&&A<=7027||7040<=A&&A<=7041||7074<=A&&A<=7077||7080<=A&&A<=7081||7083<=A&&A<=7085||A==7142||7144<=A&&A<=7145||A==7149||7151<=A&&A<=7153||7212<=A&&A<=7219||7222<=A&&A<=7223||7376<=A&&A<=7378||7380<=A&&A<=7392||7394<=A&&A<=7400||A==7405||A==7412||7416<=A&&A<=7417||7616<=A&&A<=7673||7675<=A&&A<=7679||A==8204||8400<=A&&A<=8412||8413<=A&&A<=8416||A==8417||8418<=A&&A<=8420||8421<=A&&A<=8432||11503<=A&&A<=11505||A==11647||11744<=A&&A<=11775||12330<=A&&A<=12333||12334<=A&&A<=12335||12441<=A&&A<=12442||A==42607||42608<=A&&A<=42610||42612<=A&&A<=42621||42654<=A&&A<=42655||42736<=A&&A<=42737||A==43010||A==43014||A==43019||43045<=A&&A<=43046||43204<=A&&A<=43205||43232<=A&&A<=43249||43302<=A&&A<=43309||43335<=A&&A<=43345||43392<=A&&A<=43394||A==43443||43446<=A&&A<=43449||A==43452||A==43493||43561<=A&&A<=43566||43569<=A&&A<=43570||43573<=A&&A<=43574||A==43587||A==43596||A==43644||A==43696||43698<=A&&A<=43700||43703<=A&&A<=43704||43710<=A&&A<=43711||A==43713||43756<=A&&A<=43757||A==43766||A==44005||A==44008||A==44013||A==64286||65024<=A&&A<=65039||65056<=A&&A<=65071||65438<=A&&A<=65439||A==66045||A==66272||66422<=A&&A<=66426||68097<=A&&A<=68099||68101<=A&&A<=68102||68108<=A&&A<=68111||68152<=A&&A<=68154||A==68159||68325<=A&&A<=68326||A==69633||69688<=A&&A<=69702||69759<=A&&A<=69761||69811<=A&&A<=69814||69817<=A&&A<=69818||69888<=A&&A<=69890||69927<=A&&A<=69931||69933<=A&&A<=69940||A==70003||70016<=A&&A<=70017||70070<=A&&A<=70078||70090<=A&&A<=70092||70191<=A&&A<=70193||A==70196||70198<=A&&A<=70199||A==70206||A==70367||70371<=A&&A<=70378||70400<=A&&A<=70401||A==70460||A==70462||A==70464||A==70487||70502<=A&&A<=70508||70512<=A&&A<=70516||70712<=A&&A<=70719||70722<=A&&A<=70724||A==70726||A==70832||70835<=A&&A<=70840||A==70842||A==70845||70847<=A&&A<=70848||70850<=A&&A<=70851||A==71087||71090<=A&&A<=71093||71100<=A&&A<=71101||71103<=A&&A<=71104||71132<=A&&A<=71133||71219<=A&&A<=71226||A==71229||71231<=A&&A<=71232||A==71339||A==71341||71344<=A&&A<=71349||A==71351||71453<=A&&A<=71455||71458<=A&&A<=71461||71463<=A&&A<=71467||72193<=A&&A<=72198||72201<=A&&A<=72202||72243<=A&&A<=72248||72251<=A&&A<=72254||A==72263||72273<=A&&A<=72278||72281<=A&&A<=72283||72330<=A&&A<=72342||72344<=A&&A<=72345||72752<=A&&A<=72758||72760<=A&&A<=72765||A==72767||72850<=A&&A<=72871||72874<=A&&A<=72880||72882<=A&&A<=72883||72885<=A&&A<=72886||73009<=A&&A<=73014||A==73018||73020<=A&&A<=73021||73023<=A&&A<=73029||A==73031||92912<=A&&A<=92916||92976<=A&&A<=92982||94095<=A&&A<=94098||113821<=A&&A<=113822||A==119141||119143<=A&&A<=119145||119150<=A&&A<=119154||119163<=A&&A<=119170||119173<=A&&A<=119179||119210<=A&&A<=119213||119362<=A&&A<=119364||121344<=A&&A<=121398||121403<=A&&A<=121452||A==121461||A==121476||121499<=A&&A<=121503||121505<=A&&A<=121519||122880<=A&&A<=122886||122888<=A&&A<=122904||122907<=A&&A<=122913||122915<=A&&A<=122916||122918<=A&&A<=122922||125136<=A&&A<=125142||125252<=A&&A<=125258||917536<=A&&A<=917631||917760<=A&&A<=917999?i:127462<=A&&A<=127487?n:A==2307||A==2363||2366<=A&&A<=2368||2377<=A&&A<=2380||2382<=A&&A<=2383||2434<=A&&A<=2435||2495<=A&&A<=2496||2503<=A&&A<=2504||2507<=A&&A<=2508||A==2563||2622<=A&&A<=2624||A==2691||2750<=A&&A<=2752||A==2761||2763<=A&&A<=2764||2818<=A&&A<=2819||A==2880||2887<=A&&A<=2888||2891<=A&&A<=2892||A==3007||3009<=A&&A<=3010||3014<=A&&A<=3016||3018<=A&&A<=3020||3073<=A&&A<=3075||3137<=A&&A<=3140||3202<=A&&A<=3203||A==3262||3264<=A&&A<=3265||3267<=A&&A<=3268||3271<=A&&A<=3272||3274<=A&&A<=3275||3330<=A&&A<=3331||3391<=A&&A<=3392||3398<=A&&A<=3400||3402<=A&&A<=3404||3458<=A&&A<=3459||3536<=A&&A<=3537||3544<=A&&A<=3550||3570<=A&&A<=3571||A==3635||A==3763||3902<=A&&A<=3903||A==3967||A==4145||4155<=A&&A<=4156||4182<=A&&A<=4183||A==4228||A==6070||6078<=A&&A<=6085||6087<=A&&A<=6088||6435<=A&&A<=6438||6441<=A&&A<=6443||6448<=A&&A<=6449||6451<=A&&A<=6456||6681<=A&&A<=6682||A==6741||A==6743||6765<=A&&A<=6770||A==6916||A==6965||A==6971||6973<=A&&A<=6977||6979<=A&&A<=6980||A==7042||A==7073||7078<=A&&A<=7079||A==7082||A==7143||7146<=A&&A<=7148||A==7150||7154<=A&&A<=7155||7204<=A&&A<=7211||7220<=A&&A<=7221||A==7393||7410<=A&&A<=7411||A==7415||43043<=A&&A<=43044||A==43047||43136<=A&&A<=43137||43188<=A&&A<=43203||43346<=A&&A<=43347||A==43395||43444<=A&&A<=43445||43450<=A&&A<=43451||43453<=A&&A<=43456||43567<=A&&A<=43568||43571<=A&&A<=43572||A==43597||A==43755||43758<=A&&A<=43759||A==43765||44003<=A&&A<=44004||44006<=A&&A<=44007||44009<=A&&A<=44010||A==44012||A==69632||A==69634||A==69762||69808<=A&&A<=69810||69815<=A&&A<=69816||A==69932||A==70018||70067<=A&&A<=70069||70079<=A&&A<=70080||70188<=A&&A<=70190||70194<=A&&A<=70195||A==70197||70368<=A&&A<=70370||70402<=A&&A<=70403||A==70463||70465<=A&&A<=70468||70471<=A&&A<=70472||70475<=A&&A<=70477||70498<=A&&A<=70499||70709<=A&&A<=70711||70720<=A&&A<=70721||A==70725||70833<=A&&A<=70834||A==70841||70843<=A&&A<=70844||A==70846||A==70849||71088<=A&&A<=71089||71096<=A&&A<=71099||A==71102||71216<=A&&A<=71218||71227<=A&&A<=71228||A==71230||A==71340||71342<=A&&A<=71343||A==71350||71456<=A&&A<=71457||A==71462||72199<=A&&A<=72200||A==72249||72279<=A&&A<=72280||A==72343||A==72751||A==72766||A==72873||A==72881||A==72884||94033<=A&&A<=94078||A==119142||A==119149?s:4352<=A&&A<=4447||43360<=A&&A<=43388?o:4448<=A&&A<=4519||55216<=A&&A<=55238?a:4520<=A&&A<=4607||55243<=A&&A<=55291?l:A==44032||A==44060||A==44088||A==44116||A==44144||A==44172||A==44200||A==44228||A==44256||A==44284||A==44312||A==44340||A==44368||A==44396||A==44424||A==44452||A==44480||A==44508||A==44536||A==44564||A==44592||A==44620||A==44648||A==44676||A==44704||A==44732||A==44760||A==44788||A==44816||A==44844||A==44872||A==44900||A==44928||A==44956||A==44984||A==45012||A==45040||A==45068||A==45096||A==45124||A==45152||A==45180||A==45208||A==45236||A==45264||A==45292||A==45320||A==45348||A==45376||A==45404||A==45432||A==45460||A==45488||A==45516||A==45544||A==45572||A==45600||A==45628||A==45656||A==45684||A==45712||A==45740||A==45768||A==45796||A==45824||A==45852||A==45880||A==45908||A==45936||A==45964||A==45992||A==46020||A==46048||A==46076||A==46104||A==46132||A==46160||A==46188||A==46216||A==46244||A==46272||A==46300||A==46328||A==46356||A==46384||A==46412||A==46440||A==46468||A==46496||A==46524||A==46552||A==46580||A==46608||A==46636||A==46664||A==46692||A==46720||A==46748||A==46776||A==46804||A==46832||A==46860||A==46888||A==46916||A==46944||A==46972||A==47e3||A==47028||A==47056||A==47084||A==47112||A==47140||A==47168||A==47196||A==47224||A==47252||A==47280||A==47308||A==47336||A==47364||A==47392||A==47420||A==47448||A==47476||A==47504||A==47532||A==47560||A==47588||A==47616||A==47644||A==47672||A==47700||A==47728||A==47756||A==47784||A==47812||A==47840||A==47868||A==47896||A==47924||A==47952||A==47980||A==48008||A==48036||A==48064||A==48092||A==48120||A==48148||A==48176||A==48204||A==48232||A==48260||A==48288||A==48316||A==48344||A==48372||A==48400||A==48428||A==48456||A==48484||A==48512||A==48540||A==48568||A==48596||A==48624||A==48652||A==48680||A==48708||A==48736||A==48764||A==48792||A==48820||A==48848||A==48876||A==48904||A==48932||A==48960||A==48988||A==49016||A==49044||A==49072||A==49100||A==49128||A==49156||A==49184||A==49212||A==49240||A==49268||A==49296||A==49324||A==49352||A==49380||A==49408||A==49436||A==49464||A==49492||A==49520||A==49548||A==49576||A==49604||A==49632||A==49660||A==49688||A==49716||A==49744||A==49772||A==49800||A==49828||A==49856||A==49884||A==49912||A==49940||A==49968||A==49996||A==50024||A==50052||A==50080||A==50108||A==50136||A==50164||A==50192||A==50220||A==50248||A==50276||A==50304||A==50332||A==50360||A==50388||A==50416||A==50444||A==50472||A==50500||A==50528||A==50556||A==50584||A==50612||A==50640||A==50668||A==50696||A==50724||A==50752||A==50780||A==50808||A==50836||A==50864||A==50892||A==50920||A==50948||A==50976||A==51004||A==51032||A==51060||A==51088||A==51116||A==51144||A==51172||A==51200||A==51228||A==51256||A==51284||A==51312||A==51340||A==51368||A==51396||A==51424||A==51452||A==51480||A==51508||A==51536||A==51564||A==51592||A==51620||A==51648||A==51676||A==51704||A==51732||A==51760||A==51788||A==51816||A==51844||A==51872||A==51900||A==51928||A==51956||A==51984||A==52012||A==52040||A==52068||A==52096||A==52124||A==52152||A==52180||A==52208||A==52236||A==52264||A==52292||A==52320||A==52348||A==52376||A==52404||A==52432||A==52460||A==52488||A==52516||A==52544||A==52572||A==52600||A==52628||A==52656||A==52684||A==52712||A==52740||A==52768||A==52796||A==52824||A==52852||A==52880||A==52908||A==52936||A==52964||A==52992||A==53020||A==53048||A==53076||A==53104||A==53132||A==53160||A==53188||A==53216||A==53244||A==53272||A==53300||A==53328||A==53356||A==53384||A==53412||A==53440||A==53468||A==53496||A==53524||A==53552||A==53580||A==53608||A==53636||A==53664||A==53692||A==53720||A==53748||A==53776||A==53804||A==53832||A==53860||A==53888||A==53916||A==53944||A==53972||A==54e3||A==54028||A==54056||A==54084||A==54112||A==54140||A==54168||A==54196||A==54224||A==54252||A==54280||A==54308||A==54336||A==54364||A==54392||A==54420||A==54448||A==54476||A==54504||A==54532||A==54560||A==54588||A==54616||A==54644||A==54672||A==54700||A==54728||A==54756||A==54784||A==54812||A==54840||A==54868||A==54896||A==54924||A==54952||A==54980||A==55008||A==55036||A==55064||A==55092||A==55120||A==55148||A==55176?c:44033<=A&&A<=44059||44061<=A&&A<=44087||44089<=A&&A<=44115||44117<=A&&A<=44143||44145<=A&&A<=44171||44173<=A&&A<=44199||44201<=A&&A<=44227||44229<=A&&A<=44255||44257<=A&&A<=44283||44285<=A&&A<=44311||44313<=A&&A<=44339||44341<=A&&A<=44367||44369<=A&&A<=44395||44397<=A&&A<=44423||44425<=A&&A<=44451||44453<=A&&A<=44479||44481<=A&&A<=44507||44509<=A&&A<=44535||44537<=A&&A<=44563||44565<=A&&A<=44591||44593<=A&&A<=44619||44621<=A&&A<=44647||44649<=A&&A<=44675||44677<=A&&A<=44703||44705<=A&&A<=44731||44733<=A&&A<=44759||44761<=A&&A<=44787||44789<=A&&A<=44815||44817<=A&&A<=44843||44845<=A&&A<=44871||44873<=A&&A<=44899||44901<=A&&A<=44927||44929<=A&&A<=44955||44957<=A&&A<=44983||44985<=A&&A<=45011||45013<=A&&A<=45039||45041<=A&&A<=45067||45069<=A&&A<=45095||45097<=A&&A<=45123||45125<=A&&A<=45151||45153<=A&&A<=45179||45181<=A&&A<=45207||45209<=A&&A<=45235||45237<=A&&A<=45263||45265<=A&&A<=45291||45293<=A&&A<=45319||45321<=A&&A<=45347||45349<=A&&A<=45375||45377<=A&&A<=45403||45405<=A&&A<=45431||45433<=A&&A<=45459||45461<=A&&A<=45487||45489<=A&&A<=45515||45517<=A&&A<=45543||45545<=A&&A<=45571||45573<=A&&A<=45599||45601<=A&&A<=45627||45629<=A&&A<=45655||45657<=A&&A<=45683||45685<=A&&A<=45711||45713<=A&&A<=45739||45741<=A&&A<=45767||45769<=A&&A<=45795||45797<=A&&A<=45823||45825<=A&&A<=45851||45853<=A&&A<=45879||45881<=A&&A<=45907||45909<=A&&A<=45935||45937<=A&&A<=45963||45965<=A&&A<=45991||45993<=A&&A<=46019||46021<=A&&A<=46047||46049<=A&&A<=46075||46077<=A&&A<=46103||46105<=A&&A<=46131||46133<=A&&A<=46159||46161<=A&&A<=46187||46189<=A&&A<=46215||46217<=A&&A<=46243||46245<=A&&A<=46271||46273<=A&&A<=46299||46301<=A&&A<=46327||46329<=A&&A<=46355||46357<=A&&A<=46383||46385<=A&&A<=46411||46413<=A&&A<=46439||46441<=A&&A<=46467||46469<=A&&A<=46495||46497<=A&&A<=46523||46525<=A&&A<=46551||46553<=A&&A<=46579||46581<=A&&A<=46607||46609<=A&&A<=46635||46637<=A&&A<=46663||46665<=A&&A<=46691||46693<=A&&A<=46719||46721<=A&&A<=46747||46749<=A&&A<=46775||46777<=A&&A<=46803||46805<=A&&A<=46831||46833<=A&&A<=46859||46861<=A&&A<=46887||46889<=A&&A<=46915||46917<=A&&A<=46943||46945<=A&&A<=46971||46973<=A&&A<=46999||47001<=A&&A<=47027||47029<=A&&A<=47055||47057<=A&&A<=47083||47085<=A&&A<=47111||47113<=A&&A<=47139||47141<=A&&A<=47167||47169<=A&&A<=47195||47197<=A&&A<=47223||47225<=A&&A<=47251||47253<=A&&A<=47279||47281<=A&&A<=47307||47309<=A&&A<=47335||47337<=A&&A<=47363||47365<=A&&A<=47391||47393<=A&&A<=47419||47421<=A&&A<=47447||47449<=A&&A<=47475||47477<=A&&A<=47503||47505<=A&&A<=47531||47533<=A&&A<=47559||47561<=A&&A<=47587||47589<=A&&A<=47615||47617<=A&&A<=47643||47645<=A&&A<=47671||47673<=A&&A<=47699||47701<=A&&A<=47727||47729<=A&&A<=47755||47757<=A&&A<=47783||47785<=A&&A<=47811||47813<=A&&A<=47839||47841<=A&&A<=47867||47869<=A&&A<=47895||47897<=A&&A<=47923||47925<=A&&A<=47951||47953<=A&&A<=47979||47981<=A&&A<=48007||48009<=A&&A<=48035||48037<=A&&A<=48063||48065<=A&&A<=48091||48093<=A&&A<=48119||48121<=A&&A<=48147||48149<=A&&A<=48175||48177<=A&&A<=48203||48205<=A&&A<=48231||48233<=A&&A<=48259||48261<=A&&A<=48287||48289<=A&&A<=48315||48317<=A&&A<=48343||48345<=A&&A<=48371||48373<=A&&A<=48399||48401<=A&&A<=48427||48429<=A&&A<=48455||48457<=A&&A<=48483||48485<=A&&A<=48511||48513<=A&&A<=48539||48541<=A&&A<=48567||48569<=A&&A<=48595||48597<=A&&A<=48623||48625<=A&&A<=48651||48653<=A&&A<=48679||48681<=A&&A<=48707||48709<=A&&A<=48735||48737<=A&&A<=48763||48765<=A&&A<=48791||48793<=A&&A<=48819||48821<=A&&A<=48847||48849<=A&&A<=48875||48877<=A&&A<=48903||48905<=A&&A<=48931||48933<=A&&A<=48959||48961<=A&&A<=48987||48989<=A&&A<=49015||49017<=A&&A<=49043||49045<=A&&A<=49071||49073<=A&&A<=49099||49101<=A&&A<=49127||49129<=A&&A<=49155||49157<=A&&A<=49183||49185<=A&&A<=49211||49213<=A&&A<=49239||49241<=A&&A<=49267||49269<=A&&A<=49295||49297<=A&&A<=49323||49325<=A&&A<=49351||49353<=A&&A<=49379||49381<=A&&A<=49407||49409<=A&&A<=49435||49437<=A&&A<=49463||49465<=A&&A<=49491||49493<=A&&A<=49519||49521<=A&&A<=49547||49549<=A&&A<=49575||49577<=A&&A<=49603||49605<=A&&A<=49631||49633<=A&&A<=49659||49661<=A&&A<=49687||49689<=A&&A<=49715||49717<=A&&A<=49743||49745<=A&&A<=49771||49773<=A&&A<=49799||49801<=A&&A<=49827||49829<=A&&A<=49855||49857<=A&&A<=49883||49885<=A&&A<=49911||49913<=A&&A<=49939||49941<=A&&A<=49967||49969<=A&&A<=49995||49997<=A&&A<=50023||50025<=A&&A<=50051||50053<=A&&A<=50079||50081<=A&&A<=50107||50109<=A&&A<=50135||50137<=A&&A<=50163||50165<=A&&A<=50191||50193<=A&&A<=50219||50221<=A&&A<=50247||50249<=A&&A<=50275||50277<=A&&A<=50303||50305<=A&&A<=50331||50333<=A&&A<=50359||50361<=A&&A<=50387||50389<=A&&A<=50415||50417<=A&&A<=50443||50445<=A&&A<=50471||50473<=A&&A<=50499||50501<=A&&A<=50527||50529<=A&&A<=50555||50557<=A&&A<=50583||50585<=A&&A<=50611||50613<=A&&A<=50639||50641<=A&&A<=50667||50669<=A&&A<=50695||50697<=A&&A<=50723||50725<=A&&A<=50751||50753<=A&&A<=50779||50781<=A&&A<=50807||50809<=A&&A<=50835||50837<=A&&A<=50863||50865<=A&&A<=50891||50893<=A&&A<=50919||50921<=A&&A<=50947||50949<=A&&A<=50975||50977<=A&&A<=51003||51005<=A&&A<=51031||51033<=A&&A<=51059||51061<=A&&A<=51087||51089<=A&&A<=51115||51117<=A&&A<=51143||51145<=A&&A<=51171||51173<=A&&A<=51199||51201<=A&&A<=51227||51229<=A&&A<=51255||51257<=A&&A<=51283||51285<=A&&A<=51311||51313<=A&&A<=51339||51341<=A&&A<=51367||51369<=A&&A<=51395||51397<=A&&A<=51423||51425<=A&&A<=51451||51453<=A&&A<=51479||51481<=A&&A<=51507||51509<=A&&A<=51535||51537<=A&&A<=51563||51565<=A&&A<=51591||51593<=A&&A<=51619||51621<=A&&A<=51647||51649<=A&&A<=51675||51677<=A&&A<=51703||51705<=A&&A<=51731||51733<=A&&A<=51759||51761<=A&&A<=51787||51789<=A&&A<=51815||51817<=A&&A<=51843||51845<=A&&A<=51871||51873<=A&&A<=51899||51901<=A&&A<=51927||51929<=A&&A<=51955||51957<=A&&A<=51983||51985<=A&&A<=52011||52013<=A&&A<=52039||52041<=A&&A<=52067||52069<=A&&A<=52095||52097<=A&&A<=52123||52125<=A&&A<=52151||52153<=A&&A<=52179||52181<=A&&A<=52207||52209<=A&&A<=52235||52237<=A&&A<=52263||52265<=A&&A<=52291||52293<=A&&A<=52319||52321<=A&&A<=52347||52349<=A&&A<=52375||52377<=A&&A<=52403||52405<=A&&A<=52431||52433<=A&&A<=52459||52461<=A&&A<=52487||52489<=A&&A<=52515||52517<=A&&A<=52543||52545<=A&&A<=52571||52573<=A&&A<=52599||52601<=A&&A<=52627||52629<=A&&A<=52655||52657<=A&&A<=52683||52685<=A&&A<=52711||52713<=A&&A<=52739||52741<=A&&A<=52767||52769<=A&&A<=52795||52797<=A&&A<=52823||52825<=A&&A<=52851||52853<=A&&A<=52879||52881<=A&&A<=52907||52909<=A&&A<=52935||52937<=A&&A<=52963||52965<=A&&A<=52991||52993<=A&&A<=53019||53021<=A&&A<=53047||53049<=A&&A<=53075||53077<=A&&A<=53103||53105<=A&&A<=53131||53133<=A&&A<=53159||53161<=A&&A<=53187||53189<=A&&A<=53215||53217<=A&&A<=53243||53245<=A&&A<=53271||53273<=A&&A<=53299||53301<=A&&A<=53327||53329<=A&&A<=53355||53357<=A&&A<=53383||53385<=A&&A<=53411||53413<=A&&A<=53439||53441<=A&&A<=53467||53469<=A&&A<=53495||53497<=A&&A<=53523||53525<=A&&A<=53551||53553<=A&&A<=53579||53581<=A&&A<=53607||53609<=A&&A<=53635||53637<=A&&A<=53663||53665<=A&&A<=53691||53693<=A&&A<=53719||53721<=A&&A<=53747||53749<=A&&A<=53775||53777<=A&&A<=53803||53805<=A&&A<=53831||53833<=A&&A<=53859||53861<=A&&A<=53887||53889<=A&&A<=53915||53917<=A&&A<=53943||53945<=A&&A<=53971||53973<=A&&A<=53999||54001<=A&&A<=54027||54029<=A&&A<=54055||54057<=A&&A<=54083||54085<=A&&A<=54111||54113<=A&&A<=54139||54141<=A&&A<=54167||54169<=A&&A<=54195||54197<=A&&A<=54223||54225<=A&&A<=54251||54253<=A&&A<=54279||54281<=A&&A<=54307||54309<=A&&A<=54335||54337<=A&&A<=54363||54365<=A&&A<=54391||54393<=A&&A<=54419||54421<=A&&A<=54447||54449<=A&&A<=54475||54477<=A&&A<=54503||54505<=A&&A<=54531||54533<=A&&A<=54559||54561<=A&&A<=54587||54589<=A&&A<=54615||54617<=A&&A<=54643||54645<=A&&A<=54671||54673<=A&&A<=54699||54701<=A&&A<=54727||54729<=A&&A<=54755||54757<=A&&A<=54783||54785<=A&&A<=54811||54813<=A&&A<=54839||54841<=A&&A<=54867||54869<=A&&A<=54895||54897<=A&&A<=54923||54925<=A&&A<=54951||54953<=A&&A<=54979||54981<=A&&A<=55007||55009<=A&&A<=55035||55037<=A&&A<=55063||55065<=A&&A<=55091||55093<=A&&A<=55119||55121<=A&&A<=55147||55149<=A&&A<=55175||55177<=A&&A<=55203?u:A==9757||A==9977||9994<=A&&A<=9997||A==127877||127938<=A&&A<=127940||A==127943||127946<=A&&A<=127948||128066<=A&&A<=128067||128070<=A&&A<=128080||A==128110||128112<=A&&A<=128120||A==128124||128129<=A&&A<=128131||128133<=A&&A<=128135||A==128170||128372<=A&&A<=128373||A==128378||A==128400||128405<=A&&A<=128406||128581<=A&&A<=128583||128587<=A&&A<=128591||A==128675||128692<=A&&A<=128694||A==128704||A==128716||129304<=A&&A<=129308||129310<=A&&A<=129311||A==129318||129328<=A&&A<=129337||129341<=A&&A<=129342||129489<=A&&A<=129501?h:127995<=A&&A<=127999?p:A==8205?C:A==9792||A==9794||9877<=A&&A<=9878||A==9992||A==10084||A==127752||A==127806||A==127859||A==127891||A==127908||A==127912||A==127979||A==127981||A==128139||128187<=A&&A<=128188||A==128295||A==128300||A==128488||A==128640||A==128658?y:128102<=A&&A<=128105?B:g}return this}typeof DB<\"u\"&&DB.exports&&(DB.exports=ARe)});var i9=w((rot,r9)=>{var lRe=/^(.*?)(\\x1b\\[[^m]+m|\\x1b\\]8;;.*?(\\x1b\\\\|\\u0007))/,kB;function cRe(){if(kB)return kB;if(typeof Intl.Segmenter<\"u\"){let r=new Intl.Segmenter(\"en\",{granularity:\"grapheme\"});return kB=e=>Array.from(r.segment(e),({segment:t})=>t)}else{let r=t9(),e=new r;return kB=t=>e.splitGraphemes(t)}}r9.exports=(r,e=0,t=r.length)=>{if(e<0||t<0)throw new RangeError(\"Negative indices aren't supported by this implementation\");let i=t-e,n=\"\",s=0,o=0;for(;r.length>0;){let a=r.match(lRe)||[r,r,void 0],l=cRe()(a[1]),c=Math.min(e-s,l.length);l=l.slice(c);let u=Math.min(i-o,l.length);n+=l.slice(0,u).join(\"\"),s+=c,o+=u,typeof a[2]<\"u\"&&(n+=a[2]),r=r.slice(a[0].length)}return n}});var Xf=w((wot,E9)=>{\"use strict\";var m9=new Map([[\"C\",\"cwd\"],[\"f\",\"file\"],[\"z\",\"gzip\"],[\"P\",\"preservePaths\"],[\"U\",\"unlink\"],[\"strip-components\",\"strip\"],[\"stripComponents\",\"strip\"],[\"keep-newer\",\"newer\"],[\"keepNewer\",\"newer\"],[\"keep-newer-files\",\"newer\"],[\"keepNewerFiles\",\"newer\"],[\"k\",\"keep\"],[\"keep-existing\",\"keep\"],[\"keepExisting\",\"keep\"],[\"m\",\"noMtime\"],[\"no-mtime\",\"noMtime\"],[\"p\",\"preserveOwner\"],[\"L\",\"follow\"],[\"h\",\"follow\"]]);E9.exports=r=>r?Object.keys(r).map(e=>[m9.has(e)?m9.get(e):e,r[e]]).reduce((e,t)=>(e[t[0]]=t[1],e),Object.create(null)):{}});var _f=w((Bot,x9)=>{\"use strict\";var I9=typeof process==\"object\"&&process?process:{stdout:null,stderr:null},BRe=J(\"events\"),y9=J(\"stream\"),w9=J(\"string_decoder\").StringDecoder,za=Symbol(\"EOF\"),Va=Symbol(\"maybeEmitEnd\"),rl=Symbol(\"emittedEnd\"),OB=Symbol(\"emittingEnd\"),NC=Symbol(\"emittedError\"),MB=Symbol(\"closed\"),B9=Symbol(\"read\"),KB=Symbol(\"flush\"),Q9=Symbol(\"flushChunk\"),xn=Symbol(\"encoding\"),Xa=Symbol(\"decoder\"),UB=Symbol(\"flowing\"),TC=Symbol(\"paused\"),Zf=Symbol(\"resume\"),Ci=Symbol(\"bufferLength\"),zR=Symbol(\"bufferPush\"),VR=Symbol(\"bufferShift\"),Hi=Symbol(\"objectMode\"),Gi=Symbol(\"destroyed\"),XR=Symbol(\"emitData\"),b9=Symbol(\"emitEnd\"),ZR=Symbol(\"emitEnd2\"),Za=Symbol(\"async\"),LC=r=>Promise.resolve().then(r),S9=global._MP_NO_ITERATOR_SYMBOLS_!==\"1\",QRe=S9&&Symbol.asyncIterator||Symbol(\"asyncIterator not implemented\"),bRe=S9&&Symbol.iterator||Symbol(\"iterator not implemented\"),SRe=r=>r===\"end\"||r===\"finish\"||r===\"prefinish\",vRe=r=>r instanceof ArrayBuffer||typeof r==\"object\"&&r.constructor&&r.constructor.name===\"ArrayBuffer\"&&r.byteLength>=0,xRe=r=>!Buffer.isBuffer(r)&&ArrayBuffer.isView(r),HB=class{constructor(e,t,i){this.src=e,this.dest=t,this.opts=i,this.ondrain=()=>e[Zf](),t.on(\"drain\",this.ondrain)}unpipe(){this.dest.removeListener(\"drain\",this.ondrain)}proxyErrors(){}end(){this.unpipe(),this.opts.end&&this.dest.end()}},_R=class extends HB{unpipe(){this.src.removeListener(\"error\",this.proxyErrors),super.unpipe()}constructor(e,t,i){super(e,t,i),this.proxyErrors=n=>t.emit(\"error\",n),e.on(\"error\",this.proxyErrors)}};x9.exports=class v9 extends y9{constructor(e){super(),this[UB]=!1,this[TC]=!1,this.pipes=[],this.buffer=[],this[Hi]=e&&e.objectMode||!1,this[Hi]?this[xn]=null:this[xn]=e&&e.encoding||null,this[xn]===\"buffer\"&&(this[xn]=null),this[Za]=e&&!!e.async||!1,this[Xa]=this[xn]?new w9(this[xn]):null,this[za]=!1,this[rl]=!1,this[OB]=!1,this[MB]=!1,this[NC]=null,this.writable=!0,this.readable=!0,this[Ci]=0,this[Gi]=!1}get bufferLength(){return this[Ci]}get encoding(){return this[xn]}set encoding(e){if(this[Hi])throw new Error(\"cannot set encoding in objectMode\");if(this[xn]&&e!==this[xn]&&(this[Xa]&&this[Xa].lastNeed||this[Ci]))throw new Error(\"cannot change encoding\");this[xn]!==e&&(this[Xa]=e?new w9(e):null,this.buffer.length&&(this.buffer=this.buffer.map(t=>this[Xa].write(t)))),this[xn]=e}setEncoding(e){this.encoding=e}get objectMode(){return this[Hi]}set objectMode(e){this[Hi]=this[Hi]||!!e}get async(){return this[Za]}set async(e){this[Za]=this[Za]||!!e}write(e,t,i){if(this[za])throw new Error(\"write after end\");if(this[Gi])return this.emit(\"error\",Object.assign(new Error(\"Cannot call write after a stream was destroyed\"),{code:\"ERR_STREAM_DESTROYED\"})),!0;typeof t==\"function\"&&(i=t,t=\"utf8\"),t||(t=\"utf8\");let n=this[Za]?LC:s=>s();return!this[Hi]&&!Buffer.isBuffer(e)&&(xRe(e)?e=Buffer.from(e.buffer,e.byteOffset,e.byteLength):vRe(e)?e=Buffer.from(e):typeof e!=\"string\"&&(this.objectMode=!0)),this[Hi]?(this.flowing&&this[Ci]!==0&&this[KB](!0),this.flowing?this.emit(\"data\",e):this[zR](e),this[Ci]!==0&&this.emit(\"readable\"),i&&n(i),this.flowing):e.length?(typeof e==\"string\"&&!(t===this[xn]&&!this[Xa].lastNeed)&&(e=Buffer.from(e,t)),Buffer.isBuffer(e)&&this[xn]&&(e=this[Xa].write(e)),this.flowing&&this[Ci]!==0&&this[KB](!0),this.flowing?this.emit(\"data\",e):this[zR](e),this[Ci]!==0&&this.emit(\"readable\"),i&&n(i),this.flowing):(this[Ci]!==0&&this.emit(\"readable\"),i&&n(i),this.flowing)}read(e){if(this[Gi])return null;if(this[Ci]===0||e===0||e>this[Ci])return this[Va](),null;this[Hi]&&(e=null),this.buffer.length>1&&!this[Hi]&&(this.encoding?this.buffer=[this.buffer.join(\"\")]:this.buffer=[Buffer.concat(this.buffer,this[Ci])]);let t=this[B9](e||null,this.buffer[0]);return this[Va](),t}[B9](e,t){return e===t.length||e===null?this[VR]():(this.buffer[0]=t.slice(e),t=t.slice(0,e),this[Ci]-=e),this.emit(\"data\",t),!this.buffer.length&&!this[za]&&this.emit(\"drain\"),t}end(e,t,i){return typeof e==\"function\"&&(i=e,e=null),typeof t==\"function\"&&(i=t,t=\"utf8\"),e&&this.write(e,t),i&&this.once(\"end\",i),this[za]=!0,this.writable=!1,(this.flowing||!this[TC])&&this[Va](),this}[Zf](){this[Gi]||(this[TC]=!1,this[UB]=!0,this.emit(\"resume\"),this.buffer.length?this[KB]():this[za]?this[Va]():this.emit(\"drain\"))}resume(){return this[Zf]()}pause(){this[UB]=!1,this[TC]=!0}get destroyed(){return this[Gi]}get flowing(){return this[UB]}get paused(){return this[TC]}[zR](e){this[Hi]?this[Ci]+=1:this[Ci]+=e.length,this.buffer.push(e)}[VR](){return this.buffer.length&&(this[Hi]?this[Ci]-=1:this[Ci]-=this.buffer[0].length),this.buffer.shift()}[KB](e){do;while(this[Q9](this[VR]()));!e&&!this.buffer.length&&!this[za]&&this.emit(\"drain\")}[Q9](e){return e?(this.emit(\"data\",e),this.flowing):!1}pipe(e,t){if(this[Gi])return;let i=this[rl];return t=t||{},e===I9.stdout||e===I9.stderr?t.end=!1:t.end=t.end!==!1,t.proxyErrors=!!t.proxyErrors,i?t.end&&e.end():(this.pipes.push(t.proxyErrors?new _R(this,e,t):new HB(this,e,t)),this[Za]?LC(()=>this[Zf]()):this[Zf]()),e}unpipe(e){let t=this.pipes.find(i=>i.dest===e);t&&(this.pipes.splice(this.pipes.indexOf(t),1),t.unpipe())}addListener(e,t){return this.on(e,t)}on(e,t){let i=super.on(e,t);return e===\"data\"&&!this.pipes.length&&!this.flowing?this[Zf]():e===\"readable\"&&this[Ci]!==0?super.emit(\"readable\"):SRe(e)&&this[rl]?(super.emit(e),this.removeAllListeners(e)):e===\"error\"&&this[NC]&&(this[Za]?LC(()=>t.call(this,this[NC])):t.call(this,this[NC])),i}get emittedEnd(){return this[rl]}[Va](){!this[OB]&&!this[rl]&&!this[Gi]&&this.buffer.length===0&&this[za]&&(this[OB]=!0,this.emit(\"end\"),this.emit(\"prefinish\"),this.emit(\"finish\"),this[MB]&&this.emit(\"close\"),this[OB]=!1)}emit(e,t,...i){if(e!==\"error\"&&e!==\"close\"&&e!==Gi&&this[Gi])return;if(e===\"data\")return t?this[Za]?LC(()=>this[XR](t)):this[XR](t):!1;if(e===\"end\")return this[b9]();if(e===\"close\"){if(this[MB]=!0,!this[rl]&&!this[Gi])return;let s=super.emit(\"close\");return this.removeAllListeners(\"close\"),s}else if(e===\"error\"){this[NC]=t;let s=super.emit(\"error\",t);return this[Va](),s}else if(e===\"resume\"){let s=super.emit(\"resume\");return this[Va](),s}else if(e===\"finish\"||e===\"prefinish\"){let s=super.emit(e);return this.removeAllListeners(e),s}let n=super.emit(e,t,...i);return this[Va](),n}[XR](e){for(let i of this.pipes)i.dest.write(e)===!1&&this.pause();let t=super.emit(\"data\",e);return this[Va](),t}[b9](){this[rl]||(this[rl]=!0,this.readable=!1,this[Za]?LC(()=>this[ZR]()):this[ZR]())}[ZR](){if(this[Xa]){let t=this[Xa].end();if(t){for(let i of this.pipes)i.dest.write(t);super.emit(\"data\",t)}}for(let t of this.pipes)t.end();let e=super.emit(\"end\");return this.removeAllListeners(\"end\"),e}collect(){let e=[];this[Hi]||(e.dataLength=0);let t=this.promise();return this.on(\"data\",i=>{e.push(i),this[Hi]||(e.dataLength+=i.length)}),t.then(()=>e)}concat(){return this[Hi]?Promise.reject(new Error(\"cannot concat in objectMode\")):this.collect().then(e=>this[Hi]?Promise.reject(new Error(\"cannot concat in objectMode\")):this[xn]?e.join(\"\"):Buffer.concat(e,e.dataLength))}promise(){return new Promise((e,t)=>{this.on(Gi,()=>t(new Error(\"stream destroyed\"))),this.on(\"error\",i=>t(i)),this.on(\"end\",()=>e())})}[QRe](){return{next:()=>{let t=this.read();if(t!==null)return Promise.resolve({done:!1,value:t});if(this[za])return Promise.resolve({done:!0});let i=null,n=null,s=c=>{this.removeListener(\"data\",o),this.removeListener(\"end\",a),n(c)},o=c=>{this.removeListener(\"error\",s),this.removeListener(\"end\",a),this.pause(),i({value:c,done:!!this[za]})},a=()=>{this.removeListener(\"error\",s),this.removeListener(\"data\",o),i({done:!0})},l=()=>s(new Error(\"stream destroyed\"));return new Promise((c,u)=>{n=u,i=c,this.once(Gi,l),this.once(\"error\",s),this.once(\"end\",a),this.once(\"data\",o)})}}}[bRe](){return{next:()=>{let t=this.read();return{value:t,done:t===null}}}}destroy(e){return this[Gi]?(e?this.emit(\"error\",e):this.emit(Gi),this):(this[Gi]=!0,this.buffer.length=0,this[Ci]=0,typeof this.close==\"function\"&&!this[MB]&&this.close(),e?this.emit(\"error\",e):this.emit(Gi),this)}static isStream(e){return!!e&&(e instanceof v9||e instanceof y9||e instanceof BRe&&(typeof e.pipe==\"function\"||typeof e.write==\"function\"&&typeof e.end==\"function\"))}}});var D9=w((Qot,P9)=>{var PRe=J(\"zlib\").constants||{ZLIB_VERNUM:4736};P9.exports=Object.freeze(Object.assign(Object.create(null),{Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_VERSION_ERROR:-6,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,DEFLATE:1,INFLATE:2,GZIP:3,GUNZIP:4,DEFLATERAW:5,INFLATERAW:6,UNZIP:7,BROTLI_DECODE:8,BROTLI_ENCODE:9,Z_MIN_WINDOWBITS:8,Z_MAX_WINDOWBITS:15,Z_DEFAULT_WINDOWBITS:15,Z_MIN_CHUNK:64,Z_MAX_CHUNK:1/0,Z_DEFAULT_CHUNK:16384,Z_MIN_MEMLEVEL:1,Z_MAX_MEMLEVEL:9,Z_DEFAULT_MEMLEVEL:8,Z_MIN_LEVEL:-1,Z_MAX_LEVEL:9,Z_DEFAULT_LEVEL:-1,BROTLI_OPERATION_PROCESS:0,BROTLI_OPERATION_FLUSH:1,BROTLI_OPERATION_FINISH:2,BROTLI_OPERATION_EMIT_METADATA:3,BROTLI_MODE_GENERIC:0,BROTLI_MODE_TEXT:1,BROTLI_MODE_FONT:2,BROTLI_DEFAULT_MODE:0,BROTLI_MIN_QUALITY:0,BROTLI_MAX_QUALITY:11,BROTLI_DEFAULT_QUALITY:11,BROTLI_MIN_WINDOW_BITS:10,BROTLI_MAX_WINDOW_BITS:24,BROTLI_LARGE_MAX_WINDOW_BITS:30,BROTLI_DEFAULT_WINDOW:22,BROTLI_MIN_INPUT_BLOCK_BITS:16,BROTLI_MAX_INPUT_BLOCK_BITS:24,BROTLI_PARAM_MODE:0,BROTLI_PARAM_QUALITY:1,BROTLI_PARAM_LGWIN:2,BROTLI_PARAM_LGBLOCK:3,BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING:4,BROTLI_PARAM_SIZE_HINT:5,BROTLI_PARAM_LARGE_WINDOW:6,BROTLI_PARAM_NPOSTFIX:7,BROTLI_PARAM_NDIRECT:8,BROTLI_DECODER_RESULT_ERROR:0,BROTLI_DECODER_RESULT_SUCCESS:1,BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT:2,BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION:0,BROTLI_DECODER_PARAM_LARGE_WINDOW:1,BROTLI_DECODER_NO_ERROR:0,BROTLI_DECODER_SUCCESS:1,BROTLI_DECODER_NEEDS_MORE_INPUT:2,BROTLI_DECODER_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE:-1,BROTLI_DECODER_ERROR_FORMAT_RESERVED:-2,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE:-3,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET:-4,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME:-5,BROTLI_DECODER_ERROR_FORMAT_CL_SPACE:-6,BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE:-7,BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT:-8,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1:-9,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2:-10,BROTLI_DECODER_ERROR_FORMAT_TRANSFORM:-11,BROTLI_DECODER_ERROR_FORMAT_DICTIONARY:-12,BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS:-13,BROTLI_DECODER_ERROR_FORMAT_PADDING_1:-14,BROTLI_DECODER_ERROR_FORMAT_PADDING_2:-15,BROTLI_DECODER_ERROR_FORMAT_DISTANCE:-16,BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET:-19,BROTLI_DECODER_ERROR_INVALID_ARGUMENTS:-20,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES:-21,BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS:-22,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP:-25,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1:-26,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2:-27,BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES:-30,BROTLI_DECODER_ERROR_UNREACHABLE:-31},PRe))});var hF=w(Xn=>{\"use strict\";var iF=J(\"assert\"),il=J(\"buffer\").Buffer,F9=J(\"zlib\"),Uc=Xn.constants=D9(),DRe=_f(),k9=il.concat,Hc=Symbol(\"_superWrite\"),eh=class extends Error{constructor(e){super(\"zlib: \"+e.message),this.code=e.code,this.errno=e.errno,this.code||(this.code=\"ZLIB_ERROR\"),this.message=\"zlib: \"+e.message,Error.captureStackTrace(this,this.constructor)}get name(){return\"ZlibError\"}},kRe=Symbol(\"opts\"),OC=Symbol(\"flushFlag\"),R9=Symbol(\"finishFlushFlag\"),fF=Symbol(\"fullFlushFlag\"),cr=Symbol(\"handle\"),GB=Symbol(\"onError\"),$f=Symbol(\"sawError\"),$R=Symbol(\"level\"),eF=Symbol(\"strategy\"),tF=Symbol(\"ended\"),bot=Symbol(\"_defaultFullFlush\"),YB=class extends DRe{constructor(e,t){if(!e||typeof e!=\"object\")throw new TypeError(\"invalid options for ZlibBase constructor\");super(e),this[$f]=!1,this[tF]=!1,this[kRe]=e,this[OC]=e.flush,this[R9]=e.finishFlush;try{this[cr]=new F9[t](e)}catch(i){throw new eh(i)}this[GB]=i=>{this[$f]||(this[$f]=!0,this.close(),this.emit(\"error\",i))},this[cr].on(\"error\",i=>this[GB](new eh(i))),this.once(\"end\",()=>this.close)}close(){this[cr]&&(this[cr].close(),this[cr]=null,this.emit(\"close\"))}reset(){if(!this[$f])return iF(this[cr],\"zlib binding closed\"),this[cr].reset()}flush(e){this.ended||(typeof e!=\"number\"&&(e=this[fF]),this.write(Object.assign(il.alloc(0),{[OC]:e})))}end(e,t,i){return e&&this.write(e,t),this.flush(this[R9]),this[tF]=!0,super.end(null,null,i)}get ended(){return this[tF]}write(e,t,i){if(typeof t==\"function\"&&(i=t,t=\"utf8\"),typeof e==\"string\"&&(e=il.from(e,t)),this[$f])return;iF(this[cr],\"zlib binding closed\");let n=this[cr]._handle,s=n.close;n.close=()=>{};let o=this[cr].close;this[cr].close=()=>{},il.concat=c=>c;let a;try{let c=typeof e[OC]==\"number\"?e[OC]:this[OC];a=this[cr]._processChunk(e,c),il.concat=k9}catch(c){il.concat=k9,this[GB](new eh(c))}finally{this[cr]&&(this[cr]._handle=n,n.close=s,this[cr].close=o,this[cr].removeAllListeners(\"error\"))}this[cr]&&this[cr].on(\"error\",c=>this[GB](new eh(c)));let l;if(a)if(Array.isArray(a)&&a.length>0){l=this[Hc](il.from(a[0]));for(let c=1;c<a.length;c++)l=this[Hc](a[c])}else l=this[Hc](il.from(a));return i&&i(),l}[Hc](e){return super.write(e)}},_a=class extends YB{constructor(e,t){e=e||{},e.flush=e.flush||Uc.Z_NO_FLUSH,e.finishFlush=e.finishFlush||Uc.Z_FINISH,super(e,t),this[fF]=Uc.Z_FULL_FLUSH,this[$R]=e.level,this[eF]=e.strategy}params(e,t){if(!this[$f]){if(!this[cr])throw new Error(\"cannot switch params when binding is closed\");if(!this[cr].params)throw new Error(\"not supported in this implementation\");if(this[$R]!==e||this[eF]!==t){this.flush(Uc.Z_SYNC_FLUSH),iF(this[cr],\"zlib binding closed\");let i=this[cr].flush;this[cr].flush=(n,s)=>{this.flush(n),s()};try{this[cr].params(e,t)}finally{this[cr].flush=i}this[cr]&&(this[$R]=e,this[eF]=t)}}}},nF=class extends _a{constructor(e){super(e,\"Deflate\")}},sF=class extends _a{constructor(e){super(e,\"Inflate\")}},rF=Symbol(\"_portable\"),oF=class extends _a{constructor(e){super(e,\"Gzip\"),this[rF]=e&&!!e.portable}[Hc](e){return this[rF]?(this[rF]=!1,e[9]=255,super[Hc](e)):super[Hc](e)}},aF=class extends _a{constructor(e){super(e,\"Gunzip\")}},AF=class extends _a{constructor(e){super(e,\"DeflateRaw\")}},lF=class extends _a{constructor(e){super(e,\"InflateRaw\")}},cF=class extends _a{constructor(e){super(e,\"Unzip\")}},jB=class extends YB{constructor(e,t){e=e||{},e.flush=e.flush||Uc.BROTLI_OPERATION_PROCESS,e.finishFlush=e.finishFlush||Uc.BROTLI_OPERATION_FINISH,super(e,t),this[fF]=Uc.BROTLI_OPERATION_FLUSH}},uF=class extends jB{constructor(e){super(e,\"BrotliCompress\")}},gF=class extends jB{constructor(e){super(e,\"BrotliDecompress\")}};Xn.Deflate=nF;Xn.Inflate=sF;Xn.Gzip=oF;Xn.Gunzip=aF;Xn.DeflateRaw=AF;Xn.InflateRaw=lF;Xn.Unzip=cF;typeof F9.BrotliCompress==\"function\"?(Xn.BrotliCompress=uF,Xn.BrotliDecompress=gF):Xn.BrotliCompress=Xn.BrotliDecompress=class{constructor(){throw new Error(\"Brotli is not supported in this version of Node.js\")}}});var th=w((xot,N9)=>{var RRe=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform;N9.exports=RRe!==\"win32\"?r=>r:r=>r&&r.replace(/\\\\/g,\"/\")});var qB=w((Dot,T9)=>{\"use strict\";var FRe=_f(),pF=th(),dF=Symbol(\"slurp\");T9.exports=class extends FRe{constructor(e,t,i){switch(super(),this.pause(),this.extended=t,this.globalExtended=i,this.header=e,this.startBlockSize=512*Math.ceil(e.size/512),this.blockRemain=this.startBlockSize,this.remain=e.size,this.type=e.type,this.meta=!1,this.ignore=!1,this.type){case\"File\":case\"OldFile\":case\"Link\":case\"SymbolicLink\":case\"CharacterDevice\":case\"BlockDevice\":case\"Directory\":case\"FIFO\":case\"ContiguousFile\":case\"GNUDumpDir\":break;case\"NextFileHasLongLinkpath\":case\"NextFileHasLongPath\":case\"OldGnuLongPath\":case\"GlobalExtendedHeader\":case\"ExtendedHeader\":case\"OldExtendedHeader\":this.meta=!0;break;default:this.ignore=!0}this.path=pF(e.path),this.mode=e.mode,this.mode&&(this.mode=this.mode&4095),this.uid=e.uid,this.gid=e.gid,this.uname=e.uname,this.gname=e.gname,this.size=e.size,this.mtime=e.mtime,this.atime=e.atime,this.ctime=e.ctime,this.linkpath=pF(e.linkpath),this.uname=e.uname,this.gname=e.gname,t&&this[dF](t),i&&this[dF](i,!0)}write(e){let t=e.length;if(t>this.blockRemain)throw new Error(\"writing more to entry than is appropriate\");let i=this.remain,n=this.blockRemain;return this.remain=Math.max(0,i-t),this.blockRemain=Math.max(0,n-t),this.ignore?!0:i>=t?super.write(e):super.write(e.slice(0,i))}[dF](e,t){for(let i in e)e[i]!==null&&e[i]!==void 0&&!(t&&i===\"path\")&&(this[i]=i===\"path\"||i===\"linkpath\"?pF(e[i]):e[i])}}});var CF=w(JB=>{\"use strict\";JB.name=new Map([[\"0\",\"File\"],[\"\",\"OldFile\"],[\"1\",\"Link\"],[\"2\",\"SymbolicLink\"],[\"3\",\"CharacterDevice\"],[\"4\",\"BlockDevice\"],[\"5\",\"Directory\"],[\"6\",\"FIFO\"],[\"7\",\"ContiguousFile\"],[\"g\",\"GlobalExtendedHeader\"],[\"x\",\"ExtendedHeader\"],[\"A\",\"SolarisACL\"],[\"D\",\"GNUDumpDir\"],[\"I\",\"Inode\"],[\"K\",\"NextFileHasLongLinkpath\"],[\"L\",\"NextFileHasLongPath\"],[\"M\",\"ContinuationFile\"],[\"N\",\"OldGnuLongPath\"],[\"S\",\"SparseFile\"],[\"V\",\"TapeVolumeHeader\"],[\"X\",\"OldExtendedHeader\"]]);JB.code=new Map(Array.from(JB.name).map(r=>[r[1],r[0]]))});var K9=w((Rot,M9)=>{\"use strict\";var NRe=(r,e)=>{if(Number.isSafeInteger(r))r<0?LRe(r,e):TRe(r,e);else throw Error(\"cannot encode number outside of javascript safe integer range\");return e},TRe=(r,e)=>{e[0]=128;for(var t=e.length;t>1;t--)e[t-1]=r&255,r=Math.floor(r/256)},LRe=(r,e)=>{e[0]=255;var t=!1;r=r*-1;for(var i=e.length;i>1;i--){var n=r&255;r=Math.floor(r/256),t?e[i-1]=L9(n):n===0?e[i-1]=0:(t=!0,e[i-1]=O9(n))}},ORe=r=>{let e=r[0],t=e===128?KRe(r.slice(1,r.length)):e===255?MRe(r):null;if(t===null)throw Error(\"invalid base256 encoding\");if(!Number.isSafeInteger(t))throw Error(\"parsed number outside of javascript safe integer range\");return t},MRe=r=>{for(var e=r.length,t=0,i=!1,n=e-1;n>-1;n--){var s=r[n],o;i?o=L9(s):s===0?o=s:(i=!0,o=O9(s)),o!==0&&(t-=o*Math.pow(256,e-n-1))}return t},KRe=r=>{for(var e=r.length,t=0,i=e-1;i>-1;i--){var n=r[i];n!==0&&(t+=n*Math.pow(256,e-i-1))}return t},L9=r=>(255^r)&255,O9=r=>(255^r)+1&255;M9.exports={encode:NRe,parse:ORe}});var ih=w((Fot,H9)=>{\"use strict\";var mF=CF(),rh=J(\"path\").posix,U9=K9(),EF=Symbol(\"slurp\"),Zn=Symbol(\"type\"),wF=class{constructor(e,t,i,n){this.cksumValid=!1,this.needPax=!1,this.nullBlock=!1,this.block=null,this.path=null,this.mode=null,this.uid=null,this.gid=null,this.size=null,this.mtime=null,this.cksum=null,this[Zn]=\"0\",this.linkpath=null,this.uname=null,this.gname=null,this.devmaj=0,this.devmin=0,this.atime=null,this.ctime=null,Buffer.isBuffer(e)?this.decode(e,t||0,i,n):e&&this.set(e)}decode(e,t,i,n){if(t||(t=0),!e||!(e.length>=t+512))throw new Error(\"need 512 bytes for header\");if(this.path=Gc(e,t,100),this.mode=nl(e,t+100,8),this.uid=nl(e,t+108,8),this.gid=nl(e,t+116,8),this.size=nl(e,t+124,12),this.mtime=IF(e,t+136,12),this.cksum=nl(e,t+148,12),this[EF](i),this[EF](n,!0),this[Zn]=Gc(e,t+156,1),this[Zn]===\"\"&&(this[Zn]=\"0\"),this[Zn]===\"0\"&&this.path.substr(-1)===\"/\"&&(this[Zn]=\"5\"),this[Zn]===\"5\"&&(this.size=0),this.linkpath=Gc(e,t+157,100),e.slice(t+257,t+265).toString()===\"ustar\\x0000\")if(this.uname=Gc(e,t+265,32),this.gname=Gc(e,t+297,32),this.devmaj=nl(e,t+329,8),this.devmin=nl(e,t+337,8),e[t+475]!==0){let o=Gc(e,t+345,155);this.path=o+\"/\"+this.path}else{let o=Gc(e,t+345,130);o&&(this.path=o+\"/\"+this.path),this.atime=IF(e,t+476,12),this.ctime=IF(e,t+488,12)}let s=8*32;for(let o=t;o<t+148;o++)s+=e[o];for(let o=t+156;o<t+512;o++)s+=e[o];this.cksumValid=s===this.cksum,this.cksum===null&&s===8*32&&(this.nullBlock=!0)}[EF](e,t){for(let i in e)e[i]!==null&&e[i]!==void 0&&!(t&&i===\"path\")&&(this[i]=e[i])}encode(e,t){if(e||(e=this.block=Buffer.alloc(512),t=0),t||(t=0),!(e.length>=t+512))throw new Error(\"need 512 bytes for header\");let i=this.ctime||this.atime?130:155,n=URe(this.path||\"\",i),s=n[0],o=n[1];this.needPax=n[2],this.needPax=Yc(e,t,100,s)||this.needPax,this.needPax=sl(e,t+100,8,this.mode)||this.needPax,this.needPax=sl(e,t+108,8,this.uid)||this.needPax,this.needPax=sl(e,t+116,8,this.gid)||this.needPax,this.needPax=sl(e,t+124,12,this.size)||this.needPax,this.needPax=yF(e,t+136,12,this.mtime)||this.needPax,e[t+156]=this[Zn].charCodeAt(0),this.needPax=Yc(e,t+157,100,this.linkpath)||this.needPax,e.write(\"ustar\\x0000\",t+257,8),this.needPax=Yc(e,t+265,32,this.uname)||this.needPax,this.needPax=Yc(e,t+297,32,this.gname)||this.needPax,this.needPax=sl(e,t+329,8,this.devmaj)||this.needPax,this.needPax=sl(e,t+337,8,this.devmin)||this.needPax,this.needPax=Yc(e,t+345,i,o)||this.needPax,e[t+475]!==0?this.needPax=Yc(e,t+345,155,o)||this.needPax:(this.needPax=Yc(e,t+345,130,o)||this.needPax,this.needPax=yF(e,t+476,12,this.atime)||this.needPax,this.needPax=yF(e,t+488,12,this.ctime)||this.needPax);let a=8*32;for(let l=t;l<t+148;l++)a+=e[l];for(let l=t+156;l<t+512;l++)a+=e[l];return this.cksum=a,sl(e,t+148,8,this.cksum),this.cksumValid=!0,this.needPax}set(e){for(let t in e)e[t]!==null&&e[t]!==void 0&&(this[t]=e[t])}get type(){return mF.name.get(this[Zn])||this[Zn]}get typeKey(){return this[Zn]}set type(e){mF.code.has(e)?this[Zn]=mF.code.get(e):this[Zn]=e}},URe=(r,e)=>{let i=r,n=\"\",s,o=rh.parse(r).root||\".\";if(Buffer.byteLength(i)<100)s=[i,n,!1];else{n=rh.dirname(i),i=rh.basename(i);do Buffer.byteLength(i)<=100&&Buffer.byteLength(n)<=e?s=[i,n,!1]:Buffer.byteLength(i)>100&&Buffer.byteLength(n)<=e?s=[i.substr(0,100-1),n,!0]:(i=rh.join(rh.basename(n),i),n=rh.dirname(n));while(n!==o&&!s);s||(s=[r.substr(0,100-1),\"\",!0])}return s},Gc=(r,e,t)=>r.slice(e,e+t).toString(\"utf8\").replace(/\\0.*/,\"\"),IF=(r,e,t)=>HRe(nl(r,e,t)),HRe=r=>r===null?null:new Date(r*1e3),nl=(r,e,t)=>r[e]&128?U9.parse(r.slice(e,e+t)):YRe(r,e,t),GRe=r=>isNaN(r)?null:r,YRe=(r,e,t)=>GRe(parseInt(r.slice(e,e+t).toString(\"utf8\").replace(/\\0.*$/,\"\").trim(),8)),jRe={12:8589934591,8:2097151},sl=(r,e,t,i)=>i===null?!1:i>jRe[t]||i<0?(U9.encode(i,r.slice(e,e+t)),!0):(qRe(r,e,t,i),!1),qRe=(r,e,t,i)=>r.write(JRe(i,t),e,t,\"ascii\"),JRe=(r,e)=>WRe(Math.floor(r).toString(8),e),WRe=(r,e)=>(r.length===e-1?r:new Array(e-r.length-1).join(\"0\")+r+\" \")+\"\\0\",yF=(r,e,t,i)=>i===null?!1:sl(r,e,t,i.getTime()/1e3),zRe=new Array(156).join(\"\\0\"),Yc=(r,e,t,i)=>i===null?!1:(r.write(i+zRe,e,t,\"utf8\"),i.length!==Buffer.byteLength(i)||i.length>t);H9.exports=wF});var WB=w((Not,G9)=>{\"use strict\";var VRe=ih(),XRe=J(\"path\"),MC=class{constructor(e,t){this.atime=e.atime||null,this.charset=e.charset||null,this.comment=e.comment||null,this.ctime=e.ctime||null,this.gid=e.gid||null,this.gname=e.gname||null,this.linkpath=e.linkpath||null,this.mtime=e.mtime||null,this.path=e.path||null,this.size=e.size||null,this.uid=e.uid||null,this.uname=e.uname||null,this.dev=e.dev||null,this.ino=e.ino||null,this.nlink=e.nlink||null,this.global=t||!1}encode(){let e=this.encodeBody();if(e===\"\")return null;let t=Buffer.byteLength(e),i=512*Math.ceil(1+t/512),n=Buffer.allocUnsafe(i);for(let s=0;s<512;s++)n[s]=0;new VRe({path:(\"PaxHeader/\"+XRe.basename(this.path)).slice(0,99),mode:this.mode||420,uid:this.uid||null,gid:this.gid||null,size:t,mtime:this.mtime||null,type:this.global?\"GlobalExtendedHeader\":\"ExtendedHeader\",linkpath:\"\",uname:this.uname||\"\",gname:this.gname||\"\",devmaj:0,devmin:0,atime:this.atime||null,ctime:this.ctime||null}).encode(n),n.write(e,512,t,\"utf8\");for(let s=t+512;s<n.length;s++)n[s]=0;return n}encodeBody(){return this.encodeField(\"path\")+this.encodeField(\"ctime\")+this.encodeField(\"atime\")+this.encodeField(\"dev\")+this.encodeField(\"ino\")+this.encodeField(\"nlink\")+this.encodeField(\"charset\")+this.encodeField(\"comment\")+this.encodeField(\"gid\")+this.encodeField(\"gname\")+this.encodeField(\"linkpath\")+this.encodeField(\"mtime\")+this.encodeField(\"size\")+this.encodeField(\"uid\")+this.encodeField(\"uname\")}encodeField(e){if(this[e]===null||this[e]===void 0)return\"\";let t=this[e]instanceof Date?this[e].getTime()/1e3:this[e],i=\" \"+(e===\"dev\"||e===\"ino\"||e===\"nlink\"?\"SCHILY.\":\"\")+e+\"=\"+t+`\n`,n=Buffer.byteLength(i),s=Math.floor(Math.log(n)/Math.log(10))+1;return n+s>=Math.pow(10,s)&&(s+=1),s+n+i}};MC.parse=(r,e,t)=>new MC(ZRe(_Re(r),e),t);var ZRe=(r,e)=>e?Object.keys(r).reduce((t,i)=>(t[i]=r[i],t),e):r,_Re=r=>r.replace(/\\n$/,\"\").split(`\n`).reduce($Re,Object.create(null)),$Re=(r,e)=>{let t=parseInt(e,10);if(t!==Buffer.byteLength(e)+1)return r;e=e.substr((t+\" \").length);let i=e.split(\"=\"),n=i.shift().replace(/^SCHILY\\.(dev|ino|nlink)/,\"$1\");if(!n)return r;let s=i.join(\"=\");return r[n]=/^([A-Z]+\\.)?([mac]|birth|creation)time$/.test(n)?new Date(s*1e3):/^[0-9]+$/.test(s)?+s:s,r};G9.exports=MC});var nh=w((Tot,Y9)=>{Y9.exports=r=>{let e=r.length-1,t=-1;for(;e>-1&&r.charAt(e)===\"/\";)t=e,e--;return t===-1?r:r.slice(0,t)}});var zB=w((Lot,j9)=>{\"use strict\";j9.exports=r=>class extends r{warn(e,t,i={}){this.file&&(i.file=this.file),this.cwd&&(i.cwd=this.cwd),i.code=t instanceof Error&&t.code||e,i.tarCode=e,!this.strict&&i.recoverable!==!1?(t instanceof Error&&(i=Object.assign(t,i),t=t.message),this.emit(\"warn\",i.tarCode,t,i)):t instanceof Error?this.emit(\"error\",Object.assign(t,i)):this.emit(\"error\",Object.assign(new Error(`${e}: ${t}`),i))}}});var QF=w((Mot,q9)=>{\"use strict\";var VB=[\"|\",\"<\",\">\",\"?\",\":\"],BF=VB.map(r=>String.fromCharCode(61440+r.charCodeAt(0))),eFe=new Map(VB.map((r,e)=>[r,BF[e]])),tFe=new Map(BF.map((r,e)=>[r,VB[e]]));q9.exports={encode:r=>VB.reduce((e,t)=>e.split(t).join(eFe.get(t)),r),decode:r=>BF.reduce((e,t)=>e.split(t).join(tFe.get(t)),r)}});var bF=w((Kot,W9)=>{var{isAbsolute:rFe,parse:J9}=J(\"path\").win32;W9.exports=r=>{let e=\"\",t=J9(r);for(;rFe(r)||t.root;){let i=r.charAt(0)===\"/\"&&r.slice(0,4)!==\"//?/\"?\"/\":t.root;r=r.substr(i.length),e+=i,t=J9(r)}return[e,r]}});var V9=w((Uot,z9)=>{\"use strict\";z9.exports=(r,e,t)=>(r&=4095,t&&(r=(r|384)&-19),e&&(r&256&&(r|=64),r&32&&(r|=8),r&4&&(r|=1)),r)});var TF=w((Yot,lX)=>{\"use strict\";var rX=_f(),iX=WB(),nX=ih(),Zo=J(\"fs\"),X9=J(\"path\"),Xo=th(),iFe=nh(),sX=(r,e)=>e?(r=Xo(r).replace(/^\\.(\\/|$)/,\"\"),iFe(e)+\"/\"+r):Xo(r),nFe=16*1024*1024,Z9=Symbol(\"process\"),_9=Symbol(\"file\"),$9=Symbol(\"directory\"),vF=Symbol(\"symlink\"),eX=Symbol(\"hardlink\"),KC=Symbol(\"header\"),XB=Symbol(\"read\"),xF=Symbol(\"lstat\"),ZB=Symbol(\"onlstat\"),PF=Symbol(\"onread\"),DF=Symbol(\"onreadlink\"),kF=Symbol(\"openfile\"),RF=Symbol(\"onopenfile\"),ol=Symbol(\"close\"),_B=Symbol(\"mode\"),FF=Symbol(\"awaitDrain\"),SF=Symbol(\"ondrain\"),_o=Symbol(\"prefix\"),tX=Symbol(\"hadError\"),oX=zB(),sFe=QF(),aX=bF(),AX=V9(),$B=oX(class extends rX{constructor(e,t){if(t=t||{},super(t),typeof e!=\"string\")throw new TypeError(\"path is required\");this.path=Xo(e),this.portable=!!t.portable,this.myuid=process.getuid&&process.getuid()||0,this.myuser=process.env.USER||\"\",this.maxReadSize=t.maxReadSize||nFe,this.linkCache=t.linkCache||new Map,this.statCache=t.statCache||new Map,this.preservePaths=!!t.preservePaths,this.cwd=Xo(t.cwd||process.cwd()),this.strict=!!t.strict,this.noPax=!!t.noPax,this.noMtime=!!t.noMtime,this.mtime=t.mtime||null,this.prefix=t.prefix?Xo(t.prefix):null,this.fd=null,this.blockLen=null,this.blockRemain=null,this.buf=null,this.offset=null,this.length=null,this.pos=null,this.remain=null,typeof t.onwarn==\"function\"&&this.on(\"warn\",t.onwarn);let i=!1;if(!this.preservePaths){let[n,s]=aX(this.path);n&&(this.path=s,i=n)}this.win32=!!t.win32||process.platform===\"win32\",this.win32&&(this.path=sFe.decode(this.path.replace(/\\\\/g,\"/\")),e=e.replace(/\\\\/g,\"/\")),this.absolute=Xo(t.absolute||X9.resolve(this.cwd,e)),this.path===\"\"&&(this.path=\"./\"),i&&this.warn(\"TAR_ENTRY_INFO\",`stripping ${i} from absolute path`,{entry:this,path:i+this.path}),this.statCache.has(this.absolute)?this[ZB](this.statCache.get(this.absolute)):this[xF]()}emit(e,...t){return e===\"error\"&&(this[tX]=!0),super.emit(e,...t)}[xF](){Zo.lstat(this.absolute,(e,t)=>{if(e)return this.emit(\"error\",e);this[ZB](t)})}[ZB](e){this.statCache.set(this.absolute,e),this.stat=e,e.isFile()||(e.size=0),this.type=aFe(e),this.emit(\"stat\",e),this[Z9]()}[Z9](){switch(this.type){case\"File\":return this[_9]();case\"Directory\":return this[$9]();case\"SymbolicLink\":return this[vF]();default:return this.end()}}[_B](e){return AX(e,this.type===\"Directory\",this.portable)}[_o](e){return sX(e,this.prefix)}[KC](){this.type===\"Directory\"&&this.portable&&(this.noMtime=!0),this.header=new nX({path:this[_o](this.path),linkpath:this.type===\"Link\"?this[_o](this.linkpath):this.linkpath,mode:this[_B](this.stat.mode),uid:this.portable?null:this.stat.uid,gid:this.portable?null:this.stat.gid,size:this.stat.size,mtime:this.noMtime?null:this.mtime||this.stat.mtime,type:this.type,uname:this.portable?null:this.stat.uid===this.myuid?this.myuser:\"\",atime:this.portable?null:this.stat.atime,ctime:this.portable?null:this.stat.ctime}),this.header.encode()&&!this.noPax&&super.write(new iX({atime:this.portable?null:this.header.atime,ctime:this.portable?null:this.header.ctime,gid:this.portable?null:this.header.gid,mtime:this.noMtime?null:this.mtime||this.header.mtime,path:this[_o](this.path),linkpath:this.type===\"Link\"?this[_o](this.linkpath):this.linkpath,size:this.header.size,uid:this.portable?null:this.header.uid,uname:this.portable?null:this.header.uname,dev:this.portable?null:this.stat.dev,ino:this.portable?null:this.stat.ino,nlink:this.portable?null:this.stat.nlink}).encode()),super.write(this.header.block)}[$9](){this.path.substr(-1)!==\"/\"&&(this.path+=\"/\"),this.stat.size=0,this[KC](),this.end()}[vF](){Zo.readlink(this.absolute,(e,t)=>{if(e)return this.emit(\"error\",e);this[DF](t)})}[DF](e){this.linkpath=Xo(e),this[KC](),this.end()}[eX](e){this.type=\"Link\",this.linkpath=Xo(X9.relative(this.cwd,e)),this.stat.size=0,this[KC](),this.end()}[_9](){if(this.stat.nlink>1){let e=this.stat.dev+\":\"+this.stat.ino;if(this.linkCache.has(e)){let t=this.linkCache.get(e);if(t.indexOf(this.cwd)===0)return this[eX](t)}this.linkCache.set(e,this.absolute)}if(this[KC](),this.stat.size===0)return this.end();this[kF]()}[kF](){Zo.open(this.absolute,\"r\",(e,t)=>{if(e)return this.emit(\"error\",e);this[RF](t)})}[RF](e){if(this.fd=e,this[tX])return this[ol]();this.blockLen=512*Math.ceil(this.stat.size/512),this.blockRemain=this.blockLen;let t=Math.min(this.blockLen,this.maxReadSize);this.buf=Buffer.allocUnsafe(t),this.offset=0,this.pos=0,this.remain=this.stat.size,this.length=this.buf.length,this[XB]()}[XB](){let{fd:e,buf:t,offset:i,length:n,pos:s}=this;Zo.read(e,t,i,n,s,(o,a)=>{if(o)return this[ol](()=>this.emit(\"error\",o));this[PF](a)})}[ol](e){Zo.close(this.fd,e)}[PF](e){if(e<=0&&this.remain>0){let n=new Error(\"encountered unexpected EOF\");return n.path=this.absolute,n.syscall=\"read\",n.code=\"EOF\",this[ol](()=>this.emit(\"error\",n))}if(e>this.remain){let n=new Error(\"did not encounter expected EOF\");return n.path=this.absolute,n.syscall=\"read\",n.code=\"EOF\",this[ol](()=>this.emit(\"error\",n))}if(e===this.remain)for(let n=e;n<this.length&&e<this.blockRemain;n++)this.buf[n+this.offset]=0,e++,this.remain++;let t=this.offset===0&&e===this.buf.length?this.buf:this.buf.slice(this.offset,this.offset+e);this.write(t)?this[SF]():this[FF](()=>this[SF]())}[FF](e){this.once(\"drain\",e)}write(e){if(this.blockRemain<e.length){let t=new Error(\"writing more data than expected\");return t.path=this.absolute,this.emit(\"error\",t)}return this.remain-=e.length,this.blockRemain-=e.length,this.pos+=e.length,this.offset+=e.length,super.write(e)}[SF](){if(!this.remain)return this.blockRemain&&super.write(Buffer.alloc(this.blockRemain)),this[ol](e=>e?this.emit(\"error\",e):this.end());this.offset>=this.length&&(this.buf=Buffer.allocUnsafe(Math.min(this.blockRemain,this.buf.length)),this.offset=0),this.length=this.buf.length-this.offset,this[XB]()}}),NF=class extends $B{[xF](){this[ZB](Zo.lstatSync(this.absolute))}[vF](){this[DF](Zo.readlinkSync(this.absolute))}[kF](){this[RF](Zo.openSync(this.absolute,\"r\"))}[XB](){let e=!0;try{let{fd:t,buf:i,offset:n,length:s,pos:o}=this,a=Zo.readSync(t,i,n,s,o);this[PF](a),e=!1}finally{if(e)try{this[ol](()=>{})}catch{}}}[FF](e){e()}[ol](e){Zo.closeSync(this.fd),e()}},oFe=oX(class extends rX{constructor(e,t){t=t||{},super(t),this.preservePaths=!!t.preservePaths,this.portable=!!t.portable,this.strict=!!t.strict,this.noPax=!!t.noPax,this.noMtime=!!t.noMtime,this.readEntry=e,this.type=e.type,this.type===\"Directory\"&&this.portable&&(this.noMtime=!0),this.prefix=t.prefix||null,this.path=Xo(e.path),this.mode=this[_B](e.mode),this.uid=this.portable?null:e.uid,this.gid=this.portable?null:e.gid,this.uname=this.portable?null:e.uname,this.gname=this.portable?null:e.gname,this.size=e.size,this.mtime=this.noMtime?null:t.mtime||e.mtime,this.atime=this.portable?null:e.atime,this.ctime=this.portable?null:e.ctime,this.linkpath=Xo(e.linkpath),typeof t.onwarn==\"function\"&&this.on(\"warn\",t.onwarn);let i=!1;if(!this.preservePaths){let[n,s]=aX(this.path);n&&(this.path=s,i=n)}this.remain=e.size,this.blockRemain=e.startBlockSize,this.header=new nX({path:this[_o](this.path),linkpath:this.type===\"Link\"?this[_o](this.linkpath):this.linkpath,mode:this.mode,uid:this.portable?null:this.uid,gid:this.portable?null:this.gid,size:this.size,mtime:this.noMtime?null:this.mtime,type:this.type,uname:this.portable?null:this.uname,atime:this.portable?null:this.atime,ctime:this.portable?null:this.ctime}),i&&this.warn(\"TAR_ENTRY_INFO\",`stripping ${i} from absolute path`,{entry:this,path:i+this.path}),this.header.encode()&&!this.noPax&&super.write(new iX({atime:this.portable?null:this.atime,ctime:this.portable?null:this.ctime,gid:this.portable?null:this.gid,mtime:this.noMtime?null:this.mtime,path:this[_o](this.path),linkpath:this.type===\"Link\"?this[_o](this.linkpath):this.linkpath,size:this.size,uid:this.portable?null:this.uid,uname:this.portable?null:this.uname,dev:this.portable?null:this.readEntry.dev,ino:this.portable?null:this.readEntry.ino,nlink:this.portable?null:this.readEntry.nlink}).encode()),super.write(this.header.block),e.pipe(this)}[_o](e){return sX(e,this.prefix)}[_B](e){return AX(e,this.type===\"Directory\",this.portable)}write(e){let t=e.length;if(t>this.blockRemain)throw new Error(\"writing more to entry than is appropriate\");return this.blockRemain-=t,super.write(e)}end(){return this.blockRemain&&super.write(Buffer.alloc(this.blockRemain)),super.end()}});$B.Sync=NF;$B.Tar=oFe;var aFe=r=>r.isFile()?\"File\":r.isDirectory()?\"Directory\":r.isSymbolicLink()?\"SymbolicLink\":\"Unsupported\";lX.exports=$B});var A0=w((qot,dX)=>{\"use strict\";var o0=class{constructor(e,t){this.path=e||\"./\",this.absolute=t,this.entry=null,this.stat=null,this.readdir=null,this.pending=!1,this.ignore=!1,this.piped=!1}},AFe=_f(),lFe=hF(),cFe=qB(),jF=TF(),uFe=jF.Sync,gFe=jF.Tar,fFe=WI(),cX=Buffer.alloc(1024),r0=Symbol(\"onStat\"),e0=Symbol(\"ended\"),$o=Symbol(\"queue\"),sh=Symbol(\"current\"),jc=Symbol(\"process\"),t0=Symbol(\"processing\"),uX=Symbol(\"processJob\"),ea=Symbol(\"jobs\"),LF=Symbol(\"jobDone\"),i0=Symbol(\"addFSEntry\"),gX=Symbol(\"addTarEntry\"),UF=Symbol(\"stat\"),HF=Symbol(\"readdir\"),n0=Symbol(\"onreaddir\"),s0=Symbol(\"pipe\"),fX=Symbol(\"entry\"),OF=Symbol(\"entryOpt\"),GF=Symbol(\"writeEntryClass\"),pX=Symbol(\"write\"),MF=Symbol(\"ondrain\"),a0=J(\"fs\"),hX=J(\"path\"),hFe=zB(),KF=th(),qF=hFe(class extends AFe{constructor(e){super(e),e=e||Object.create(null),this.opt=e,this.file=e.file||\"\",this.cwd=e.cwd||process.cwd(),this.maxReadSize=e.maxReadSize,this.preservePaths=!!e.preservePaths,this.strict=!!e.strict,this.noPax=!!e.noPax,this.prefix=KF(e.prefix||\"\"),this.linkCache=e.linkCache||new Map,this.statCache=e.statCache||new Map,this.readdirCache=e.readdirCache||new Map,this[GF]=jF,typeof e.onwarn==\"function\"&&this.on(\"warn\",e.onwarn),this.portable=!!e.portable,this.zip=null,e.gzip?(typeof e.gzip!=\"object\"&&(e.gzip={}),this.portable&&(e.gzip.portable=!0),this.zip=new lFe.Gzip(e.gzip),this.zip.on(\"data\",t=>super.write(t)),this.zip.on(\"end\",t=>super.end()),this.zip.on(\"drain\",t=>this[MF]()),this.on(\"resume\",t=>this.zip.resume())):this.on(\"drain\",this[MF]),this.noDirRecurse=!!e.noDirRecurse,this.follow=!!e.follow,this.noMtime=!!e.noMtime,this.mtime=e.mtime||null,this.filter=typeof e.filter==\"function\"?e.filter:t=>!0,this[$o]=new fFe,this[ea]=0,this.jobs=+e.jobs||4,this[t0]=!1,this[e0]=!1}[pX](e){return super.write(e)}add(e){return this.write(e),this}end(e){return e&&this.write(e),this[e0]=!0,this[jc](),this}write(e){if(this[e0])throw new Error(\"write after end\");return e instanceof cFe?this[gX](e):this[i0](e),this.flowing}[gX](e){let t=KF(hX.resolve(this.cwd,e.path));if(!this.filter(e.path,e))e.resume();else{let i=new o0(e.path,t,!1);i.entry=new gFe(e,this[OF](i)),i.entry.on(\"end\",n=>this[LF](i)),this[ea]+=1,this[$o].push(i)}this[jc]()}[i0](e){let t=KF(hX.resolve(this.cwd,e));this[$o].push(new o0(e,t)),this[jc]()}[UF](e){e.pending=!0,this[ea]+=1;let t=this.follow?\"stat\":\"lstat\";a0[t](e.absolute,(i,n)=>{e.pending=!1,this[ea]-=1,i?this.emit(\"error\",i):this[r0](e,n)})}[r0](e,t){this.statCache.set(e.absolute,t),e.stat=t,this.filter(e.path,t)||(e.ignore=!0),this[jc]()}[HF](e){e.pending=!0,this[ea]+=1,a0.readdir(e.absolute,(t,i)=>{if(e.pending=!1,this[ea]-=1,t)return this.emit(\"error\",t);this[n0](e,i)})}[n0](e,t){this.readdirCache.set(e.absolute,t),e.readdir=t,this[jc]()}[jc](){if(!this[t0]){this[t0]=!0;for(let e=this[$o].head;e!==null&&this[ea]<this.jobs;e=e.next)if(this[uX](e.value),e.value.ignore){let t=e.next;this[$o].removeNode(e),e.next=t}this[t0]=!1,this[e0]&&!this[$o].length&&this[ea]===0&&(this.zip?this.zip.end(cX):(super.write(cX),super.end()))}}get[sh](){return this[$o]&&this[$o].head&&this[$o].head.value}[LF](e){this[$o].shift(),this[ea]-=1,this[jc]()}[uX](e){if(!e.pending){if(e.entry){e===this[sh]&&!e.piped&&this[s0](e);return}if(e.stat||(this.statCache.has(e.absolute)?this[r0](e,this.statCache.get(e.absolute)):this[UF](e)),!!e.stat&&!e.ignore&&!(!this.noDirRecurse&&e.stat.isDirectory()&&!e.readdir&&(this.readdirCache.has(e.absolute)?this[n0](e,this.readdirCache.get(e.absolute)):this[HF](e),!e.readdir))){if(e.entry=this[fX](e),!e.entry){e.ignore=!0;return}e===this[sh]&&!e.piped&&this[s0](e)}}}[OF](e){return{onwarn:(t,i,n)=>this.warn(t,i,n),noPax:this.noPax,cwd:this.cwd,absolute:e.absolute,preservePaths:this.preservePaths,maxReadSize:this.maxReadSize,strict:this.strict,portable:this.portable,linkCache:this.linkCache,statCache:this.statCache,noMtime:this.noMtime,mtime:this.mtime,prefix:this.prefix}}[fX](e){this[ea]+=1;try{return new this[GF](e.path,this[OF](e)).on(\"end\",()=>this[LF](e)).on(\"error\",t=>this.emit(\"error\",t))}catch(t){this.emit(\"error\",t)}}[MF](){this[sh]&&this[sh].entry&&this[sh].entry.resume()}[s0](e){e.piped=!0,e.readdir&&e.readdir.forEach(n=>{let s=e.path,o=s===\"./\"?\"\":s.replace(/\\/*$/,\"/\");this[i0](o+n)});let t=e.entry,i=this.zip;i?t.on(\"data\",n=>{i.write(n)||t.pause()}):t.on(\"data\",n=>{super.write(n)||t.pause()})}pause(){return this.zip&&this.zip.pause(),super.pause()}}),YF=class extends qF{constructor(e){super(e),this[GF]=uFe}pause(){}resume(){}[UF](e){let t=this.follow?\"statSync\":\"lstatSync\";this[r0](e,a0[t](e.absolute))}[HF](e,t){this[n0](e,a0.readdirSync(e.absolute))}[s0](e){let t=e.entry,i=this.zip;e.readdir&&e.readdir.forEach(n=>{let s=e.path,o=s===\"./\"?\"\":s.replace(/\\/*$/,\"/\");this[i0](o+n)}),i?t.on(\"data\",n=>{i.write(n)}):t.on(\"data\",n=>{super[pX](n)})}};qF.Sync=YF;dX.exports=qF});var fh=w(HC=>{\"use strict\";var pFe=_f(),dFe=J(\"events\").EventEmitter,Pn=J(\"fs\"),zF=Pn.writev;if(!zF){let r=process.binding(\"fs\"),e=r.FSReqWrap||r.FSReqCallback;zF=(t,i,n,s)=>{let o=(l,c)=>s(l,c,i),a=new e;a.oncomplete=o,r.writeBuffers(t,i,n,a)}}var uh=Symbol(\"_autoClose\"),Ao=Symbol(\"_close\"),UC=Symbol(\"_ended\"),rr=Symbol(\"_fd\"),CX=Symbol(\"_finished\"),Al=Symbol(\"_flags\"),JF=Symbol(\"_flush\"),VF=Symbol(\"_handleChunk\"),XF=Symbol(\"_makeBuf\"),f0=Symbol(\"_mode\"),l0=Symbol(\"_needDrain\"),lh=Symbol(\"_onerror\"),gh=Symbol(\"_onopen\"),WF=Symbol(\"_onread\"),ah=Symbol(\"_onwrite\"),ll=Symbol(\"_open\"),$a=Symbol(\"_path\"),qc=Symbol(\"_pos\"),ta=Symbol(\"_queue\"),Ah=Symbol(\"_read\"),mX=Symbol(\"_readSize\"),al=Symbol(\"_reading\"),c0=Symbol(\"_remain\"),EX=Symbol(\"_size\"),u0=Symbol(\"_write\"),oh=Symbol(\"_writing\"),g0=Symbol(\"_defaultFlag\"),ch=Symbol(\"_errored\"),h0=class extends pFe{constructor(e,t){if(t=t||{},super(t),this.readable=!0,this.writable=!1,typeof e!=\"string\")throw new TypeError(\"path must be a string\");this[ch]=!1,this[rr]=typeof t.fd==\"number\"?t.fd:null,this[$a]=e,this[mX]=t.readSize||16*1024*1024,this[al]=!1,this[EX]=typeof t.size==\"number\"?t.size:1/0,this[c0]=this[EX],this[uh]=typeof t.autoClose==\"boolean\"?t.autoClose:!0,typeof this[rr]==\"number\"?this[Ah]():this[ll]()}get fd(){return this[rr]}get path(){return this[$a]}write(){throw new TypeError(\"this is a readable stream\")}end(){throw new TypeError(\"this is a readable stream\")}[ll](){Pn.open(this[$a],\"r\",(e,t)=>this[gh](e,t))}[gh](e,t){e?this[lh](e):(this[rr]=t,this.emit(\"open\",t),this[Ah]())}[XF](){return Buffer.allocUnsafe(Math.min(this[mX],this[c0]))}[Ah](){if(!this[al]){this[al]=!0;let e=this[XF]();if(e.length===0)return process.nextTick(()=>this[WF](null,0,e));Pn.read(this[rr],e,0,e.length,null,(t,i,n)=>this[WF](t,i,n))}}[WF](e,t,i){this[al]=!1,e?this[lh](e):this[VF](t,i)&&this[Ah]()}[Ao](){if(this[uh]&&typeof this[rr]==\"number\"){let e=this[rr];this[rr]=null,Pn.close(e,t=>t?this.emit(\"error\",t):this.emit(\"close\"))}}[lh](e){this[al]=!0,this[Ao](),this.emit(\"error\",e)}[VF](e,t){let i=!1;return this[c0]-=e,e>0&&(i=super.write(e<t.length?t.slice(0,e):t)),(e===0||this[c0]<=0)&&(i=!1,this[Ao](),super.end()),i}emit(e,t){switch(e){case\"prefinish\":case\"finish\":break;case\"drain\":typeof this[rr]==\"number\"&&this[Ah]();break;case\"error\":return this[ch]?void 0:(this[ch]=!0,super.emit(e,t));default:return super.emit(e,t)}}},ZF=class extends h0{[ll](){let e=!0;try{this[gh](null,Pn.openSync(this[$a],\"r\")),e=!1}finally{e&&this[Ao]()}}[Ah](){let e=!0;try{if(!this[al]){this[al]=!0;do{let t=this[XF](),i=t.length===0?0:Pn.readSync(this[rr],t,0,t.length,null);if(!this[VF](i,t))break}while(!0);this[al]=!1}e=!1}finally{e&&this[Ao]()}}[Ao](){if(this[uh]&&typeof this[rr]==\"number\"){let e=this[rr];this[rr]=null,Pn.closeSync(e),this.emit(\"close\")}}},p0=class extends dFe{constructor(e,t){t=t||{},super(t),this.readable=!1,this.writable=!0,this[ch]=!1,this[oh]=!1,this[UC]=!1,this[l0]=!1,this[ta]=[],this[$a]=e,this[rr]=typeof t.fd==\"number\"?t.fd:null,this[f0]=t.mode===void 0?438:t.mode,this[qc]=typeof t.start==\"number\"?t.start:null,this[uh]=typeof t.autoClose==\"boolean\"?t.autoClose:!0;let i=this[qc]!==null?\"r+\":\"w\";this[g0]=t.flags===void 0,this[Al]=this[g0]?i:t.flags,this[rr]===null&&this[ll]()}emit(e,t){if(e===\"error\"){if(this[ch])return;this[ch]=!0}return super.emit(e,t)}get fd(){return this[rr]}get path(){return this[$a]}[lh](e){this[Ao](),this[oh]=!0,this.emit(\"error\",e)}[ll](){Pn.open(this[$a],this[Al],this[f0],(e,t)=>this[gh](e,t))}[gh](e,t){this[g0]&&this[Al]===\"r+\"&&e&&e.code===\"ENOENT\"?(this[Al]=\"w\",this[ll]()):e?this[lh](e):(this[rr]=t,this.emit(\"open\",t),this[JF]())}end(e,t){return e&&this.write(e,t),this[UC]=!0,!this[oh]&&!this[ta].length&&typeof this[rr]==\"number\"&&this[ah](null,0),this}write(e,t){return typeof e==\"string\"&&(e=Buffer.from(e,t)),this[UC]?(this.emit(\"error\",new Error(\"write() after end()\")),!1):this[rr]===null||this[oh]||this[ta].length?(this[ta].push(e),this[l0]=!0,!1):(this[oh]=!0,this[u0](e),!0)}[u0](e){Pn.write(this[rr],e,0,e.length,this[qc],(t,i)=>this[ah](t,i))}[ah](e,t){e?this[lh](e):(this[qc]!==null&&(this[qc]+=t),this[ta].length?this[JF]():(this[oh]=!1,this[UC]&&!this[CX]?(this[CX]=!0,this[Ao](),this.emit(\"finish\")):this[l0]&&(this[l0]=!1,this.emit(\"drain\"))))}[JF](){if(this[ta].length===0)this[UC]&&this[ah](null,0);else if(this[ta].length===1)this[u0](this[ta].pop());else{let e=this[ta];this[ta]=[],zF(this[rr],e,this[qc],(t,i)=>this[ah](t,i))}}[Ao](){if(this[uh]&&typeof this[rr]==\"number\"){let e=this[rr];this[rr]=null,Pn.close(e,t=>t?this.emit(\"error\",t):this.emit(\"close\"))}}},_F=class extends p0{[ll](){let e;if(this[g0]&&this[Al]===\"r+\")try{e=Pn.openSync(this[$a],this[Al],this[f0])}catch(t){if(t.code===\"ENOENT\")return this[Al]=\"w\",this[ll]();throw t}else e=Pn.openSync(this[$a],this[Al],this[f0]);this[gh](null,e)}[Ao](){if(this[uh]&&typeof this[rr]==\"number\"){let e=this[rr];this[rr]=null,Pn.closeSync(e),this.emit(\"close\")}}[u0](e){let t=!0;try{this[ah](null,Pn.writeSync(this[rr],e,0,e.length,this[qc])),t=!1}finally{if(t)try{this[Ao]()}catch{}}}};HC.ReadStream=h0;HC.ReadStreamSync=ZF;HC.WriteStream=p0;HC.WriteStreamSync=_F});var w0=w((zot,SX)=>{\"use strict\";var CFe=zB(),mFe=ih(),EFe=J(\"events\"),IFe=WI(),yFe=1024*1024,wFe=qB(),IX=WB(),BFe=hF(),$F=Buffer.from([31,139]),xs=Symbol(\"state\"),Jc=Symbol(\"writeEntry\"),eA=Symbol(\"readEntry\"),eN=Symbol(\"nextEntry\"),yX=Symbol(\"processEntry\"),Ps=Symbol(\"extendedHeader\"),GC=Symbol(\"globalExtendedHeader\"),cl=Symbol(\"meta\"),wX=Symbol(\"emitMeta\"),Er=Symbol(\"buffer\"),tA=Symbol(\"queue\"),Wc=Symbol(\"ended\"),BX=Symbol(\"emittedEnd\"),zc=Symbol(\"emit\"),Dn=Symbol(\"unzip\"),d0=Symbol(\"consumeChunk\"),C0=Symbol(\"consumeChunkSub\"),tN=Symbol(\"consumeBody\"),QX=Symbol(\"consumeMeta\"),bX=Symbol(\"consumeHeader\"),m0=Symbol(\"consuming\"),rN=Symbol(\"bufferConcat\"),iN=Symbol(\"maybeEnd\"),YC=Symbol(\"writing\"),ul=Symbol(\"aborted\"),E0=Symbol(\"onDone\"),Vc=Symbol(\"sawValidEntry\"),I0=Symbol(\"sawNullBlock\"),y0=Symbol(\"sawEOF\"),QFe=r=>!0;SX.exports=CFe(class extends EFe{constructor(e){e=e||{},super(e),this.file=e.file||\"\",this[Vc]=null,this.on(E0,t=>{(this[xs]===\"begin\"||this[Vc]===!1)&&this.warn(\"TAR_BAD_ARCHIVE\",\"Unrecognized archive format\")}),e.ondone?this.on(E0,e.ondone):this.on(E0,t=>{this.emit(\"prefinish\"),this.emit(\"finish\"),this.emit(\"end\"),this.emit(\"close\")}),this.strict=!!e.strict,this.maxMetaEntrySize=e.maxMetaEntrySize||yFe,this.filter=typeof e.filter==\"function\"?e.filter:QFe,this.writable=!0,this.readable=!1,this[tA]=new IFe,this[Er]=null,this[eA]=null,this[Jc]=null,this[xs]=\"begin\",this[cl]=\"\",this[Ps]=null,this[GC]=null,this[Wc]=!1,this[Dn]=null,this[ul]=!1,this[I0]=!1,this[y0]=!1,typeof e.onwarn==\"function\"&&this.on(\"warn\",e.onwarn),typeof e.onentry==\"function\"&&this.on(\"entry\",e.onentry)}[bX](e,t){this[Vc]===null&&(this[Vc]=!1);let i;try{i=new mFe(e,t,this[Ps],this[GC])}catch(n){return this.warn(\"TAR_ENTRY_INVALID\",n)}if(i.nullBlock)this[I0]?(this[y0]=!0,this[xs]===\"begin\"&&(this[xs]=\"header\"),this[zc](\"eof\")):(this[I0]=!0,this[zc](\"nullBlock\"));else if(this[I0]=!1,!i.cksumValid)this.warn(\"TAR_ENTRY_INVALID\",\"checksum failure\",{header:i});else if(!i.path)this.warn(\"TAR_ENTRY_INVALID\",\"path is required\",{header:i});else{let n=i.type;if(/^(Symbolic)?Link$/.test(n)&&!i.linkpath)this.warn(\"TAR_ENTRY_INVALID\",\"linkpath required\",{header:i});else if(!/^(Symbolic)?Link$/.test(n)&&i.linkpath)this.warn(\"TAR_ENTRY_INVALID\",\"linkpath forbidden\",{header:i});else{let s=this[Jc]=new wFe(i,this[Ps],this[GC]);if(!this[Vc])if(s.remain){let o=()=>{s.invalid||(this[Vc]=!0)};s.on(\"end\",o)}else this[Vc]=!0;s.meta?s.size>this.maxMetaEntrySize?(s.ignore=!0,this[zc](\"ignoredEntry\",s),this[xs]=\"ignore\",s.resume()):s.size>0&&(this[cl]=\"\",s.on(\"data\",o=>this[cl]+=o),this[xs]=\"meta\"):(this[Ps]=null,s.ignore=s.ignore||!this.filter(s.path,s),s.ignore?(this[zc](\"ignoredEntry\",s),this[xs]=s.remain?\"ignore\":\"header\",s.resume()):(s.remain?this[xs]=\"body\":(this[xs]=\"header\",s.end()),this[eA]?this[tA].push(s):(this[tA].push(s),this[eN]())))}}}[yX](e){let t=!0;return e?Array.isArray(e)?this.emit.apply(this,e):(this[eA]=e,this.emit(\"entry\",e),e.emittedEnd||(e.on(\"end\",i=>this[eN]()),t=!1)):(this[eA]=null,t=!1),t}[eN](){do;while(this[yX](this[tA].shift()));if(!this[tA].length){let e=this[eA];!e||e.flowing||e.size===e.remain?this[YC]||this.emit(\"drain\"):e.once(\"drain\",i=>this.emit(\"drain\"))}}[tN](e,t){let i=this[Jc],n=i.blockRemain,s=n>=e.length&&t===0?e:e.slice(t,t+n);return i.write(s),i.blockRemain||(this[xs]=\"header\",this[Jc]=null,i.end()),s.length}[QX](e,t){let i=this[Jc],n=this[tN](e,t);return this[Jc]||this[wX](i),n}[zc](e,t,i){!this[tA].length&&!this[eA]?this.emit(e,t,i):this[tA].push([e,t,i])}[wX](e){switch(this[zc](\"meta\",this[cl]),e.type){case\"ExtendedHeader\":case\"OldExtendedHeader\":this[Ps]=IX.parse(this[cl],this[Ps],!1);break;case\"GlobalExtendedHeader\":this[GC]=IX.parse(this[cl],this[GC],!0);break;case\"NextFileHasLongPath\":case\"OldGnuLongPath\":this[Ps]=this[Ps]||Object.create(null),this[Ps].path=this[cl].replace(/\\0.*/,\"\");break;case\"NextFileHasLongLinkpath\":this[Ps]=this[Ps]||Object.create(null),this[Ps].linkpath=this[cl].replace(/\\0.*/,\"\");break;default:throw new Error(\"unknown meta: \"+e.type)}}abort(e){this[ul]=!0,this.emit(\"abort\",e),this.warn(\"TAR_ABORT\",e,{recoverable:!1})}write(e){if(this[ul])return;if(this[Dn]===null&&e){if(this[Er]&&(e=Buffer.concat([this[Er],e]),this[Er]=null),e.length<$F.length)return this[Er]=e,!0;for(let i=0;this[Dn]===null&&i<$F.length;i++)e[i]!==$F[i]&&(this[Dn]=!1);if(this[Dn]===null){let i=this[Wc];this[Wc]=!1,this[Dn]=new BFe.Unzip,this[Dn].on(\"data\",s=>this[d0](s)),this[Dn].on(\"error\",s=>this.abort(s)),this[Dn].on(\"end\",s=>{this[Wc]=!0,this[d0]()}),this[YC]=!0;let n=this[Dn][i?\"end\":\"write\"](e);return this[YC]=!1,n}}this[YC]=!0,this[Dn]?this[Dn].write(e):this[d0](e),this[YC]=!1;let t=this[tA].length?!1:this[eA]?this[eA].flowing:!0;return!t&&!this[tA].length&&this[eA].once(\"drain\",i=>this.emit(\"drain\")),t}[rN](e){e&&!this[ul]&&(this[Er]=this[Er]?Buffer.concat([this[Er],e]):e)}[iN](){if(this[Wc]&&!this[BX]&&!this[ul]&&!this[m0]){this[BX]=!0;let e=this[Jc];if(e&&e.blockRemain){let t=this[Er]?this[Er].length:0;this.warn(\"TAR_BAD_ARCHIVE\",`Truncated input (needed ${e.blockRemain} more bytes, only ${t} available)`,{entry:e}),this[Er]&&e.write(this[Er]),e.end()}this[zc](E0)}}[d0](e){if(this[m0])this[rN](e);else if(!e&&!this[Er])this[iN]();else{if(this[m0]=!0,this[Er]){this[rN](e);let t=this[Er];this[Er]=null,this[C0](t)}else this[C0](e);for(;this[Er]&&this[Er].length>=512&&!this[ul]&&!this[y0];){let t=this[Er];this[Er]=null,this[C0](t)}this[m0]=!1}(!this[Er]||this[Wc])&&this[iN]()}[C0](e){let t=0,i=e.length;for(;t+512<=i&&!this[ul]&&!this[y0];)switch(this[xs]){case\"begin\":case\"header\":this[bX](e,t),t+=512;break;case\"ignore\":case\"body\":t+=this[tN](e,t);break;case\"meta\":t+=this[QX](e,t);break;default:throw new Error(\"invalid state: \"+this[xs])}t<i&&(this[Er]?this[Er]=Buffer.concat([e.slice(t),this[Er]]):this[Er]=e.slice(t))}end(e){this[ul]||(this[Dn]?this[Dn].end(e):(this[Wc]=!0,this.write(e)))}})});var B0=w((Vot,DX)=>{\"use strict\";var bFe=Xf(),xX=w0(),hh=J(\"fs\"),SFe=fh(),vX=J(\"path\"),nN=nh();DX.exports=(r,e,t)=>{typeof r==\"function\"?(t=r,e=null,r={}):Array.isArray(r)&&(e=r,r={}),typeof e==\"function\"&&(t=e,e=null),e?e=Array.from(e):e=[];let i=bFe(r);if(i.sync&&typeof t==\"function\")throw new TypeError(\"callback not supported for sync tar functions\");if(!i.file&&typeof t==\"function\")throw new TypeError(\"callback only supported with file option\");return e.length&&xFe(i,e),i.noResume||vFe(i),i.file&&i.sync?PFe(i):i.file?DFe(i,t):PX(i)};var vFe=r=>{let e=r.onentry;r.onentry=e?t=>{e(t),t.resume()}:t=>t.resume()},xFe=(r,e)=>{let t=new Map(e.map(s=>[nN(s),!0])),i=r.filter,n=(s,o)=>{let a=o||vX.parse(s).root||\".\",l=s===a?!1:t.has(s)?t.get(s):n(vX.dirname(s),a);return t.set(s,l),l};r.filter=i?(s,o)=>i(s,o)&&n(nN(s)):s=>n(nN(s))},PFe=r=>{let e=PX(r),t=r.file,i=!0,n;try{let s=hh.statSync(t),o=r.maxReadSize||16*1024*1024;if(s.size<o)e.end(hh.readFileSync(t));else{let a=0,l=Buffer.allocUnsafe(o);for(n=hh.openSync(t,\"r\");a<s.size;){let c=hh.readSync(n,l,0,o,a);a+=c,e.write(l.slice(0,c))}e.end()}i=!1}finally{if(i&&n)try{hh.closeSync(n)}catch{}}},DFe=(r,e)=>{let t=new xX(r),i=r.maxReadSize||16*1024*1024,n=r.file,s=new Promise((o,a)=>{t.on(\"error\",a),t.on(\"end\",o),hh.stat(n,(l,c)=>{if(l)a(l);else{let u=new SFe.ReadStream(n,{readSize:i,size:c.size});u.on(\"error\",a),u.pipe(t)}})});return e?s.then(e,e):s},PX=r=>new xX(r)});var LX=w((Xot,TX)=>{\"use strict\";var kFe=Xf(),Q0=A0(),kX=fh(),RX=B0(),FX=J(\"path\");TX.exports=(r,e,t)=>{if(typeof e==\"function\"&&(t=e),Array.isArray(r)&&(e=r,r={}),!e||!Array.isArray(e)||!e.length)throw new TypeError(\"no files or directories specified\");e=Array.from(e);let i=kFe(r);if(i.sync&&typeof t==\"function\")throw new TypeError(\"callback not supported for sync tar functions\");if(!i.file&&typeof t==\"function\")throw new TypeError(\"callback only supported with file option\");return i.file&&i.sync?RFe(i,e):i.file?FFe(i,e,t):i.sync?NFe(i,e):TFe(i,e)};var RFe=(r,e)=>{let t=new Q0.Sync(r),i=new kX.WriteStreamSync(r.file,{mode:r.mode||438});t.pipe(i),NX(t,e)},FFe=(r,e,t)=>{let i=new Q0(r),n=new kX.WriteStream(r.file,{mode:r.mode||438});i.pipe(n);let s=new Promise((o,a)=>{n.on(\"error\",a),n.on(\"close\",o),i.on(\"error\",a)});return sN(i,e),t?s.then(t,t):s},NX=(r,e)=>{e.forEach(t=>{t.charAt(0)===\"@\"?RX({file:FX.resolve(r.cwd,t.substr(1)),sync:!0,noResume:!0,onentry:i=>r.add(i)}):r.add(t)}),r.end()},sN=(r,e)=>{for(;e.length;){let t=e.shift();if(t.charAt(0)===\"@\")return RX({file:FX.resolve(r.cwd,t.substr(1)),noResume:!0,onentry:i=>r.add(i)}).then(i=>sN(r,e));r.add(t)}r.end()},NFe=(r,e)=>{let t=new Q0.Sync(r);return NX(t,e),t},TFe=(r,e)=>{let t=new Q0(r);return sN(t,e),t}});var oN=w((Zot,YX)=>{\"use strict\";var LFe=Xf(),OX=A0(),_n=J(\"fs\"),MX=fh(),KX=B0(),UX=J(\"path\"),HX=ih();YX.exports=(r,e,t)=>{let i=LFe(r);if(!i.file)throw new TypeError(\"file is required\");if(i.gzip)throw new TypeError(\"cannot append to compressed archives\");if(!e||!Array.isArray(e)||!e.length)throw new TypeError(\"no files or directories specified\");return e=Array.from(e),i.sync?OFe(i,e):KFe(i,e,t)};var OFe=(r,e)=>{let t=new OX.Sync(r),i=!0,n,s;try{try{n=_n.openSync(r.file,\"r+\")}catch(l){if(l.code===\"ENOENT\")n=_n.openSync(r.file,\"w+\");else throw l}let o=_n.fstatSync(n),a=Buffer.alloc(512);e:for(s=0;s<o.size;s+=512){for(let u=0,g=0;u<512;u+=g){if(g=_n.readSync(n,a,u,a.length-u,s+u),s===0&&a[0]===31&&a[1]===139)throw new Error(\"cannot append to compressed archives\");if(!g)break e}let l=new HX(a);if(!l.cksumValid)break;let c=512*Math.ceil(l.size/512);if(s+c+512>o.size)break;s+=c,r.mtimeCache&&r.mtimeCache.set(l.path,l.mtime)}i=!1,MFe(r,t,s,n,e)}finally{if(i)try{_n.closeSync(n)}catch{}}},MFe=(r,e,t,i,n)=>{let s=new MX.WriteStreamSync(r.file,{fd:i,start:t});e.pipe(s),UFe(e,n)},KFe=(r,e,t)=>{e=Array.from(e);let i=new OX(r),n=(o,a,l)=>{let c=(p,C)=>{p?_n.close(o,y=>l(p)):l(null,C)},u=0;if(a===0)return c(null,0);let g=0,f=Buffer.alloc(512),h=(p,C)=>{if(p)return c(p);if(g+=C,g<512&&C)return _n.read(o,f,g,f.length-g,u+g,h);if(u===0&&f[0]===31&&f[1]===139)return c(new Error(\"cannot append to compressed archives\"));if(g<512)return c(null,u);let y=new HX(f);if(!y.cksumValid)return c(null,u);let B=512*Math.ceil(y.size/512);if(u+B+512>a||(u+=B+512,u>=a))return c(null,u);r.mtimeCache&&r.mtimeCache.set(y.path,y.mtime),g=0,_n.read(o,f,0,512,u,h)};_n.read(o,f,0,512,u,h)},s=new Promise((o,a)=>{i.on(\"error\",a);let l=\"r+\",c=(u,g)=>{if(u&&u.code===\"ENOENT\"&&l===\"r+\")return l=\"w+\",_n.open(r.file,l,c);if(u)return a(u);_n.fstat(g,(f,h)=>{if(f)return _n.close(g,()=>a(f));n(g,h.size,(p,C)=>{if(p)return a(p);let y=new MX.WriteStream(r.file,{fd:g,start:C});i.pipe(y),y.on(\"error\",a),y.on(\"close\",o),GX(i,e)})})};_n.open(r.file,l,c)});return t?s.then(t,t):s},UFe=(r,e)=>{e.forEach(t=>{t.charAt(0)===\"@\"?KX({file:UX.resolve(r.cwd,t.substr(1)),sync:!0,noResume:!0,onentry:i=>r.add(i)}):r.add(t)}),r.end()},GX=(r,e)=>{for(;e.length;){let t=e.shift();if(t.charAt(0)===\"@\")return KX({file:UX.resolve(r.cwd,t.substr(1)),noResume:!0,onentry:i=>r.add(i)}).then(i=>GX(r,e));r.add(t)}r.end()}});var qX=w((_ot,jX)=>{\"use strict\";var HFe=Xf(),GFe=oN();jX.exports=(r,e,t)=>{let i=HFe(r);if(!i.file)throw new TypeError(\"file is required\");if(i.gzip)throw new TypeError(\"cannot append to compressed archives\");if(!e||!Array.isArray(e)||!e.length)throw new TypeError(\"no files or directories specified\");return e=Array.from(e),YFe(i),GFe(i,e,t)};var YFe=r=>{let e=r.filter;r.mtimeCache||(r.mtimeCache=new Map),r.filter=e?(t,i)=>e(t,i)&&!(r.mtimeCache.get(t)>i.mtime):(t,i)=>!(r.mtimeCache.get(t)>i.mtime)}});var zX=w(($ot,WX)=>{var{promisify:JX}=J(\"util\"),gl=J(\"fs\"),jFe=r=>{if(!r)r={mode:511,fs:gl};else if(typeof r==\"object\")r={mode:511,fs:gl,...r};else if(typeof r==\"number\")r={mode:r,fs:gl};else if(typeof r==\"string\")r={mode:parseInt(r,8),fs:gl};else throw new TypeError(\"invalid options argument\");return r.mkdir=r.mkdir||r.fs.mkdir||gl.mkdir,r.mkdirAsync=JX(r.mkdir),r.stat=r.stat||r.fs.stat||gl.stat,r.statAsync=JX(r.stat),r.statSync=r.statSync||r.fs.statSync||gl.statSync,r.mkdirSync=r.mkdirSync||r.fs.mkdirSync||gl.mkdirSync,r};WX.exports=jFe});var XX=w((eat,VX)=>{var qFe=process.env.__TESTING_MKDIRP_PLATFORM__||process.platform,{resolve:JFe,parse:WFe}=J(\"path\"),zFe=r=>{if(/\\0/.test(r))throw Object.assign(new TypeError(\"path must be a string without null bytes\"),{path:r,code:\"ERR_INVALID_ARG_VALUE\"});if(r=JFe(r),qFe===\"win32\"){let e=/[*|\"<>?:]/,{root:t}=WFe(r);if(e.test(r.substr(t.length)))throw Object.assign(new Error(\"Illegal characters in path.\"),{path:r,code:\"EINVAL\"})}return r};VX.exports=zFe});var t7=w((tat,e7)=>{var{dirname:ZX}=J(\"path\"),_X=(r,e,t=void 0)=>t===e?Promise.resolve():r.statAsync(e).then(i=>i.isDirectory()?t:void 0,i=>i.code===\"ENOENT\"?_X(r,ZX(e),e):void 0),$X=(r,e,t=void 0)=>{if(t!==e)try{return r.statSync(e).isDirectory()?t:void 0}catch(i){return i.code===\"ENOENT\"?$X(r,ZX(e),e):void 0}};e7.exports={findMade:_X,findMadeSync:$X}});var lN=w((rat,i7)=>{var{dirname:r7}=J(\"path\"),aN=(r,e,t)=>{e.recursive=!1;let i=r7(r);return i===r?e.mkdirAsync(r,e).catch(n=>{if(n.code!==\"EISDIR\")throw n}):e.mkdirAsync(r,e).then(()=>t||r,n=>{if(n.code===\"ENOENT\")return aN(i,e).then(s=>aN(r,e,s));if(n.code!==\"EEXIST\"&&n.code!==\"EROFS\")throw n;return e.statAsync(r).then(s=>{if(s.isDirectory())return t;throw n},()=>{throw n})})},AN=(r,e,t)=>{let i=r7(r);if(e.recursive=!1,i===r)try{return e.mkdirSync(r,e)}catch(n){if(n.code!==\"EISDIR\")throw n;return}try{return e.mkdirSync(r,e),t||r}catch(n){if(n.code===\"ENOENT\")return AN(r,e,AN(i,e,t));if(n.code!==\"EEXIST\"&&n.code!==\"EROFS\")throw n;try{if(!e.statSync(r).isDirectory())throw n}catch{throw n}}};i7.exports={mkdirpManual:aN,mkdirpManualSync:AN}});var o7=w((iat,s7)=>{var{dirname:n7}=J(\"path\"),{findMade:VFe,findMadeSync:XFe}=t7(),{mkdirpManual:ZFe,mkdirpManualSync:_Fe}=lN(),$Fe=(r,e)=>(e.recursive=!0,n7(r)===r?e.mkdirAsync(r,e):VFe(e,r).then(i=>e.mkdirAsync(r,e).then(()=>i).catch(n=>{if(n.code===\"ENOENT\")return ZFe(r,e);throw n}))),eNe=(r,e)=>{if(e.recursive=!0,n7(r)===r)return e.mkdirSync(r,e);let i=XFe(e,r);try{return e.mkdirSync(r,e),i}catch(n){if(n.code===\"ENOENT\")return _Fe(r,e);throw n}};s7.exports={mkdirpNative:$Fe,mkdirpNativeSync:eNe}});var c7=w((nat,l7)=>{var a7=J(\"fs\"),tNe=process.env.__TESTING_MKDIRP_NODE_VERSION__||process.version,cN=tNe.replace(/^v/,\"\").split(\".\"),A7=+cN[0]>10||+cN[0]==10&&+cN[1]>=12,rNe=A7?r=>r.mkdir===a7.mkdir:()=>!1,iNe=A7?r=>r.mkdirSync===a7.mkdirSync:()=>!1;l7.exports={useNative:rNe,useNativeSync:iNe}});var d7=w((sat,p7)=>{var ph=zX(),dh=XX(),{mkdirpNative:u7,mkdirpNativeSync:g7}=o7(),{mkdirpManual:f7,mkdirpManualSync:h7}=lN(),{useNative:nNe,useNativeSync:sNe}=c7(),Ch=(r,e)=>(r=dh(r),e=ph(e),nNe(e)?u7(r,e):f7(r,e)),oNe=(r,e)=>(r=dh(r),e=ph(e),sNe(e)?g7(r,e):h7(r,e));Ch.sync=oNe;Ch.native=(r,e)=>u7(dh(r),ph(e));Ch.manual=(r,e)=>f7(dh(r),ph(e));Ch.nativeSync=(r,e)=>g7(dh(r),ph(e));Ch.manualSync=(r,e)=>h7(dh(r),ph(e));p7.exports=Ch});var B7=w((oat,w7)=>{\"use strict\";var Ds=J(\"fs\"),Xc=J(\"path\"),aNe=Ds.lchown?\"lchown\":\"chown\",ANe=Ds.lchownSync?\"lchownSync\":\"chownSync\",m7=Ds.lchown&&!process.version.match(/v1[1-9]+\\./)&&!process.version.match(/v10\\.[6-9]/),C7=(r,e,t)=>{try{return Ds[ANe](r,e,t)}catch(i){if(i.code!==\"ENOENT\")throw i}},lNe=(r,e,t)=>{try{return Ds.chownSync(r,e,t)}catch(i){if(i.code!==\"ENOENT\")throw i}},cNe=m7?(r,e,t,i)=>n=>{!n||n.code!==\"EISDIR\"?i(n):Ds.chown(r,e,t,i)}:(r,e,t,i)=>i,uN=m7?(r,e,t)=>{try{return C7(r,e,t)}catch(i){if(i.code!==\"EISDIR\")throw i;lNe(r,e,t)}}:(r,e,t)=>C7(r,e,t),uNe=process.version,E7=(r,e,t)=>Ds.readdir(r,e,t),gNe=(r,e)=>Ds.readdirSync(r,e);/^v4\\./.test(uNe)&&(E7=(r,e,t)=>Ds.readdir(r,t));var b0=(r,e,t,i)=>{Ds[aNe](r,e,t,cNe(r,e,t,n=>{i(n&&n.code!==\"ENOENT\"?n:null)}))},I7=(r,e,t,i,n)=>{if(typeof e==\"string\")return Ds.lstat(Xc.resolve(r,e),(s,o)=>{if(s)return n(s.code!==\"ENOENT\"?s:null);o.name=e,I7(r,o,t,i,n)});if(e.isDirectory())gN(Xc.resolve(r,e.name),t,i,s=>{if(s)return n(s);let o=Xc.resolve(r,e.name);b0(o,t,i,n)});else{let s=Xc.resolve(r,e.name);b0(s,t,i,n)}},gN=(r,e,t,i)=>{E7(r,{withFileTypes:!0},(n,s)=>{if(n){if(n.code===\"ENOENT\")return i();if(n.code!==\"ENOTDIR\"&&n.code!==\"ENOTSUP\")return i(n)}if(n||!s.length)return b0(r,e,t,i);let o=s.length,a=null,l=c=>{if(!a){if(c)return i(a=c);if(--o===0)return b0(r,e,t,i)}};s.forEach(c=>I7(r,c,e,t,l))})},fNe=(r,e,t,i)=>{if(typeof e==\"string\")try{let n=Ds.lstatSync(Xc.resolve(r,e));n.name=e,e=n}catch(n){if(n.code===\"ENOENT\")return;throw n}e.isDirectory()&&y7(Xc.resolve(r,e.name),t,i),uN(Xc.resolve(r,e.name),t,i)},y7=(r,e,t)=>{let i;try{i=gNe(r,{withFileTypes:!0})}catch(n){if(n.code===\"ENOENT\")return;if(n.code===\"ENOTDIR\"||n.code===\"ENOTSUP\")return uN(r,e,t);throw n}return i&&i.length&&i.forEach(n=>fNe(r,n,e,t)),uN(r,e,t)};w7.exports=gN;gN.sync=y7});var v7=w((aat,fN)=>{\"use strict\";var Q7=d7(),ks=J(\"fs\"),S0=J(\"path\"),b7=B7(),lo=th(),v0=class extends Error{constructor(e,t){super(\"Cannot extract through symbolic link\"),this.path=t,this.symlink=e}get name(){return\"SylinkError\"}},x0=class extends Error{constructor(e,t){super(t+\": Cannot cd into '\"+e+\"'\"),this.path=e,this.code=t}get name(){return\"CwdError\"}},P0=(r,e)=>r.get(lo(e)),jC=(r,e,t)=>r.set(lo(e),t),hNe=(r,e)=>{ks.stat(r,(t,i)=>{(t||!i.isDirectory())&&(t=new x0(r,t&&t.code||\"ENOTDIR\")),e(t)})};fN.exports=(r,e,t)=>{r=lo(r);let i=e.umask,n=e.mode|448,s=(n&i)!==0,o=e.uid,a=e.gid,l=typeof o==\"number\"&&typeof a==\"number\"&&(o!==e.processUid||a!==e.processGid),c=e.preserve,u=e.unlink,g=e.cache,f=lo(e.cwd),h=(y,B)=>{y?t(y):(jC(g,r,!0),B&&l?b7(B,o,a,v=>h(v)):s?ks.chmod(r,n,t):t())};if(g&&P0(g,r)===!0)return h();if(r===f)return hNe(r,h);if(c)return Q7(r,{mode:n}).then(y=>h(null,y),h);let C=lo(S0.relative(f,r)).split(\"/\");D0(f,C,n,g,u,f,null,h)};var D0=(r,e,t,i,n,s,o,a)=>{if(!e.length)return a(null,o);let l=e.shift(),c=lo(S0.resolve(r+\"/\"+l));if(P0(i,c))return D0(c,e,t,i,n,s,o,a);ks.mkdir(c,t,S7(c,e,t,i,n,s,o,a))},S7=(r,e,t,i,n,s,o,a)=>l=>{l?ks.lstat(r,(c,u)=>{if(c)c.path=c.path&&lo(c.path),a(c);else if(u.isDirectory())D0(r,e,t,i,n,s,o,a);else if(n)ks.unlink(r,g=>{if(g)return a(g);ks.mkdir(r,t,S7(r,e,t,i,n,s,o,a))});else{if(u.isSymbolicLink())return a(new v0(r,r+\"/\"+e.join(\"/\")));a(l)}}):(o=o||r,D0(r,e,t,i,n,s,o,a))},pNe=r=>{let e=!1,t=\"ENOTDIR\";try{e=ks.statSync(r).isDirectory()}catch(i){t=i.code}finally{if(!e)throw new x0(r,t)}};fN.exports.sync=(r,e)=>{r=lo(r);let t=e.umask,i=e.mode|448,n=(i&t)!==0,s=e.uid,o=e.gid,a=typeof s==\"number\"&&typeof o==\"number\"&&(s!==e.processUid||o!==e.processGid),l=e.preserve,c=e.unlink,u=e.cache,g=lo(e.cwd),f=y=>{jC(u,r,!0),y&&a&&b7.sync(y,s,o),n&&ks.chmodSync(r,i)};if(u&&P0(u,r)===!0)return f();if(r===g)return pNe(g),f();if(l)return f(Q7.sync(r,i));let p=lo(S0.relative(g,r)).split(\"/\"),C=null;for(let y=p.shift(),B=g;y&&(B+=\"/\"+y);y=p.shift())if(B=lo(S0.resolve(B)),!P0(u,B))try{ks.mkdirSync(B,i),C=C||B,jC(u,B,!0)}catch{let D=ks.lstatSync(B);if(D.isDirectory()){jC(u,B,!0);continue}else if(c){ks.unlinkSync(B),ks.mkdirSync(B,i),C=C||B,jC(u,B,!0);continue}else if(D.isSymbolicLink())return new v0(B,B+\"/\"+p.join(\"/\"))}return f(C)}});var pN=w((Aat,x7)=>{var hN=Object.create(null),{hasOwnProperty:dNe}=Object.prototype;x7.exports=r=>(dNe.call(hN,r)||(hN[r]=r.normalize(\"NFKD\")),hN[r])});var R7=w((lat,k7)=>{var P7=J(\"assert\"),CNe=pN(),mNe=nh(),{join:D7}=J(\"path\"),ENe=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform,INe=ENe===\"win32\";k7.exports=()=>{let r=new Map,e=new Map,t=c=>c.split(\"/\").slice(0,-1).reduce((g,f)=>(g.length&&(f=D7(g[g.length-1],f)),g.push(f||\"/\"),g),[]),i=new Set,n=c=>{let u=e.get(c);if(!u)throw new Error(\"function does not have any path reservations\");return{paths:u.paths.map(g=>r.get(g)),dirs:[...u.dirs].map(g=>r.get(g))}},s=c=>{let{paths:u,dirs:g}=n(c);return u.every(f=>f[0]===c)&&g.every(f=>f[0]instanceof Set&&f[0].has(c))},o=c=>i.has(c)||!s(c)?!1:(i.add(c),c(()=>a(c)),!0),a=c=>{if(!i.has(c))return!1;let{paths:u,dirs:g}=e.get(c),f=new Set;return u.forEach(h=>{let p=r.get(h);P7.equal(p[0],c),p.length===1?r.delete(h):(p.shift(),typeof p[0]==\"function\"?f.add(p[0]):p[0].forEach(C=>f.add(C)))}),g.forEach(h=>{let p=r.get(h);P7(p[0]instanceof Set),p[0].size===1&&p.length===1?r.delete(h):p[0].size===1?(p.shift(),f.add(p[0])):p[0].delete(c)}),i.delete(c),f.forEach(h=>o(h)),!0};return{check:s,reserve:(c,u)=>{c=INe?[\"win32 parallelization disabled\"]:c.map(f=>CNe(mNe(D7(f))).toLowerCase());let g=new Set(c.map(f=>t(f)).reduce((f,h)=>f.concat(h)));return e.set(u,{dirs:g,paths:c}),c.forEach(f=>{let h=r.get(f);h?h.push(u):r.set(f,[u])}),g.forEach(f=>{let h=r.get(f);h?h[h.length-1]instanceof Set?h[h.length-1].add(u):h.push(new Set([u])):r.set(f,[new Set([u])])}),o(u)}}}});var T7=w((cat,N7)=>{var yNe=process.env.__FAKE_PLATFORM__||process.platform,wNe=yNe===\"win32\",BNe=global.__FAKE_TESTING_FS__||J(\"fs\"),{O_CREAT:QNe,O_TRUNC:bNe,O_WRONLY:SNe,UV_FS_O_FILEMAP:F7=0}=BNe.constants,vNe=wNe&&!!F7,xNe=512*1024,PNe=F7|bNe|QNe|SNe;N7.exports=vNe?r=>r<xNe?PNe:\"w\":()=>\"w\"});var QN=w((uat,V7)=>{\"use strict\";var DNe=J(\"assert\"),kNe=w0(),jt=J(\"fs\"),RNe=fh(),rA=J(\"path\"),J7=v7(),L7=QF(),FNe=R7(),NNe=bF(),$n=th(),TNe=nh(),LNe=pN(),O7=Symbol(\"onEntry\"),mN=Symbol(\"checkFs\"),M7=Symbol(\"checkFs2\"),F0=Symbol(\"pruneCache\"),EN=Symbol(\"isReusable\"),Rs=Symbol(\"makeFs\"),IN=Symbol(\"file\"),yN=Symbol(\"directory\"),N0=Symbol(\"link\"),K7=Symbol(\"symlink\"),U7=Symbol(\"hardlink\"),H7=Symbol(\"unsupported\"),G7=Symbol(\"checkPath\"),fl=Symbol(\"mkdir\"),Yi=Symbol(\"onError\"),k0=Symbol(\"pending\"),Y7=Symbol(\"pend\"),mh=Symbol(\"unpend\"),dN=Symbol(\"ended\"),CN=Symbol(\"maybeClose\"),wN=Symbol(\"skip\"),qC=Symbol(\"doChown\"),JC=Symbol(\"uid\"),WC=Symbol(\"gid\"),zC=Symbol(\"checkedCwd\"),W7=J(\"crypto\"),z7=T7(),ONe=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform,VC=ONe===\"win32\",MNe=(r,e)=>{if(!VC)return jt.unlink(r,e);let t=r+\".DELETE.\"+W7.randomBytes(16).toString(\"hex\");jt.rename(r,t,i=>{if(i)return e(i);jt.unlink(t,e)})},KNe=r=>{if(!VC)return jt.unlinkSync(r);let e=r+\".DELETE.\"+W7.randomBytes(16).toString(\"hex\");jt.renameSync(r,e),jt.unlinkSync(e)},j7=(r,e,t)=>r===r>>>0?r:e===e>>>0?e:t,q7=r=>LNe(TNe($n(r))).toLowerCase(),UNe=(r,e)=>{e=q7(e);for(let t of r.keys()){let i=q7(t);(i===e||i.indexOf(e+\"/\")===0)&&r.delete(t)}},HNe=r=>{for(let e of r.keys())r.delete(e)},XC=class extends kNe{constructor(e){if(e||(e={}),e.ondone=t=>{this[dN]=!0,this[CN]()},super(e),this[zC]=!1,this.reservations=FNe(),this.transform=typeof e.transform==\"function\"?e.transform:null,this.writable=!0,this.readable=!1,this[k0]=0,this[dN]=!1,this.dirCache=e.dirCache||new Map,typeof e.uid==\"number\"||typeof e.gid==\"number\"){if(typeof e.uid!=\"number\"||typeof e.gid!=\"number\")throw new TypeError(\"cannot set owner without number uid and gid\");if(e.preserveOwner)throw new TypeError(\"cannot preserve owner in archive and also set owner explicitly\");this.uid=e.uid,this.gid=e.gid,this.setOwner=!0}else this.uid=null,this.gid=null,this.setOwner=!1;e.preserveOwner===void 0&&typeof e.uid!=\"number\"?this.preserveOwner=process.getuid&&process.getuid()===0:this.preserveOwner=!!e.preserveOwner,this.processUid=(this.preserveOwner||this.setOwner)&&process.getuid?process.getuid():null,this.processGid=(this.preserveOwner||this.setOwner)&&process.getgid?process.getgid():null,this.forceChown=e.forceChown===!0,this.win32=!!e.win32||VC,this.newer=!!e.newer,this.keep=!!e.keep,this.noMtime=!!e.noMtime,this.preservePaths=!!e.preservePaths,this.unlink=!!e.unlink,this.cwd=$n(rA.resolve(e.cwd||process.cwd())),this.strip=+e.strip||0,this.processUmask=e.noChmod?0:process.umask(),this.umask=typeof e.umask==\"number\"?e.umask:this.processUmask,this.dmode=e.dmode||511&~this.umask,this.fmode=e.fmode||438&~this.umask,this.on(\"entry\",t=>this[O7](t))}warn(e,t,i={}){return(e===\"TAR_BAD_ARCHIVE\"||e===\"TAR_ABORT\")&&(i.recoverable=!1),super.warn(e,t,i)}[CN](){this[dN]&&this[k0]===0&&(this.emit(\"prefinish\"),this.emit(\"finish\"),this.emit(\"end\"),this.emit(\"close\"))}[G7](e){if(this.strip){let t=$n(e.path).split(\"/\");if(t.length<this.strip)return!1;if(e.path=t.slice(this.strip).join(\"/\"),e.type===\"Link\"){let i=$n(e.linkpath).split(\"/\");if(i.length>=this.strip)e.linkpath=i.slice(this.strip).join(\"/\");else return!1}}if(!this.preservePaths){let t=$n(e.path),i=t.split(\"/\");if(i.includes(\"..\")||VC&&/^[a-z]:\\.\\.$/i.test(i[0]))return this.warn(\"TAR_ENTRY_ERROR\",\"path contains '..'\",{entry:e,path:t}),!1;let[n,s]=NNe(t);n&&(e.path=s,this.warn(\"TAR_ENTRY_INFO\",`stripping ${n} from absolute path`,{entry:e,path:t}))}if(rA.isAbsolute(e.path)?e.absolute=$n(rA.resolve(e.path)):e.absolute=$n(rA.resolve(this.cwd,e.path)),!this.preservePaths&&e.absolute.indexOf(this.cwd+\"/\")!==0&&e.absolute!==this.cwd)return this.warn(\"TAR_ENTRY_ERROR\",\"path escaped extraction target\",{entry:e,path:$n(e.path),resolvedPath:e.absolute,cwd:this.cwd}),!1;if(e.absolute===this.cwd&&e.type!==\"Directory\"&&e.type!==\"GNUDumpDir\")return!1;if(this.win32){let{root:t}=rA.win32.parse(e.absolute);e.absolute=t+L7.encode(e.absolute.substr(t.length));let{root:i}=rA.win32.parse(e.path);e.path=i+L7.encode(e.path.substr(i.length))}return!0}[O7](e){if(!this[G7](e))return e.resume();switch(DNe.equal(typeof e.absolute,\"string\"),e.type){case\"Directory\":case\"GNUDumpDir\":e.mode&&(e.mode=e.mode|448);case\"File\":case\"OldFile\":case\"ContiguousFile\":case\"Link\":case\"SymbolicLink\":return this[mN](e);case\"CharacterDevice\":case\"BlockDevice\":case\"FIFO\":default:return this[H7](e)}}[Yi](e,t){e.name===\"CwdError\"?this.emit(\"error\",e):(this.warn(\"TAR_ENTRY_ERROR\",e,{entry:t}),this[mh](),t.resume())}[fl](e,t,i){J7($n(e),{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cache:this.dirCache,cwd:this.cwd,mode:t,noChmod:this.noChmod},i)}[qC](e){return this.forceChown||this.preserveOwner&&(typeof e.uid==\"number\"&&e.uid!==this.processUid||typeof e.gid==\"number\"&&e.gid!==this.processGid)||typeof this.uid==\"number\"&&this.uid!==this.processUid||typeof this.gid==\"number\"&&this.gid!==this.processGid}[JC](e){return j7(this.uid,e.uid,this.processUid)}[WC](e){return j7(this.gid,e.gid,this.processGid)}[IN](e,t){let i=e.mode&4095||this.fmode,n=new RNe.WriteStream(e.absolute,{flags:z7(e.size),mode:i,autoClose:!1});n.on(\"error\",l=>{n.fd&&jt.close(n.fd,()=>{}),n.write=()=>!0,this[Yi](l,e),t()});let s=1,o=l=>{if(l){n.fd&&jt.close(n.fd,()=>{}),this[Yi](l,e),t();return}--s===0&&jt.close(n.fd,c=>{c?this[Yi](c,e):this[mh](),t()})};n.on(\"finish\",l=>{let c=e.absolute,u=n.fd;if(e.mtime&&!this.noMtime){s++;let g=e.atime||new Date,f=e.mtime;jt.futimes(u,g,f,h=>h?jt.utimes(c,g,f,p=>o(p&&h)):o())}if(this[qC](e)){s++;let g=this[JC](e),f=this[WC](e);jt.fchown(u,g,f,h=>h?jt.chown(c,g,f,p=>o(p&&h)):o())}o()});let a=this.transform&&this.transform(e)||e;a!==e&&(a.on(\"error\",l=>{this[Yi](l,e),t()}),e.pipe(a)),a.pipe(n)}[yN](e,t){let i=e.mode&4095||this.dmode;this[fl](e.absolute,i,n=>{if(n){this[Yi](n,e),t();return}let s=1,o=a=>{--s===0&&(t(),this[mh](),e.resume())};e.mtime&&!this.noMtime&&(s++,jt.utimes(e.absolute,e.atime||new Date,e.mtime,o)),this[qC](e)&&(s++,jt.chown(e.absolute,this[JC](e),this[WC](e),o)),o()})}[H7](e){e.unsupported=!0,this.warn(\"TAR_ENTRY_UNSUPPORTED\",`unsupported entry type: ${e.type}`,{entry:e}),e.resume()}[K7](e,t){this[N0](e,e.linkpath,\"symlink\",t)}[U7](e,t){let i=$n(rA.resolve(this.cwd,e.linkpath));this[N0](e,i,\"link\",t)}[Y7](){this[k0]++}[mh](){this[k0]--,this[CN]()}[wN](e){this[mh](),e.resume()}[EN](e,t){return e.type===\"File\"&&!this.unlink&&t.isFile()&&t.nlink<=1&&!VC}[mN](e){this[Y7]();let t=[e.path];e.linkpath&&t.push(e.linkpath),this.reservations.reserve(t,i=>this[M7](e,i))}[F0](e){e.type===\"SymbolicLink\"?HNe(this.dirCache):e.type!==\"Directory\"&&UNe(this.dirCache,e.absolute)}[M7](e,t){this[F0](e);let i=a=>{this[F0](e),t(a)},n=()=>{this[fl](this.cwd,this.dmode,a=>{if(a){this[Yi](a,e),i();return}this[zC]=!0,s()})},s=()=>{if(e.absolute!==this.cwd){let a=$n(rA.dirname(e.absolute));if(a!==this.cwd)return this[fl](a,this.dmode,l=>{if(l){this[Yi](l,e),i();return}o()})}o()},o=()=>{jt.lstat(e.absolute,(a,l)=>{if(l&&(this.keep||this.newer&&l.mtime>e.mtime)){this[wN](e),i();return}if(a||this[EN](e,l))return this[Rs](null,e,i);if(l.isDirectory()){if(e.type===\"Directory\"){let c=!this.noChmod&&e.mode&&(l.mode&4095)!==e.mode,u=g=>this[Rs](g,e,i);return c?jt.chmod(e.absolute,e.mode,u):u()}if(e.absolute!==this.cwd)return jt.rmdir(e.absolute,c=>this[Rs](c,e,i))}if(e.absolute===this.cwd)return this[Rs](null,e,i);MNe(e.absolute,c=>this[Rs](c,e,i))})};this[zC]?s():n()}[Rs](e,t,i){if(e){this[Yi](e,t),i();return}switch(t.type){case\"File\":case\"OldFile\":case\"ContiguousFile\":return this[IN](t,i);case\"Link\":return this[U7](t,i);case\"SymbolicLink\":return this[K7](t,i);case\"Directory\":case\"GNUDumpDir\":return this[yN](t,i)}}[N0](e,t,i,n){jt[i](t,e.absolute,s=>{s?this[Yi](s,e):(this[mh](),e.resume()),n()})}},R0=r=>{try{return[null,r()]}catch(e){return[e,null]}},BN=class extends XC{[Rs](e,t){return super[Rs](e,t,()=>{})}[mN](e){if(this[F0](e),!this[zC]){let s=this[fl](this.cwd,this.dmode);if(s)return this[Yi](s,e);this[zC]=!0}if(e.absolute!==this.cwd){let s=$n(rA.dirname(e.absolute));if(s!==this.cwd){let o=this[fl](s,this.dmode);if(o)return this[Yi](o,e)}}let[t,i]=R0(()=>jt.lstatSync(e.absolute));if(i&&(this.keep||this.newer&&i.mtime>e.mtime))return this[wN](e);if(t||this[EN](e,i))return this[Rs](null,e);if(i.isDirectory()){if(e.type===\"Directory\"){let o=!this.noChmod&&e.mode&&(i.mode&4095)!==e.mode,[a]=o?R0(()=>{jt.chmodSync(e.absolute,e.mode)}):[];return this[Rs](a,e)}let[s]=R0(()=>jt.rmdirSync(e.absolute));this[Rs](s,e)}let[n]=e.absolute===this.cwd?[]:R0(()=>KNe(e.absolute));this[Rs](n,e)}[IN](e,t){let i=e.mode&4095||this.fmode,n=a=>{let l;try{jt.closeSync(s)}catch(c){l=c}(a||l)&&this[Yi](a||l,e),t()},s;try{s=jt.openSync(e.absolute,z7(e.size),i)}catch(a){return n(a)}let o=this.transform&&this.transform(e)||e;o!==e&&(o.on(\"error\",a=>this[Yi](a,e)),e.pipe(o)),o.on(\"data\",a=>{try{jt.writeSync(s,a,0,a.length)}catch(l){n(l)}}),o.on(\"end\",a=>{let l=null;if(e.mtime&&!this.noMtime){let c=e.atime||new Date,u=e.mtime;try{jt.futimesSync(s,c,u)}catch(g){try{jt.utimesSync(e.absolute,c,u)}catch{l=g}}}if(this[qC](e)){let c=this[JC](e),u=this[WC](e);try{jt.fchownSync(s,c,u)}catch(g){try{jt.chownSync(e.absolute,c,u)}catch{l=l||g}}}n(l)})}[yN](e,t){let i=e.mode&4095||this.dmode,n=this[fl](e.absolute,i);if(n){this[Yi](n,e),t();return}if(e.mtime&&!this.noMtime)try{jt.utimesSync(e.absolute,e.atime||new Date,e.mtime)}catch{}if(this[qC](e))try{jt.chownSync(e.absolute,this[JC](e),this[WC](e))}catch{}t(),e.resume()}[fl](e,t){try{return J7.sync($n(e),{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cache:this.dirCache,cwd:this.cwd,mode:t})}catch(i){return i}}[N0](e,t,i,n){try{jt[i+\"Sync\"](t,e.absolute),n(),e.resume()}catch(s){return this[Yi](s,e)}}};XC.Sync=BN;V7.exports=XC});var eZ=w((gat,$7)=>{\"use strict\";var GNe=Xf(),T0=QN(),Z7=J(\"fs\"),_7=fh(),X7=J(\"path\"),bN=nh();$7.exports=(r,e,t)=>{typeof r==\"function\"?(t=r,e=null,r={}):Array.isArray(r)&&(e=r,r={}),typeof e==\"function\"&&(t=e,e=null),e?e=Array.from(e):e=[];let i=GNe(r);if(i.sync&&typeof t==\"function\")throw new TypeError(\"callback not supported for sync tar functions\");if(!i.file&&typeof t==\"function\")throw new TypeError(\"callback only supported with file option\");return e.length&&YNe(i,e),i.file&&i.sync?jNe(i):i.file?qNe(i,t):i.sync?JNe(i):WNe(i)};var YNe=(r,e)=>{let t=new Map(e.map(s=>[bN(s),!0])),i=r.filter,n=(s,o)=>{let a=o||X7.parse(s).root||\".\",l=s===a?!1:t.has(s)?t.get(s):n(X7.dirname(s),a);return t.set(s,l),l};r.filter=i?(s,o)=>i(s,o)&&n(bN(s)):s=>n(bN(s))},jNe=r=>{let e=new T0.Sync(r),t=r.file,i=Z7.statSync(t),n=r.maxReadSize||16*1024*1024;new _7.ReadStreamSync(t,{readSize:n,size:i.size}).pipe(e)},qNe=(r,e)=>{let t=new T0(r),i=r.maxReadSize||16*1024*1024,n=r.file,s=new Promise((o,a)=>{t.on(\"error\",a),t.on(\"close\",o),Z7.stat(n,(l,c)=>{if(l)a(l);else{let u=new _7.ReadStream(n,{readSize:i,size:c.size});u.on(\"error\",a),u.pipe(t)}})});return e?s.then(e,e):s},JNe=r=>new T0.Sync(r),WNe=r=>new T0(r)});var tZ=w(ci=>{\"use strict\";ci.c=ci.create=LX();ci.r=ci.replace=oN();ci.t=ci.list=B0();ci.u=ci.update=qX();ci.x=ci.extract=eZ();ci.Pack=A0();ci.Unpack=QN();ci.Parse=w0();ci.ReadEntry=qB();ci.WriteEntry=TF();ci.Header=ih();ci.Pax=WB();ci.types=CF()});var sZ=w((pat,nZ)=>{var SN;nZ.exports.getContent=()=>(typeof SN>\"u\"&&(SN=J(\"zlib\").brotliDecompressSync(Buffer.from(\"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\",\"base64\")).toString()),SN)});var uZ=w((vN,cZ)=>{(function(r,e){typeof vN==\"object\"?cZ.exports=e():typeof define==\"function\"&&define.amd?define(e):r.treeify=e()})(vN,function(){function r(n,s){var o=s?\"\\u2514\":\"\\u251C\";return n?o+=\"\\u2500 \":o+=\"\\u2500\\u2500\\u2510\",o}function e(n,s){var o=[];for(var a in n)!n.hasOwnProperty(a)||s&&typeof n[a]==\"function\"||o.push(a);return o}function t(n,s,o,a,l,c,u){var g=\"\",f=0,h,p,C=a.slice(0);if(C.push([s,o])&&a.length>0&&(a.forEach(function(B,v){v>0&&(g+=(B[1]?\" \":\"\\u2502\")+\"  \"),!p&&B[0]===s&&(p=!0)}),g+=r(n,o)+n,l&&(typeof s!=\"object\"||s instanceof Date)&&(g+=\": \"+s),p&&(g+=\" (circular ref.)\"),u(g)),!p&&typeof s==\"object\"){var y=e(s,c);y.forEach(function(B){h=++f===y.length,t(B,s[B],h,C,l,c,u)})}}var i={};return i.asLines=function(n,s,o,a){var l=typeof o!=\"function\"?o:!1;t(\".\",n,!1,[],s,l,a||o)},i.asTree=function(n,s,o){var a=\"\";return t(\".\",n,!1,[],s,o,function(l){a+=l+`\n`}),a},i})});var K0=w((Mat,yZ)=>{var uTe=vs(),gTe=gC(),fTe=/\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,hTe=/^\\w*$/;function pTe(r,e){if(uTe(r))return!1;var t=typeof r;return t==\"number\"||t==\"symbol\"||t==\"boolean\"||r==null||gTe(r)?!0:hTe.test(r)||!fTe.test(r)||e!=null&&r in Object(e)}yZ.exports=pTe});var U0=w((Kat,wZ)=>{var dTe=Fc(),CTe=vn(),mTe=\"[object AsyncFunction]\",ETe=\"[object Function]\",ITe=\"[object GeneratorFunction]\",yTe=\"[object Proxy]\";function wTe(r){if(!CTe(r))return!1;var e=dTe(r);return e==ETe||e==ITe||e==mTe||e==yTe}wZ.exports=wTe});var QZ=w((Uat,BZ)=>{var BTe=ys(),QTe=BTe[\"__core-js_shared__\"];BZ.exports=QTe});var vZ=w((Hat,SZ)=>{var TN=QZ(),bZ=function(){var r=/[^.]+$/.exec(TN&&TN.keys&&TN.keys.IE_PROTO||\"\");return r?\"Symbol(src)_1.\"+r:\"\"}();function bTe(r){return!!bZ&&bZ in r}SZ.exports=bTe});var LN=w((Gat,xZ)=>{var STe=Function.prototype,vTe=STe.toString;function xTe(r){if(r!=null){try{return vTe.call(r)}catch{}try{return r+\"\"}catch{}}return\"\"}xZ.exports=xTe});var DZ=w((Yat,PZ)=>{var PTe=U0(),DTe=vZ(),kTe=vn(),RTe=LN(),FTe=/[\\\\^$.*+?()[\\]{}|]/g,NTe=/^\\[object .+?Constructor\\]$/,TTe=Function.prototype,LTe=Object.prototype,OTe=TTe.toString,MTe=LTe.hasOwnProperty,KTe=RegExp(\"^\"+OTe.call(MTe).replace(FTe,\"\\\\$&\").replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g,\"$1.*?\")+\"$\");function UTe(r){if(!kTe(r)||DTe(r))return!1;var e=PTe(r)?KTe:NTe;return e.test(RTe(r))}PZ.exports=UTe});var RZ=w((jat,kZ)=>{function HTe(r,e){return r==null?void 0:r[e]}kZ.exports=HTe});var pl=w((qat,FZ)=>{var GTe=DZ(),YTe=RZ();function jTe(r,e){var t=YTe(r,e);return GTe(t)?t:void 0}FZ.exports=jTe});var _C=w((Jat,NZ)=>{var qTe=pl(),JTe=qTe(Object,\"create\");NZ.exports=JTe});var OZ=w((Wat,LZ)=>{var TZ=_C();function WTe(){this.__data__=TZ?TZ(null):{},this.size=0}LZ.exports=WTe});var KZ=w((zat,MZ)=>{function zTe(r){var e=this.has(r)&&delete this.__data__[r];return this.size-=e?1:0,e}MZ.exports=zTe});var HZ=w((Vat,UZ)=>{var VTe=_C(),XTe=\"__lodash_hash_undefined__\",ZTe=Object.prototype,_Te=ZTe.hasOwnProperty;function $Te(r){var e=this.__data__;if(VTe){var t=e[r];return t===XTe?void 0:t}return _Te.call(e,r)?e[r]:void 0}UZ.exports=$Te});var YZ=w((Xat,GZ)=>{var eLe=_C(),tLe=Object.prototype,rLe=tLe.hasOwnProperty;function iLe(r){var e=this.__data__;return eLe?e[r]!==void 0:rLe.call(e,r)}GZ.exports=iLe});var qZ=w((Zat,jZ)=>{var nLe=_C(),sLe=\"__lodash_hash_undefined__\";function oLe(r,e){var t=this.__data__;return this.size+=this.has(r)?0:1,t[r]=nLe&&e===void 0?sLe:e,this}jZ.exports=oLe});var WZ=w((_at,JZ)=>{var aLe=OZ(),ALe=KZ(),lLe=HZ(),cLe=YZ(),uLe=qZ();function Eh(r){var e=-1,t=r==null?0:r.length;for(this.clear();++e<t;){var i=r[e];this.set(i[0],i[1])}}Eh.prototype.clear=aLe;Eh.prototype.delete=ALe;Eh.prototype.get=lLe;Eh.prototype.has=cLe;Eh.prototype.set=uLe;JZ.exports=Eh});var VZ=w(($at,zZ)=>{function gLe(){this.__data__=[],this.size=0}zZ.exports=gLe});var Ih=w((eAt,XZ)=>{function fLe(r,e){return r===e||r!==r&&e!==e}XZ.exports=fLe});var $C=w((tAt,ZZ)=>{var hLe=Ih();function pLe(r,e){for(var t=r.length;t--;)if(hLe(r[t][0],e))return t;return-1}ZZ.exports=pLe});var $Z=w((rAt,_Z)=>{var dLe=$C(),CLe=Array.prototype,mLe=CLe.splice;function ELe(r){var e=this.__data__,t=dLe(e,r);if(t<0)return!1;var i=e.length-1;return t==i?e.pop():mLe.call(e,t,1),--this.size,!0}_Z.exports=ELe});var t_=w((iAt,e_)=>{var ILe=$C();function yLe(r){var e=this.__data__,t=ILe(e,r);return t<0?void 0:e[t][1]}e_.exports=yLe});var i_=w((nAt,r_)=>{var wLe=$C();function BLe(r){return wLe(this.__data__,r)>-1}r_.exports=BLe});var s_=w((sAt,n_)=>{var QLe=$C();function bLe(r,e){var t=this.__data__,i=QLe(t,r);return i<0?(++this.size,t.push([r,e])):t[i][1]=e,this}n_.exports=bLe});var em=w((oAt,o_)=>{var SLe=VZ(),vLe=$Z(),xLe=t_(),PLe=i_(),DLe=s_();function yh(r){var e=-1,t=r==null?0:r.length;for(this.clear();++e<t;){var i=r[e];this.set(i[0],i[1])}}yh.prototype.clear=SLe;yh.prototype.delete=vLe;yh.prototype.get=xLe;yh.prototype.has=PLe;yh.prototype.set=DLe;o_.exports=yh});var H0=w((aAt,a_)=>{var kLe=pl(),RLe=ys(),FLe=kLe(RLe,\"Map\");a_.exports=FLe});var c_=w((AAt,l_)=>{var A_=WZ(),NLe=em(),TLe=H0();function LLe(){this.size=0,this.__data__={hash:new A_,map:new(TLe||NLe),string:new A_}}l_.exports=LLe});var g_=w((lAt,u_)=>{function OLe(r){var e=typeof r;return e==\"string\"||e==\"number\"||e==\"symbol\"||e==\"boolean\"?r!==\"__proto__\":r===null}u_.exports=OLe});var tm=w((cAt,f_)=>{var MLe=g_();function KLe(r,e){var t=r.__data__;return MLe(e)?t[typeof e==\"string\"?\"string\":\"hash\"]:t.map}f_.exports=KLe});var p_=w((uAt,h_)=>{var ULe=tm();function HLe(r){var e=ULe(this,r).delete(r);return this.size-=e?1:0,e}h_.exports=HLe});var C_=w((gAt,d_)=>{var GLe=tm();function YLe(r){return GLe(this,r).get(r)}d_.exports=YLe});var E_=w((fAt,m_)=>{var jLe=tm();function qLe(r){return jLe(this,r).has(r)}m_.exports=qLe});var y_=w((hAt,I_)=>{var JLe=tm();function WLe(r,e){var t=JLe(this,r),i=t.size;return t.set(r,e),this.size+=t.size==i?0:1,this}I_.exports=WLe});var G0=w((pAt,w_)=>{var zLe=c_(),VLe=p_(),XLe=C_(),ZLe=E_(),_Le=y_();function wh(r){var e=-1,t=r==null?0:r.length;for(this.clear();++e<t;){var i=r[e];this.set(i[0],i[1])}}wh.prototype.clear=zLe;wh.prototype.delete=VLe;wh.prototype.get=XLe;wh.prototype.has=ZLe;wh.prototype.set=_Le;w_.exports=wh});var b_=w((dAt,Q_)=>{var B_=G0(),$Le=\"Expected a function\";function ON(r,e){if(typeof r!=\"function\"||e!=null&&typeof e!=\"function\")throw new TypeError($Le);var t=function(){var i=arguments,n=e?e.apply(this,i):i[0],s=t.cache;if(s.has(n))return s.get(n);var o=r.apply(this,i);return t.cache=s.set(n,o)||s,o};return t.cache=new(ON.Cache||B_),t}ON.Cache=B_;Q_.exports=ON});var v_=w((CAt,S_)=>{var eOe=b_(),tOe=500;function rOe(r){var e=eOe(r,function(i){return t.size===tOe&&t.clear(),i}),t=e.cache;return e}S_.exports=rOe});var P_=w((mAt,x_)=>{var iOe=v_(),nOe=/[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g,sOe=/\\\\(\\\\)?/g,oOe=iOe(function(r){var e=[];return r.charCodeAt(0)===46&&e.push(\"\"),r.replace(nOe,function(t,i,n,s){e.push(n?s.replace(sOe,\"$1\"):i||t)}),e});x_.exports=oOe});var Bh=w((EAt,D_)=>{var aOe=vs(),AOe=K0(),lOe=P_(),cOe=Vf();function uOe(r,e){return aOe(r)?r:AOe(r,e)?[r]:lOe(cOe(r))}D_.exports=uOe});var Zc=w((IAt,k_)=>{var gOe=gC(),fOe=1/0;function hOe(r){if(typeof r==\"string\"||gOe(r))return r;var e=r+\"\";return e==\"0\"&&1/r==-fOe?\"-0\":e}k_.exports=hOe});var rm=w((yAt,R_)=>{var pOe=Bh(),dOe=Zc();function COe(r,e){e=pOe(e,r);for(var t=0,i=e.length;r!=null&&t<i;)r=r[dOe(e[t++])];return t&&t==i?r:void 0}R_.exports=COe});var MN=w((wAt,F_)=>{var mOe=pl(),EOe=function(){try{var r=mOe(Object,\"defineProperty\");return r({},\"\",{}),r}catch{}}();F_.exports=EOe});var Qh=w((BAt,T_)=>{var N_=MN();function IOe(r,e,t){e==\"__proto__\"&&N_?N_(r,e,{configurable:!0,enumerable:!0,value:t,writable:!0}):r[e]=t}T_.exports=IOe});var Y0=w((QAt,L_)=>{var yOe=Qh(),wOe=Ih(),BOe=Object.prototype,QOe=BOe.hasOwnProperty;function bOe(r,e,t){var i=r[e];(!(QOe.call(r,e)&&wOe(i,t))||t===void 0&&!(e in r))&&yOe(r,e,t)}L_.exports=bOe});var im=w((bAt,O_)=>{var SOe=9007199254740991,vOe=/^(?:0|[1-9]\\d*)$/;function xOe(r,e){var t=typeof r;return e=e==null?SOe:e,!!e&&(t==\"number\"||t!=\"symbol\"&&vOe.test(r))&&r>-1&&r%1==0&&r<e}O_.exports=xOe});var KN=w((SAt,K_)=>{var POe=Y0(),DOe=Bh(),kOe=im(),M_=vn(),ROe=Zc();function FOe(r,e,t,i){if(!M_(r))return r;e=DOe(e,r);for(var n=-1,s=e.length,o=s-1,a=r;a!=null&&++n<s;){var l=ROe(e[n]),c=t;if(l===\"__proto__\"||l===\"constructor\"||l===\"prototype\")return r;if(n!=o){var u=a[l];c=i?i(u,l,a):void 0,c===void 0&&(c=M_(u)?u:kOe(e[n+1])?[]:{})}POe(a,l,c),a=a[l]}return r}K_.exports=FOe});var H_=w((vAt,U_)=>{var NOe=rm(),TOe=KN(),LOe=Bh();function OOe(r,e,t){for(var i=-1,n=e.length,s={};++i<n;){var o=e[i],a=NOe(r,o);t(a,o)&&TOe(s,LOe(o,r),a)}return s}U_.exports=OOe});var Y_=w((xAt,G_)=>{function MOe(r,e){return r!=null&&e in Object(r)}G_.exports=MOe});var q_=w((PAt,j_)=>{var KOe=Fc(),UOe=Jo(),HOe=\"[object Arguments]\";function GOe(r){return UOe(r)&&KOe(r)==HOe}j_.exports=GOe});var nm=w((DAt,z_)=>{var J_=q_(),YOe=Jo(),W_=Object.prototype,jOe=W_.hasOwnProperty,qOe=W_.propertyIsEnumerable,JOe=J_(function(){return arguments}())?J_:function(r){return YOe(r)&&jOe.call(r,\"callee\")&&!qOe.call(r,\"callee\")};z_.exports=JOe});var j0=w((kAt,V_)=>{var WOe=9007199254740991;function zOe(r){return typeof r==\"number\"&&r>-1&&r%1==0&&r<=WOe}V_.exports=zOe});var UN=w((RAt,X_)=>{var VOe=Bh(),XOe=nm(),ZOe=vs(),_Oe=im(),$Oe=j0(),eMe=Zc();function tMe(r,e,t){e=VOe(e,r);for(var i=-1,n=e.length,s=!1;++i<n;){var o=eMe(e[i]);if(!(s=r!=null&&t(r,o)))break;r=r[o]}return s||++i!=n?s:(n=r==null?0:r.length,!!n&&$Oe(n)&&_Oe(o,n)&&(ZOe(r)||XOe(r)))}X_.exports=tMe});var HN=w((FAt,Z_)=>{var rMe=Y_(),iMe=UN();function nMe(r,e){return r!=null&&iMe(r,e,rMe)}Z_.exports=nMe});var $_=w((NAt,__)=>{var sMe=H_(),oMe=HN();function aMe(r,e){return sMe(r,e,function(t,i){return oMe(r,i)})}__.exports=aMe});var q0=w((TAt,e$)=>{function AMe(r,e){for(var t=-1,i=e.length,n=r.length;++t<i;)r[n+t]=e[t];return r}e$.exports=AMe});var n$=w((LAt,i$)=>{var t$=Rc(),lMe=nm(),cMe=vs(),r$=t$?t$.isConcatSpreadable:void 0;function uMe(r){return cMe(r)||lMe(r)||!!(r$&&r&&r[r$])}i$.exports=uMe});var a$=w((OAt,o$)=>{var gMe=q0(),fMe=n$();function s$(r,e,t,i,n){var s=-1,o=r.length;for(t||(t=fMe),n||(n=[]);++s<o;){var a=r[s];e>0&&t(a)?e>1?s$(a,e-1,t,i,n):gMe(n,a):i||(n[n.length]=a)}return n}o$.exports=s$});var l$=w((MAt,A$)=>{var hMe=a$();function pMe(r){var e=r==null?0:r.length;return e?hMe(r,1):[]}A$.exports=pMe});var u$=w((KAt,c$)=>{function dMe(r,e,t){switch(t.length){case 0:return r.call(e);case 1:return r.call(e,t[0]);case 2:return r.call(e,t[0],t[1]);case 3:return r.call(e,t[0],t[1],t[2])}return r.apply(e,t)}c$.exports=dMe});var GN=w((UAt,f$)=>{var CMe=u$(),g$=Math.max;function mMe(r,e,t){return e=g$(e===void 0?r.length-1:e,0),function(){for(var i=arguments,n=-1,s=g$(i.length-e,0),o=Array(s);++n<s;)o[n]=i[e+n];n=-1;for(var a=Array(e+1);++n<e;)a[n]=i[n];return a[e]=t(o),CMe(r,this,a)}}f$.exports=mMe});var p$=w((HAt,h$)=>{function EMe(r){return function(){return r}}h$.exports=EMe});var J0=w((GAt,d$)=>{function IMe(r){return r}d$.exports=IMe});var E$=w((YAt,m$)=>{var yMe=p$(),C$=MN(),wMe=J0(),BMe=C$?function(r,e){return C$(r,\"toString\",{configurable:!0,enumerable:!1,value:yMe(e),writable:!0})}:wMe;m$.exports=BMe});var y$=w((jAt,I$)=>{var QMe=800,bMe=16,SMe=Date.now;function vMe(r){var e=0,t=0;return function(){var i=SMe(),n=bMe-(i-t);if(t=i,n>0){if(++e>=QMe)return arguments[0]}else e=0;return r.apply(void 0,arguments)}}I$.exports=vMe});var YN=w((qAt,w$)=>{var xMe=E$(),PMe=y$(),DMe=PMe(xMe);w$.exports=DMe});var Q$=w((JAt,B$)=>{var kMe=l$(),RMe=GN(),FMe=YN();function NMe(r){return FMe(RMe(r,void 0,kMe),r+\"\")}B$.exports=NMe});var S$=w((WAt,b$)=>{var TMe=$_(),LMe=Q$(),OMe=LMe(function(r,e){return r==null?{}:TMe(r,e)});b$.exports=OMe});var O$=w((dct,L$)=>{\"use strict\";var XN;try{XN=Map}catch{}var ZN;try{ZN=Set}catch{}function N$(r,e,t){if(!r||typeof r!=\"object\"||typeof r==\"function\")return r;if(r.nodeType&&\"cloneNode\"in r)return r.cloneNode(!0);if(r instanceof Date)return new Date(r.getTime());if(r instanceof RegExp)return new RegExp(r);if(Array.isArray(r))return r.map(T$);if(XN&&r instanceof XN)return new Map(Array.from(r.entries()));if(ZN&&r instanceof ZN)return new Set(Array.from(r.values()));if(r instanceof Object){e.push(r);var i=Object.create(r);t.push(i);for(var n in r){var s=e.findIndex(function(o){return o===r[n]});i[n]=s>-1?t[s]:N$(r[n],e,t)}return i}return r}function T$(r){return N$(r,[],[])}L$.exports=T$});var om=w(_N=>{\"use strict\";Object.defineProperty(_N,\"__esModule\",{value:!0});_N.default=_Me;var JMe=Object.prototype.toString,WMe=Error.prototype.toString,zMe=RegExp.prototype.toString,VMe=typeof Symbol<\"u\"?Symbol.prototype.toString:()=>\"\",XMe=/^Symbol\\((.*)\\)(.*)$/;function ZMe(r){return r!=+r?\"NaN\":r===0&&1/r<0?\"-0\":\"\"+r}function M$(r,e=!1){if(r==null||r===!0||r===!1)return\"\"+r;let t=typeof r;if(t===\"number\")return ZMe(r);if(t===\"string\")return e?`\"${r}\"`:r;if(t===\"function\")return\"[Function \"+(r.name||\"anonymous\")+\"]\";if(t===\"symbol\")return VMe.call(r).replace(XMe,\"Symbol($1)\");let i=JMe.call(r).slice(8,-1);return i===\"Date\"?isNaN(r.getTime())?\"\"+r:r.toISOString(r):i===\"Error\"||r instanceof Error?\"[\"+WMe.call(r)+\"]\":i===\"RegExp\"?zMe.call(r):null}function _Me(r,e){let t=M$(r,e);return t!==null?t:JSON.stringify(r,function(i,n){let s=M$(this[i],e);return s!==null?s:n},2)}});var nA=w(Ei=>{\"use strict\";Object.defineProperty(Ei,\"__esModule\",{value:!0});Ei.default=Ei.array=Ei.object=Ei.boolean=Ei.date=Ei.number=Ei.string=Ei.mixed=void 0;var K$=$Me(om());function $Me(r){return r&&r.__esModule?r:{default:r}}var U$={default:\"${path} is invalid\",required:\"${path} is a required field\",oneOf:\"${path} must be one of the following values: ${values}\",notOneOf:\"${path} must not be one of the following values: ${values}\",notType:({path:r,type:e,value:t,originalValue:i})=>{let n=i!=null&&i!==t,s=`${r} must be a \\`${e}\\` type, but the final value was: \\`${(0,K$.default)(t,!0)}\\``+(n?` (cast from the value \\`${(0,K$.default)(i,!0)}\\`).`:\".\");return t===null&&(s+='\\n If \"null\" is intended as an empty value be sure to mark the schema as `.nullable()`'),s},defined:\"${path} must be defined\"};Ei.mixed=U$;var H$={length:\"${path} must be exactly ${length} characters\",min:\"${path} must be at least ${min} characters\",max:\"${path} must be at most ${max} characters\",matches:'${path} must match the following: \"${regex}\"',email:\"${path} must be a valid email\",url:\"${path} must be a valid URL\",uuid:\"${path} must be a valid UUID\",trim:\"${path} must be a trimmed string\",lowercase:\"${path} must be a lowercase string\",uppercase:\"${path} must be a upper case string\"};Ei.string=H$;var G$={min:\"${path} must be greater than or equal to ${min}\",max:\"${path} must be less than or equal to ${max}\",lessThan:\"${path} must be less than ${less}\",moreThan:\"${path} must be greater than ${more}\",positive:\"${path} must be a positive number\",negative:\"${path} must be a negative number\",integer:\"${path} must be an integer\"};Ei.number=G$;var Y$={min:\"${path} field must be later than ${min}\",max:\"${path} field must be at earlier than ${max}\"};Ei.date=Y$;var j$={isValue:\"${path} field must be ${value}\"};Ei.boolean=j$;var q$={noUnknown:\"${path} field has unspecified keys: ${unknown}\"};Ei.object=q$;var J$={min:\"${path} field must have at least ${min} items\",max:\"${path} field must have less than or equal to ${max} items\",length:\"${path} must be have ${length} items\"};Ei.array=J$;var e1e=Object.assign(Object.create(null),{mixed:U$,string:H$,number:G$,date:Y$,object:q$,array:J$,boolean:j$});Ei.default=e1e});var z$=w((Ect,W$)=>{var t1e=Object.prototype,r1e=t1e.hasOwnProperty;function i1e(r,e){return r!=null&&r1e.call(r,e)}W$.exports=i1e});var am=w((Ict,V$)=>{var n1e=z$(),s1e=UN();function o1e(r,e){return r!=null&&s1e(r,e,n1e)}V$.exports=o1e});var xh=w(eQ=>{\"use strict\";Object.defineProperty(eQ,\"__esModule\",{value:!0});eQ.default=void 0;var a1e=r=>r&&r.__isYupSchema__;eQ.default=a1e});var Z$=w(tQ=>{\"use strict\";Object.defineProperty(tQ,\"__esModule\",{value:!0});tQ.default=void 0;var A1e=X$(am()),l1e=X$(xh());function X$(r){return r&&r.__esModule?r:{default:r}}var $N=class{constructor(e,t){if(this.refs=e,this.refs=e,typeof t==\"function\"){this.fn=t;return}if(!(0,A1e.default)(t,\"is\"))throw new TypeError(\"`is:` is required for `when()` conditions\");if(!t.then&&!t.otherwise)throw new TypeError(\"either `then:` or `otherwise:` is required for `when()` conditions\");let{is:i,then:n,otherwise:s}=t,o=typeof i==\"function\"?i:(...a)=>a.every(l=>l===i);this.fn=function(...a){let l=a.pop(),c=a.pop(),u=o(...a)?n:s;if(!!u)return typeof u==\"function\"?u(c):c.concat(u.resolve(l))}}resolve(e,t){let i=this.refs.map(s=>s.getValue(t==null?void 0:t.value,t==null?void 0:t.parent,t==null?void 0:t.context)),n=this.fn.apply(e,i.concat(e,t));if(n===void 0||n===e)return e;if(!(0,l1e.default)(n))throw new TypeError(\"conditions must return a schema object\");return n.resolve(t)}},c1e=$N;tQ.default=c1e});var tT=w(eT=>{\"use strict\";Object.defineProperty(eT,\"__esModule\",{value:!0});eT.default=u1e;function u1e(r){return r==null?[]:[].concat(r)}});var _c=w(rQ=>{\"use strict\";Object.defineProperty(rQ,\"__esModule\",{value:!0});rQ.default=void 0;var g1e=_$(om()),f1e=_$(tT());function _$(r){return r&&r.__esModule?r:{default:r}}function rT(){return rT=Object.assign||function(r){for(var e=1;e<arguments.length;e++){var t=arguments[e];for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(r[i]=t[i])}return r},rT.apply(this,arguments)}var h1e=/\\$\\{\\s*(\\w+)\\s*\\}/g,Ph=class extends Error{static formatError(e,t){let i=t.label||t.path||\"this\";return i!==t.path&&(t=rT({},t,{path:i})),typeof e==\"string\"?e.replace(h1e,(n,s)=>(0,g1e.default)(t[s])):typeof e==\"function\"?e(t):e}static isError(e){return e&&e.name===\"ValidationError\"}constructor(e,t,i,n){super(),this.name=\"ValidationError\",this.value=t,this.path=i,this.type=n,this.errors=[],this.inner=[],(0,f1e.default)(e).forEach(s=>{Ph.isError(s)?(this.errors.push(...s.errors),this.inner=this.inner.concat(s.inner.length?s.inner:s)):this.errors.push(s)}),this.message=this.errors.length>1?`${this.errors.length} errors occurred`:this.errors[0],Error.captureStackTrace&&Error.captureStackTrace(this,Ph)}};rQ.default=Ph});var iQ=w(nT=>{\"use strict\";Object.defineProperty(nT,\"__esModule\",{value:!0});nT.default=C1e;var iT=p1e(_c());function p1e(r){return r&&r.__esModule?r:{default:r}}var d1e=r=>{let e=!1;return(...t)=>{e||(e=!0,r(...t))}};function C1e(r,e){let{endEarly:t,tests:i,args:n,value:s,errors:o,sort:a,path:l}=r,c=d1e(e),u=i.length,g=[];if(o=o||[],!u)return o.length?c(new iT.default(o,s,l)):c(null,s);for(let f=0;f<i.length;f++){let h=i[f];h(n,function(C){if(C){if(!iT.default.isError(C))return c(C,s);if(t)return C.value=s,c(C,s);g.push(C)}if(--u<=0){if(g.length&&(a&&g.sort(a),o.length&&g.push(...o),o=g),o.length){c(new iT.default(o,s,l),s);return}c(null,s)}})}}});var eee=w((Sct,$$)=>{function m1e(r){return function(e,t,i){for(var n=-1,s=Object(e),o=i(e),a=o.length;a--;){var l=o[r?a:++n];if(t(s[l],l,s)===!1)break}return e}}$$.exports=m1e});var sT=w((vct,tee)=>{var E1e=eee(),I1e=E1e();tee.exports=I1e});var iee=w((xct,ree)=>{function y1e(r,e){for(var t=-1,i=Array(r);++t<r;)i[t]=e(t);return i}ree.exports=y1e});var see=w((Pct,nee)=>{function w1e(){return!1}nee.exports=w1e});var lm=w((Am,Dh)=>{var B1e=ys(),Q1e=see(),Aee=typeof Am==\"object\"&&Am&&!Am.nodeType&&Am,oee=Aee&&typeof Dh==\"object\"&&Dh&&!Dh.nodeType&&Dh,b1e=oee&&oee.exports===Aee,aee=b1e?B1e.Buffer:void 0,S1e=aee?aee.isBuffer:void 0,v1e=S1e||Q1e;Dh.exports=v1e});var cee=w((Dct,lee)=>{var x1e=Fc(),P1e=j0(),D1e=Jo(),k1e=\"[object Arguments]\",R1e=\"[object Array]\",F1e=\"[object Boolean]\",N1e=\"[object Date]\",T1e=\"[object Error]\",L1e=\"[object Function]\",O1e=\"[object Map]\",M1e=\"[object Number]\",K1e=\"[object Object]\",U1e=\"[object RegExp]\",H1e=\"[object Set]\",G1e=\"[object String]\",Y1e=\"[object WeakMap]\",j1e=\"[object ArrayBuffer]\",q1e=\"[object DataView]\",J1e=\"[object Float32Array]\",W1e=\"[object Float64Array]\",z1e=\"[object Int8Array]\",V1e=\"[object Int16Array]\",X1e=\"[object Int32Array]\",Z1e=\"[object Uint8Array]\",_1e=\"[object Uint8ClampedArray]\",$1e=\"[object Uint16Array]\",eKe=\"[object Uint32Array]\",Ir={};Ir[J1e]=Ir[W1e]=Ir[z1e]=Ir[V1e]=Ir[X1e]=Ir[Z1e]=Ir[_1e]=Ir[$1e]=Ir[eKe]=!0;Ir[k1e]=Ir[R1e]=Ir[j1e]=Ir[F1e]=Ir[q1e]=Ir[N1e]=Ir[T1e]=Ir[L1e]=Ir[O1e]=Ir[M1e]=Ir[K1e]=Ir[U1e]=Ir[H1e]=Ir[G1e]=Ir[Y1e]=!1;function tKe(r){return D1e(r)&&P1e(r.length)&&!!Ir[x1e(r)]}lee.exports=tKe});var nQ=w((kct,uee)=>{function rKe(r){return function(e){return r(e)}}uee.exports=rKe});var sQ=w((cm,kh)=>{var iKe=WD(),gee=typeof cm==\"object\"&&cm&&!cm.nodeType&&cm,um=gee&&typeof kh==\"object\"&&kh&&!kh.nodeType&&kh,nKe=um&&um.exports===gee,oT=nKe&&iKe.process,sKe=function(){try{var r=um&&um.require&&um.require(\"util\").types;return r||oT&&oT.binding&&oT.binding(\"util\")}catch{}}();kh.exports=sKe});var oQ=w((Rct,pee)=>{var oKe=cee(),aKe=nQ(),fee=sQ(),hee=fee&&fee.isTypedArray,AKe=hee?aKe(hee):oKe;pee.exports=AKe});var aT=w((Fct,dee)=>{var lKe=iee(),cKe=nm(),uKe=vs(),gKe=lm(),fKe=im(),hKe=oQ(),pKe=Object.prototype,dKe=pKe.hasOwnProperty;function CKe(r,e){var t=uKe(r),i=!t&&cKe(r),n=!t&&!i&&gKe(r),s=!t&&!i&&!n&&hKe(r),o=t||i||n||s,a=o?lKe(r.length,String):[],l=a.length;for(var c in r)(e||dKe.call(r,c))&&!(o&&(c==\"length\"||n&&(c==\"offset\"||c==\"parent\")||s&&(c==\"buffer\"||c==\"byteLength\"||c==\"byteOffset\")||fKe(c,l)))&&a.push(c);return a}dee.exports=CKe});var aQ=w((Nct,Cee)=>{var mKe=Object.prototype;function EKe(r){var e=r&&r.constructor,t=typeof e==\"function\"&&e.prototype||mKe;return r===t}Cee.exports=EKe});var AT=w((Tct,mee)=>{function IKe(r,e){return function(t){return r(e(t))}}mee.exports=IKe});var Iee=w((Lct,Eee)=>{var yKe=AT(),wKe=yKe(Object.keys,Object);Eee.exports=wKe});var wee=w((Oct,yee)=>{var BKe=aQ(),QKe=Iee(),bKe=Object.prototype,SKe=bKe.hasOwnProperty;function vKe(r){if(!BKe(r))return QKe(r);var e=[];for(var t in Object(r))SKe.call(r,t)&&t!=\"constructor\"&&e.push(t);return e}yee.exports=vKe});var gm=w((Mct,Bee)=>{var xKe=U0(),PKe=j0();function DKe(r){return r!=null&&PKe(r.length)&&!xKe(r)}Bee.exports=DKe});var Rh=w((Kct,Qee)=>{var kKe=aT(),RKe=wee(),FKe=gm();function NKe(r){return FKe(r)?kKe(r):RKe(r)}Qee.exports=NKe});var lT=w((Uct,bee)=>{var TKe=sT(),LKe=Rh();function OKe(r,e){return r&&TKe(r,e,LKe)}bee.exports=OKe});var vee=w((Hct,See)=>{var MKe=em();function KKe(){this.__data__=new MKe,this.size=0}See.exports=KKe});var Pee=w((Gct,xee)=>{function UKe(r){var e=this.__data__,t=e.delete(r);return this.size=e.size,t}xee.exports=UKe});var kee=w((Yct,Dee)=>{function HKe(r){return this.__data__.get(r)}Dee.exports=HKe});var Fee=w((jct,Ree)=>{function GKe(r){return this.__data__.has(r)}Ree.exports=GKe});var Tee=w((qct,Nee)=>{var YKe=em(),jKe=H0(),qKe=G0(),JKe=200;function WKe(r,e){var t=this.__data__;if(t instanceof YKe){var i=t.__data__;if(!jKe||i.length<JKe-1)return i.push([r,e]),this.size=++t.size,this;t=this.__data__=new qKe(i)}return t.set(r,e),this.size=t.size,this}Nee.exports=WKe});var fm=w((Jct,Lee)=>{var zKe=em(),VKe=vee(),XKe=Pee(),ZKe=kee(),_Ke=Fee(),$Ke=Tee();function Fh(r){var e=this.__data__=new zKe(r);this.size=e.size}Fh.prototype.clear=VKe;Fh.prototype.delete=XKe;Fh.prototype.get=ZKe;Fh.prototype.has=_Ke;Fh.prototype.set=$Ke;Lee.exports=Fh});var Mee=w((Wct,Oee)=>{var eUe=\"__lodash_hash_undefined__\";function tUe(r){return this.__data__.set(r,eUe),this}Oee.exports=tUe});var Uee=w((zct,Kee)=>{function rUe(r){return this.__data__.has(r)}Kee.exports=rUe});var Gee=w((Vct,Hee)=>{var iUe=G0(),nUe=Mee(),sUe=Uee();function AQ(r){var e=-1,t=r==null?0:r.length;for(this.__data__=new iUe;++e<t;)this.add(r[e])}AQ.prototype.add=AQ.prototype.push=nUe;AQ.prototype.has=sUe;Hee.exports=AQ});var jee=w((Xct,Yee)=>{function oUe(r,e){for(var t=-1,i=r==null?0:r.length;++t<i;)if(e(r[t],t,r))return!0;return!1}Yee.exports=oUe});var Jee=w((Zct,qee)=>{function aUe(r,e){return r.has(e)}qee.exports=aUe});var cT=w((_ct,Wee)=>{var AUe=Gee(),lUe=jee(),cUe=Jee(),uUe=1,gUe=2;function fUe(r,e,t,i,n,s){var o=t&uUe,a=r.length,l=e.length;if(a!=l&&!(o&&l>a))return!1;var c=s.get(r),u=s.get(e);if(c&&u)return c==e&&u==r;var g=-1,f=!0,h=t&gUe?new AUe:void 0;for(s.set(r,e),s.set(e,r);++g<a;){var p=r[g],C=e[g];if(i)var y=o?i(C,p,g,e,r,s):i(p,C,g,r,e,s);if(y!==void 0){if(y)continue;f=!1;break}if(h){if(!lUe(e,function(B,v){if(!cUe(h,v)&&(p===B||n(p,B,t,i,s)))return h.push(v)})){f=!1;break}}else if(!(p===C||n(p,C,t,i,s))){f=!1;break}}return s.delete(r),s.delete(e),f}Wee.exports=fUe});var uT=w(($ct,zee)=>{var hUe=ys(),pUe=hUe.Uint8Array;zee.exports=pUe});var Xee=w((eut,Vee)=>{function dUe(r){var e=-1,t=Array(r.size);return r.forEach(function(i,n){t[++e]=[n,i]}),t}Vee.exports=dUe});var _ee=w((tut,Zee)=>{function CUe(r){var e=-1,t=Array(r.size);return r.forEach(function(i){t[++e]=i}),t}Zee.exports=CUe});var ite=w((rut,rte)=>{var $ee=Rc(),ete=uT(),mUe=Ih(),EUe=cT(),IUe=Xee(),yUe=_ee(),wUe=1,BUe=2,QUe=\"[object Boolean]\",bUe=\"[object Date]\",SUe=\"[object Error]\",vUe=\"[object Map]\",xUe=\"[object Number]\",PUe=\"[object RegExp]\",DUe=\"[object Set]\",kUe=\"[object String]\",RUe=\"[object Symbol]\",FUe=\"[object ArrayBuffer]\",NUe=\"[object DataView]\",tte=$ee?$ee.prototype:void 0,gT=tte?tte.valueOf:void 0;function TUe(r,e,t,i,n,s,o){switch(t){case NUe:if(r.byteLength!=e.byteLength||r.byteOffset!=e.byteOffset)return!1;r=r.buffer,e=e.buffer;case FUe:return!(r.byteLength!=e.byteLength||!s(new ete(r),new ete(e)));case QUe:case bUe:case xUe:return mUe(+r,+e);case SUe:return r.name==e.name&&r.message==e.message;case PUe:case kUe:return r==e+\"\";case vUe:var a=IUe;case DUe:var l=i&wUe;if(a||(a=yUe),r.size!=e.size&&!l)return!1;var c=o.get(r);if(c)return c==e;i|=BUe,o.set(r,e);var u=EUe(a(r),a(e),i,n,s,o);return o.delete(r),u;case RUe:if(gT)return gT.call(r)==gT.call(e)}return!1}rte.exports=TUe});var fT=w((iut,nte)=>{var LUe=q0(),OUe=vs();function MUe(r,e,t){var i=e(r);return OUe(r)?i:LUe(i,t(r))}nte.exports=MUe});var ote=w((nut,ste)=>{function KUe(r,e){for(var t=-1,i=r==null?0:r.length,n=0,s=[];++t<i;){var o=r[t];e(o,t,r)&&(s[n++]=o)}return s}ste.exports=KUe});var hT=w((sut,ate)=>{function UUe(){return[]}ate.exports=UUe});var lQ=w((out,lte)=>{var HUe=ote(),GUe=hT(),YUe=Object.prototype,jUe=YUe.propertyIsEnumerable,Ate=Object.getOwnPropertySymbols,qUe=Ate?function(r){return r==null?[]:(r=Object(r),HUe(Ate(r),function(e){return jUe.call(r,e)}))}:GUe;lte.exports=qUe});var pT=w((aut,cte)=>{var JUe=fT(),WUe=lQ(),zUe=Rh();function VUe(r){return JUe(r,zUe,WUe)}cte.exports=VUe});var fte=w((Aut,gte)=>{var ute=pT(),XUe=1,ZUe=Object.prototype,_Ue=ZUe.hasOwnProperty;function $Ue(r,e,t,i,n,s){var o=t&XUe,a=ute(r),l=a.length,c=ute(e),u=c.length;if(l!=u&&!o)return!1;for(var g=l;g--;){var f=a[g];if(!(o?f in e:_Ue.call(e,f)))return!1}var h=s.get(r),p=s.get(e);if(h&&p)return h==e&&p==r;var C=!0;s.set(r,e),s.set(e,r);for(var y=o;++g<l;){f=a[g];var B=r[f],v=e[f];if(i)var D=o?i(v,B,f,e,r,s):i(B,v,f,r,e,s);if(!(D===void 0?B===v||n(B,v,t,i,s):D)){C=!1;break}y||(y=f==\"constructor\")}if(C&&!y){var T=r.constructor,H=e.constructor;T!=H&&\"constructor\"in r&&\"constructor\"in e&&!(typeof T==\"function\"&&T instanceof T&&typeof H==\"function\"&&H instanceof H)&&(C=!1)}return s.delete(r),s.delete(e),C}gte.exports=$Ue});var pte=w((lut,hte)=>{var e2e=pl(),t2e=ys(),r2e=e2e(t2e,\"DataView\");hte.exports=r2e});var Cte=w((cut,dte)=>{var i2e=pl(),n2e=ys(),s2e=i2e(n2e,\"Promise\");dte.exports=s2e});var Ete=w((uut,mte)=>{var o2e=pl(),a2e=ys(),A2e=o2e(a2e,\"Set\");mte.exports=A2e});var yte=w((gut,Ite)=>{var l2e=pl(),c2e=ys(),u2e=l2e(c2e,\"WeakMap\");Ite.exports=u2e});var hm=w((fut,xte)=>{var dT=pte(),CT=H0(),mT=Cte(),ET=Ete(),IT=yte(),vte=Fc(),Nh=LN(),wte=\"[object Map]\",g2e=\"[object Object]\",Bte=\"[object Promise]\",Qte=\"[object Set]\",bte=\"[object WeakMap]\",Ste=\"[object DataView]\",f2e=Nh(dT),h2e=Nh(CT),p2e=Nh(mT),d2e=Nh(ET),C2e=Nh(IT),$c=vte;(dT&&$c(new dT(new ArrayBuffer(1)))!=Ste||CT&&$c(new CT)!=wte||mT&&$c(mT.resolve())!=Bte||ET&&$c(new ET)!=Qte||IT&&$c(new IT)!=bte)&&($c=function(r){var e=vte(r),t=e==g2e?r.constructor:void 0,i=t?Nh(t):\"\";if(i)switch(i){case f2e:return Ste;case h2e:return wte;case p2e:return Bte;case d2e:return Qte;case C2e:return bte}return e});xte.exports=$c});var Lte=w((hut,Tte)=>{var yT=fm(),m2e=cT(),E2e=ite(),I2e=fte(),Pte=hm(),Dte=vs(),kte=lm(),y2e=oQ(),w2e=1,Rte=\"[object Arguments]\",Fte=\"[object Array]\",cQ=\"[object Object]\",B2e=Object.prototype,Nte=B2e.hasOwnProperty;function Q2e(r,e,t,i,n,s){var o=Dte(r),a=Dte(e),l=o?Fte:Pte(r),c=a?Fte:Pte(e);l=l==Rte?cQ:l,c=c==Rte?cQ:c;var u=l==cQ,g=c==cQ,f=l==c;if(f&&kte(r)){if(!kte(e))return!1;o=!0,u=!1}if(f&&!u)return s||(s=new yT),o||y2e(r)?m2e(r,e,t,i,n,s):E2e(r,e,l,t,i,n,s);if(!(t&w2e)){var h=u&&Nte.call(r,\"__wrapped__\"),p=g&&Nte.call(e,\"__wrapped__\");if(h||p){var C=h?r.value():r,y=p?e.value():e;return s||(s=new yT),n(C,y,t,i,s)}}return f?(s||(s=new yT),I2e(r,e,t,i,n,s)):!1}Tte.exports=Q2e});var wT=w((put,Kte)=>{var b2e=Lte(),Ote=Jo();function Mte(r,e,t,i,n){return r===e?!0:r==null||e==null||!Ote(r)&&!Ote(e)?r!==r&&e!==e:b2e(r,e,t,i,Mte,n)}Kte.exports=Mte});var Hte=w((dut,Ute)=>{var S2e=fm(),v2e=wT(),x2e=1,P2e=2;function D2e(r,e,t,i){var n=t.length,s=n,o=!i;if(r==null)return!s;for(r=Object(r);n--;){var a=t[n];if(o&&a[2]?a[1]!==r[a[0]]:!(a[0]in r))return!1}for(;++n<s;){a=t[n];var l=a[0],c=r[l],u=a[1];if(o&&a[2]){if(c===void 0&&!(l in r))return!1}else{var g=new S2e;if(i)var f=i(c,u,l,r,e,g);if(!(f===void 0?v2e(u,c,x2e|P2e,i,g):f))return!1}}return!0}Ute.exports=D2e});var BT=w((Cut,Gte)=>{var k2e=vn();function R2e(r){return r===r&&!k2e(r)}Gte.exports=R2e});var jte=w((mut,Yte)=>{var F2e=BT(),N2e=Rh();function T2e(r){for(var e=N2e(r),t=e.length;t--;){var i=e[t],n=r[i];e[t]=[i,n,F2e(n)]}return e}Yte.exports=T2e});var QT=w((Eut,qte)=>{function L2e(r,e){return function(t){return t==null?!1:t[r]===e&&(e!==void 0||r in Object(t))}}qte.exports=L2e});var Wte=w((Iut,Jte)=>{var O2e=Hte(),M2e=jte(),K2e=QT();function U2e(r){var e=M2e(r);return e.length==1&&e[0][2]?K2e(e[0][0],e[0][1]):function(t){return t===r||O2e(t,r,e)}}Jte.exports=U2e});var uQ=w((yut,zte)=>{var H2e=rm();function G2e(r,e,t){var i=r==null?void 0:H2e(r,e);return i===void 0?t:i}zte.exports=G2e});var Xte=w((wut,Vte)=>{var Y2e=wT(),j2e=uQ(),q2e=HN(),J2e=K0(),W2e=BT(),z2e=QT(),V2e=Zc(),X2e=1,Z2e=2;function _2e(r,e){return J2e(r)&&W2e(e)?z2e(V2e(r),e):function(t){var i=j2e(t,r);return i===void 0&&i===e?q2e(t,r):Y2e(e,i,X2e|Z2e)}}Vte.exports=_2e});var _te=w((But,Zte)=>{function $2e(r){return function(e){return e==null?void 0:e[r]}}Zte.exports=$2e});var ere=w((Qut,$te)=>{var eHe=rm();function tHe(r){return function(e){return eHe(e,r)}}$te.exports=tHe});var rre=w((but,tre)=>{var rHe=_te(),iHe=ere(),nHe=K0(),sHe=Zc();function oHe(r){return nHe(r)?rHe(sHe(r)):iHe(r)}tre.exports=oHe});var bT=w((Sut,ire)=>{var aHe=Wte(),AHe=Xte(),lHe=J0(),cHe=vs(),uHe=rre();function gHe(r){return typeof r==\"function\"?r:r==null?lHe:typeof r==\"object\"?cHe(r)?AHe(r[0],r[1]):aHe(r):uHe(r)}ire.exports=gHe});var ST=w((vut,nre)=>{var fHe=Qh(),hHe=lT(),pHe=bT();function dHe(r,e){var t={};return e=pHe(e,3),hHe(r,function(i,n,s){fHe(t,n,e(i,n,s))}),t}nre.exports=dHe});var pm=w((xut,lre)=>{\"use strict\";function eu(r){this._maxSize=r,this.clear()}eu.prototype.clear=function(){this._size=0,this._values=Object.create(null)};eu.prototype.get=function(r){return this._values[r]};eu.prototype.set=function(r,e){return this._size>=this._maxSize&&this.clear(),r in this._values||this._size++,this._values[r]=e};var CHe=/[^.^\\]^[]+|(?=\\[\\]|\\.\\.)/g,Are=/^\\d+$/,mHe=/^\\d/,EHe=/[~`!#$%\\^&*+=\\-\\[\\]\\\\';,/{}|\\\\\":<>\\?]/g,IHe=/^\\s*(['\"]?)(.*?)(\\1)\\s*$/,PT=512,sre=new eu(PT),ore=new eu(PT),are=new eu(PT);lre.exports={Cache:eu,split:xT,normalizePath:vT,setter:function(r){var e=vT(r);return ore.get(r)||ore.set(r,function(i,n){for(var s=0,o=e.length,a=i;s<o-1;){var l=e[s];if(l===\"__proto__\"||l===\"constructor\"||l===\"prototype\")return i;a=a[e[s++]]}a[e[s]]=n})},getter:function(r,e){var t=vT(r);return are.get(r)||are.set(r,function(n){for(var s=0,o=t.length;s<o;)if(n!=null||!e)n=n[t[s++]];else return;return n})},join:function(r){return r.reduce(function(e,t){return e+(DT(t)||Are.test(t)?\"[\"+t+\"]\":(e?\".\":\"\")+t)},\"\")},forEach:function(r,e,t){yHe(Array.isArray(r)?r:xT(r),e,t)}};function vT(r){return sre.get(r)||sre.set(r,xT(r).map(function(e){return e.replace(IHe,\"$2\")}))}function xT(r){return r.match(CHe)}function yHe(r,e,t){var i=r.length,n,s,o,a;for(s=0;s<i;s++)n=r[s],n&&(QHe(n)&&(n='\"'+n+'\"'),a=DT(n),o=!a&&/^\\d+$/.test(n),e.call(t,n,a,o,s,r))}function DT(r){return typeof r==\"string\"&&r&&[\"'\",'\"'].indexOf(r.charAt(0))!==-1}function wHe(r){return r.match(mHe)&&!r.match(Are)}function BHe(r){return EHe.test(r)}function QHe(r){return!DT(r)&&(wHe(r)||BHe(r))}});var tu=w(Cm=>{\"use strict\";Object.defineProperty(Cm,\"__esModule\",{value:!0});Cm.create=SHe;Cm.default=void 0;var bHe=pm(),gQ={context:\"$\",value:\".\"};function SHe(r,e){return new dm(r,e)}var dm=class{constructor(e,t={}){if(typeof e!=\"string\")throw new TypeError(\"ref must be a string, got: \"+e);if(this.key=e.trim(),e===\"\")throw new TypeError(\"ref must be a non-empty string\");this.isContext=this.key[0]===gQ.context,this.isValue=this.key[0]===gQ.value,this.isSibling=!this.isContext&&!this.isValue;let i=this.isContext?gQ.context:this.isValue?gQ.value:\"\";this.path=this.key.slice(i.length),this.getter=this.path&&(0,bHe.getter)(this.path,!0),this.map=t.map}getValue(e,t,i){let n=this.isContext?i:this.isValue?e:t;return this.getter&&(n=this.getter(n||{})),this.map&&(n=this.map(n)),n}cast(e,t){return this.getValue(e,t==null?void 0:t.parent,t==null?void 0:t.context)}resolve(){return this}describe(){return{type:\"ref\",key:this.key}}toString(){return`Ref(${this.key})`}static isRef(e){return e&&e.__isYupRef}};Cm.default=dm;dm.prototype.__isYupRef=!0});var cre=w(RT=>{\"use strict\";Object.defineProperty(RT,\"__esModule\",{value:!0});RT.default=DHe;var vHe=kT(ST()),fQ=kT(_c()),xHe=kT(tu());function kT(r){return r&&r.__esModule?r:{default:r}}function hQ(){return hQ=Object.assign||function(r){for(var e=1;e<arguments.length;e++){var t=arguments[e];for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(r[i]=t[i])}return r},hQ.apply(this,arguments)}function PHe(r,e){if(r==null)return{};var t={},i=Object.keys(r),n,s;for(s=0;s<i.length;s++)n=i[s],!(e.indexOf(n)>=0)&&(t[n]=r[n]);return t}function DHe(r){function e(t,i){let{value:n,path:s=\"\",label:o,options:a,originalValue:l,sync:c}=t,u=PHe(t,[\"value\",\"path\",\"label\",\"options\",\"originalValue\",\"sync\"]),{name:g,test:f,params:h,message:p}=r,{parent:C,context:y}=a;function B(j){return xHe.default.isRef(j)?j.getValue(n,C,y):j}function v(j={}){let $=(0,vHe.default)(hQ({value:n,originalValue:l,label:o,path:j.path||s},h,j.params),B),V=new fQ.default(fQ.default.formatError(j.message||p,$),n,$.path,j.type||g);return V.params=$,V}let D=hQ({path:s,parent:C,type:g,createError:v,resolve:B,options:a,originalValue:l},u);if(!c){try{Promise.resolve(f.call(D,n,D)).then(j=>{fQ.default.isError(j)?i(j):j?i(null,j):i(v())})}catch(j){i(j)}return}let T;try{var H;if(T=f.call(D,n,D),typeof((H=T)==null?void 0:H.then)==\"function\")throw new Error(`Validation test of type: \"${D.type}\" returned a Promise during a synchronous validate. This test will finish after the validate call has returned`)}catch(j){i(j);return}fQ.default.isError(T)?i(T):T?i(null,T):i(v())}return e.OPTIONS=r,e}});var FT=w(mm=>{\"use strict\";Object.defineProperty(mm,\"__esModule\",{value:!0});mm.getIn=ure;mm.default=void 0;var kHe=pm(),RHe=r=>r.substr(0,r.length-1).substr(1);function ure(r,e,t,i=t){let n,s,o;return e?((0,kHe.forEach)(e,(a,l,c)=>{let u=l?RHe(a):a;if(r=r.resolve({context:i,parent:n,value:t}),r.innerType){let g=c?parseInt(u,10):0;if(t&&g>=t.length)throw new Error(`Yup.reach cannot resolve an array item at index: ${a}, in the path: ${e}. because there is no value at that index. `);n=t,t=t&&t[g],r=r.innerType}if(!c){if(!r.fields||!r.fields[u])throw new Error(`The schema does not contain the path: ${e}. (failed at: ${o} which is a type: \"${r._type}\")`);n=t,t=t&&t[u],r=r.fields[u]}s=u,o=l?\"[\"+a+\"]\":\".\"+a}),{schema:r,parent:n,parentPath:s}):{parent:n,parentPath:e,schema:r}}var FHe=(r,e,t,i)=>ure(r,e,t,i).schema,NHe=FHe;mm.default=NHe});var fre=w(pQ=>{\"use strict\";Object.defineProperty(pQ,\"__esModule\",{value:!0});pQ.default=void 0;var gre=THe(tu());function THe(r){return r&&r.__esModule?r:{default:r}}var Em=class{constructor(){this.list=new Set,this.refs=new Map}get size(){return this.list.size+this.refs.size}describe(){let e=[];for(let t of this.list)e.push(t);for(let[,t]of this.refs)e.push(t.describe());return e}toArray(){return Array.from(this.list).concat(Array.from(this.refs.values()))}add(e){gre.default.isRef(e)?this.refs.set(e.key,e):this.list.add(e)}delete(e){gre.default.isRef(e)?this.refs.delete(e.key):this.list.delete(e)}has(e,t){if(this.list.has(e))return!0;let i,n=this.refs.values();for(;i=n.next(),!i.done;)if(t(i.value)===e)return!0;return!1}clone(){let e=new Em;return e.list=new Set(this.list),e.refs=new Map(this.refs),e}merge(e,t){let i=this.clone();return e.list.forEach(n=>i.add(n)),e.refs.forEach(n=>i.add(n)),t.list.forEach(n=>i.delete(n)),t.refs.forEach(n=>i.delete(n)),i}};pQ.default=Em});var oA=w(CQ=>{\"use strict\";Object.defineProperty(CQ,\"__esModule\",{value:!0});CQ.default=void 0;var hre=sA(O$()),Th=nA(),LHe=sA(Z$()),pre=sA(iQ()),dQ=sA(cre()),dre=sA(om()),OHe=sA(tu()),MHe=FT(),KHe=sA(tT()),Cre=sA(_c()),mre=sA(fre());function sA(r){return r&&r.__esModule?r:{default:r}}function Fs(){return Fs=Object.assign||function(r){for(var e=1;e<arguments.length;e++){var t=arguments[e];for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(r[i]=t[i])}return r},Fs.apply(this,arguments)}var co=class{constructor(e){this.deps=[],this.conditions=[],this._whitelist=new mre.default,this._blacklist=new mre.default,this.exclusiveTests=Object.create(null),this.tests=[],this.transforms=[],this.withMutation(()=>{this.typeError(Th.mixed.notType)}),this.type=(e==null?void 0:e.type)||\"mixed\",this.spec=Fs({strip:!1,strict:!1,abortEarly:!0,recursive:!0,nullable:!1,presence:\"optional\"},e==null?void 0:e.spec)}get _type(){return this.type}_typeCheck(e){return!0}clone(e){if(this._mutate)return e&&Object.assign(this.spec,e),this;let t=Object.create(Object.getPrototypeOf(this));return t.type=this.type,t._typeError=this._typeError,t._whitelistError=this._whitelistError,t._blacklistError=this._blacklistError,t._whitelist=this._whitelist.clone(),t._blacklist=this._blacklist.clone(),t.exclusiveTests=Fs({},this.exclusiveTests),t.deps=[...this.deps],t.conditions=[...this.conditions],t.tests=[...this.tests],t.transforms=[...this.transforms],t.spec=(0,hre.default)(Fs({},this.spec,e)),t}label(e){var t=this.clone();return t.spec.label=e,t}meta(...e){if(e.length===0)return this.spec.meta;let t=this.clone();return t.spec.meta=Object.assign(t.spec.meta||{},e[0]),t}withMutation(e){let t=this._mutate;this._mutate=!0;let i=e(this);return this._mutate=t,i}concat(e){if(!e||e===this)return this;if(e.type!==this.type&&this.type!==\"mixed\")throw new TypeError(`You cannot \\`concat()\\` schema's of different types: ${this.type} and ${e.type}`);let t=this,i=e.clone(),n=Fs({},t.spec,i.spec);return i.spec=n,i._typeError||(i._typeError=t._typeError),i._whitelistError||(i._whitelistError=t._whitelistError),i._blacklistError||(i._blacklistError=t._blacklistError),i._whitelist=t._whitelist.merge(e._whitelist,e._blacklist),i._blacklist=t._blacklist.merge(e._blacklist,e._whitelist),i.tests=t.tests,i.exclusiveTests=t.exclusiveTests,i.withMutation(s=>{e.tests.forEach(o=>{s.test(o.OPTIONS)})}),i}isType(e){return this.spec.nullable&&e===null?!0:this._typeCheck(e)}resolve(e){let t=this;if(t.conditions.length){let i=t.conditions;t=t.clone(),t.conditions=[],t=i.reduce((n,s)=>s.resolve(n,e),t),t=t.resolve(e)}return t}cast(e,t={}){let i=this.resolve(Fs({value:e},t)),n=i._cast(e,t);if(e!==void 0&&t.assert!==!1&&i.isType(n)!==!0){let s=(0,dre.default)(e),o=(0,dre.default)(n);throw new TypeError(`The value of ${t.path||\"field\"} could not be cast to a value that satisfies the schema type: \"${i._type}\". \n\nattempted value: ${s} \n`+(o!==s?`result of cast: ${o}`:\"\"))}return n}_cast(e,t){let i=e===void 0?e:this.transforms.reduce((n,s)=>s.call(this,n,e,this),e);return i===void 0&&(i=this.getDefault()),i}_validate(e,t={},i){let{sync:n,path:s,from:o=[],originalValue:a=e,strict:l=this.spec.strict,abortEarly:c=this.spec.abortEarly}=t,u=e;l||(u=this._cast(u,Fs({assert:!1},t)));let g={value:u,path:s,options:t,originalValue:a,schema:this,label:this.spec.label,sync:n,from:o},f=[];this._typeError&&f.push(this._typeError),this._whitelistError&&f.push(this._whitelistError),this._blacklistError&&f.push(this._blacklistError),(0,pre.default)({args:g,value:u,path:s,sync:n,tests:f,endEarly:c},h=>{if(h)return void i(h,u);(0,pre.default)({tests:this.tests,args:g,path:s,sync:n,value:u,endEarly:c},i)})}validate(e,t,i){let n=this.resolve(Fs({},t,{value:e}));return typeof i==\"function\"?n._validate(e,t,i):new Promise((s,o)=>n._validate(e,t,(a,l)=>{a?o(a):s(l)}))}validateSync(e,t){let i=this.resolve(Fs({},t,{value:e})),n;return i._validate(e,Fs({},t,{sync:!0}),(s,o)=>{if(s)throw s;n=o}),n}isValid(e,t){return this.validate(e,t).then(()=>!0,i=>{if(Cre.default.isError(i))return!1;throw i})}isValidSync(e,t){try{return this.validateSync(e,t),!0}catch(i){if(Cre.default.isError(i))return!1;throw i}}_getDefault(){let e=this.spec.default;return e==null?e:typeof e==\"function\"?e.call(this):(0,hre.default)(e)}getDefault(e){return this.resolve(e||{})._getDefault()}default(e){return arguments.length===0?this._getDefault():this.clone({default:e})}strict(e=!0){var t=this.clone();return t.spec.strict=e,t}_isPresent(e){return e!=null}defined(e=Th.mixed.defined){return this.test({message:e,name:\"defined\",exclusive:!0,test(t){return t!==void 0}})}required(e=Th.mixed.required){return this.clone({presence:\"required\"}).withMutation(t=>t.test({message:e,name:\"required\",exclusive:!0,test(i){return this.schema._isPresent(i)}}))}notRequired(){var e=this.clone({presence:\"optional\"});return e.tests=e.tests.filter(t=>t.OPTIONS.name!==\"required\"),e}nullable(e=!0){var t=this.clone({nullable:e!==!1});return t}transform(e){var t=this.clone();return t.transforms.push(e),t}test(...e){let t;if(e.length===1?typeof e[0]==\"function\"?t={test:e[0]}:t=e[0]:e.length===2?t={name:e[0],test:e[1]}:t={name:e[0],message:e[1],test:e[2]},t.message===void 0&&(t.message=Th.mixed.default),typeof t.test!=\"function\")throw new TypeError(\"`test` is a required parameters\");let i=this.clone(),n=(0,dQ.default)(t),s=t.exclusive||t.name&&i.exclusiveTests[t.name]===!0;if(t.exclusive&&!t.name)throw new TypeError(\"Exclusive tests must provide a unique `name` identifying the test\");return t.name&&(i.exclusiveTests[t.name]=!!t.exclusive),i.tests=i.tests.filter(o=>!(o.OPTIONS.name===t.name&&(s||o.OPTIONS.test===n.OPTIONS.test))),i.tests.push(n),i}when(e,t){!Array.isArray(e)&&typeof e!=\"string\"&&(t=e,e=\".\");let i=this.clone(),n=(0,KHe.default)(e).map(s=>new OHe.default(s));return n.forEach(s=>{s.isSibling&&i.deps.push(s.key)}),i.conditions.push(new LHe.default(n,t)),i}typeError(e){var t=this.clone();return t._typeError=(0,dQ.default)({message:e,name:\"typeError\",test(i){return i!==void 0&&!this.schema.isType(i)?this.createError({params:{type:this.schema._type}}):!0}}),t}oneOf(e,t=Th.mixed.oneOf){var i=this.clone();return e.forEach(n=>{i._whitelist.add(n),i._blacklist.delete(n)}),i._whitelistError=(0,dQ.default)({message:t,name:\"oneOf\",test(n){if(n===void 0)return!0;let s=this.schema._whitelist;return s.has(n,this.resolve)?!0:this.createError({params:{values:s.toArray().join(\", \")}})}}),i}notOneOf(e,t=Th.mixed.notOneOf){var i=this.clone();return e.forEach(n=>{i._blacklist.add(n),i._whitelist.delete(n)}),i._blacklistError=(0,dQ.default)({message:t,name:\"notOneOf\",test(n){let s=this.schema._blacklist;return s.has(n,this.resolve)?this.createError({params:{values:s.toArray().join(\", \")}}):!0}}),i}strip(e=!0){let t=this.clone();return t.spec.strip=e,t}describe(){let e=this.clone(),{label:t,meta:i}=e.spec;return{meta:i,label:t,type:e.type,oneOf:e._whitelist.describe(),notOneOf:e._blacklist.describe(),tests:e.tests.map(s=>({name:s.OPTIONS.name,params:s.OPTIONS.params})).filter((s,o,a)=>a.findIndex(l=>l.name===s.name)===o)}}};CQ.default=co;co.prototype.__isYupSchema__=!0;for(let r of[\"validate\",\"validateSync\"])co.prototype[`${r}At`]=function(e,t,i={}){let{parent:n,parentPath:s,schema:o}=(0,MHe.getIn)(this,e,t,i.context);return o[r](n&&n[s],Fs({},i,{parent:n,path:e}))};for(let r of[\"equals\",\"is\"])co.prototype[r]=co.prototype.oneOf;for(let r of[\"not\",\"nope\"])co.prototype[r]=co.prototype.notOneOf;co.prototype.optional=co.prototype.notRequired});var Ire=w(Im=>{\"use strict\";Object.defineProperty(Im,\"__esModule\",{value:!0});Im.create=Ere;Im.default=void 0;var UHe=HHe(oA());function HHe(r){return r&&r.__esModule?r:{default:r}}var NT=UHe.default,GHe=NT;Im.default=GHe;function Ere(){return new NT}Ere.prototype=NT.prototype});var Lh=w(mQ=>{\"use strict\";Object.defineProperty(mQ,\"__esModule\",{value:!0});mQ.default=void 0;var YHe=r=>r==null;mQ.default=YHe});var bre=w(wm=>{\"use strict\";Object.defineProperty(wm,\"__esModule\",{value:!0});wm.create=Qre;wm.default=void 0;var jHe=Bre(oA()),yre=nA(),wre=Bre(Lh());function Bre(r){return r&&r.__esModule?r:{default:r}}function Qre(){return new ym}var ym=class extends jHe.default{constructor(){super({type:\"boolean\"}),this.withMutation(()=>{this.transform(function(e){if(!this.isType(e)){if(/^(true|1)$/i.test(String(e)))return!0;if(/^(false|0)$/i.test(String(e)))return!1}return e})})}_typeCheck(e){return e instanceof Boolean&&(e=e.valueOf()),typeof e==\"boolean\"}isTrue(e=yre.boolean.isValue){return this.test({message:e,name:\"is-value\",exclusive:!0,params:{value:\"true\"},test(t){return(0,wre.default)(t)||t===!0}})}isFalse(e=yre.boolean.isValue){return this.test({message:e,name:\"is-value\",exclusive:!0,params:{value:\"false\"},test(t){return(0,wre.default)(t)||t===!1}})}};wm.default=ym;Qre.prototype=ym.prototype});var xre=w(Qm=>{\"use strict\";Object.defineProperty(Qm,\"__esModule\",{value:!0});Qm.create=vre;Qm.default=void 0;var ia=nA(),aA=Sre(Lh()),qHe=Sre(oA());function Sre(r){return r&&r.__esModule?r:{default:r}}var JHe=/^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i,WHe=/^((https?|ftp):)?\\/\\/(((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:)*@)?(((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]))|((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.?)(:\\d*)?)(\\/((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)+(\\/(([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)*)*)?)?(\\?((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|[\\uE000-\\uF8FF]|\\/|\\?)*)?(\\#((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|\\/|\\?)*)?$/i,zHe=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i,VHe=r=>(0,aA.default)(r)||r===r.trim(),XHe={}.toString();function vre(){return new Bm}var Bm=class extends qHe.default{constructor(){super({type:\"string\"}),this.withMutation(()=>{this.transform(function(e){if(this.isType(e)||Array.isArray(e))return e;let t=e!=null&&e.toString?e.toString():e;return t===XHe?e:t})})}_typeCheck(e){return e instanceof String&&(e=e.valueOf()),typeof e==\"string\"}_isPresent(e){return super._isPresent(e)&&!!e.length}length(e,t=ia.string.length){return this.test({message:t,name:\"length\",exclusive:!0,params:{length:e},test(i){return(0,aA.default)(i)||i.length===this.resolve(e)}})}min(e,t=ia.string.min){return this.test({message:t,name:\"min\",exclusive:!0,params:{min:e},test(i){return(0,aA.default)(i)||i.length>=this.resolve(e)}})}max(e,t=ia.string.max){return this.test({name:\"max\",exclusive:!0,message:t,params:{max:e},test(i){return(0,aA.default)(i)||i.length<=this.resolve(e)}})}matches(e,t){let i=!1,n,s;return t&&(typeof t==\"object\"?{excludeEmptyString:i=!1,message:n,name:s}=t:n=t),this.test({name:s||\"matches\",message:n||ia.string.matches,params:{regex:e},test:o=>(0,aA.default)(o)||o===\"\"&&i||o.search(e)!==-1})}email(e=ia.string.email){return this.matches(JHe,{name:\"email\",message:e,excludeEmptyString:!0})}url(e=ia.string.url){return this.matches(WHe,{name:\"url\",message:e,excludeEmptyString:!0})}uuid(e=ia.string.uuid){return this.matches(zHe,{name:\"uuid\",message:e,excludeEmptyString:!1})}ensure(){return this.default(\"\").transform(e=>e===null?\"\":e)}trim(e=ia.string.trim){return this.transform(t=>t!=null?t.trim():t).test({message:e,name:\"trim\",test:VHe})}lowercase(e=ia.string.lowercase){return this.transform(t=>(0,aA.default)(t)?t:t.toLowerCase()).test({message:e,name:\"string_case\",exclusive:!0,test:t=>(0,aA.default)(t)||t===t.toLowerCase()})}uppercase(e=ia.string.uppercase){return this.transform(t=>(0,aA.default)(t)?t:t.toUpperCase()).test({message:e,name:\"string_case\",exclusive:!0,test:t=>(0,aA.default)(t)||t===t.toUpperCase()})}};Qm.default=Bm;vre.prototype=Bm.prototype});var kre=w(Sm=>{\"use strict\";Object.defineProperty(Sm,\"__esModule\",{value:!0});Sm.create=Dre;Sm.default=void 0;var ru=nA(),iu=Pre(Lh()),ZHe=Pre(oA());function Pre(r){return r&&r.__esModule?r:{default:r}}var _He=r=>r!=+r;function Dre(){return new bm}var bm=class extends ZHe.default{constructor(){super({type:\"number\"}),this.withMutation(()=>{this.transform(function(e){let t=e;if(typeof t==\"string\"){if(t=t.replace(/\\s/g,\"\"),t===\"\")return NaN;t=+t}return this.isType(t)?t:parseFloat(t)})})}_typeCheck(e){return e instanceof Number&&(e=e.valueOf()),typeof e==\"number\"&&!_He(e)}min(e,t=ru.number.min){return this.test({message:t,name:\"min\",exclusive:!0,params:{min:e},test(i){return(0,iu.default)(i)||i>=this.resolve(e)}})}max(e,t=ru.number.max){return this.test({message:t,name:\"max\",exclusive:!0,params:{max:e},test(i){return(0,iu.default)(i)||i<=this.resolve(e)}})}lessThan(e,t=ru.number.lessThan){return this.test({message:t,name:\"max\",exclusive:!0,params:{less:e},test(i){return(0,iu.default)(i)||i<this.resolve(e)}})}moreThan(e,t=ru.number.moreThan){return this.test({message:t,name:\"min\",exclusive:!0,params:{more:e},test(i){return(0,iu.default)(i)||i>this.resolve(e)}})}positive(e=ru.number.positive){return this.moreThan(0,e)}negative(e=ru.number.negative){return this.lessThan(0,e)}integer(e=ru.number.integer){return this.test({name:\"integer\",message:e,test:t=>(0,iu.default)(t)||Number.isInteger(t)})}truncate(){return this.transform(e=>(0,iu.default)(e)?e:e|0)}round(e){var t,i=[\"ceil\",\"floor\",\"round\",\"trunc\"];if(e=((t=e)==null?void 0:t.toLowerCase())||\"round\",e===\"trunc\")return this.truncate();if(i.indexOf(e.toLowerCase())===-1)throw new TypeError(\"Only valid options for round() are: \"+i.join(\", \"));return this.transform(n=>(0,iu.default)(n)?n:Math[e](n))}};Sm.default=bm;Dre.prototype=bm.prototype});var Rre=w(TT=>{\"use strict\";Object.defineProperty(TT,\"__esModule\",{value:!0});TT.default=eGe;var $He=/^(\\d{4}|[+\\-]\\d{6})(?:-?(\\d{2})(?:-?(\\d{2}))?)?(?:[ T]?(\\d{2}):?(\\d{2})(?::?(\\d{2})(?:[,\\.](\\d{1,}))?)?(?:(Z)|([+\\-])(\\d{2})(?::?(\\d{2}))?)?)?$/;function eGe(r){var e=[1,4,5,6,7,10,11],t=0,i,n;if(n=$He.exec(r)){for(var s=0,o;o=e[s];++s)n[o]=+n[o]||0;n[2]=(+n[2]||1)-1,n[3]=+n[3]||1,n[7]=n[7]?String(n[7]).substr(0,3):0,(n[8]===void 0||n[8]===\"\")&&(n[9]===void 0||n[9]===\"\")?i=+new Date(n[1],n[2],n[3],n[4],n[5],n[6],n[7]):(n[8]!==\"Z\"&&n[9]!==void 0&&(t=n[10]*60+n[11],n[9]===\"+\"&&(t=0-t)),i=Date.UTC(n[1],n[2],n[3],n[4],n[5]+t,n[6],n[7]))}else i=Date.parse?Date.parse(r):NaN;return i}});var Tre=w(vm=>{\"use strict\";Object.defineProperty(vm,\"__esModule\",{value:!0});vm.create=OT;vm.default=void 0;var tGe=EQ(Rre()),Fre=nA(),Nre=EQ(Lh()),rGe=EQ(tu()),iGe=EQ(oA());function EQ(r){return r&&r.__esModule?r:{default:r}}var LT=new Date(\"\"),nGe=r=>Object.prototype.toString.call(r)===\"[object Date]\";function OT(){return new Oh}var Oh=class extends iGe.default{constructor(){super({type:\"date\"}),this.withMutation(()=>{this.transform(function(e){return this.isType(e)?e:(e=(0,tGe.default)(e),isNaN(e)?LT:new Date(e))})})}_typeCheck(e){return nGe(e)&&!isNaN(e.getTime())}prepareParam(e,t){let i;if(rGe.default.isRef(e))i=e;else{let n=this.cast(e);if(!this._typeCheck(n))throw new TypeError(`\\`${t}\\` must be a Date or a value that can be \\`cast()\\` to a Date`);i=n}return i}min(e,t=Fre.date.min){let i=this.prepareParam(e,\"min\");return this.test({message:t,name:\"min\",exclusive:!0,params:{min:e},test(n){return(0,Nre.default)(n)||n>=this.resolve(i)}})}max(e,t=Fre.date.max){var i=this.prepareParam(e,\"max\");return this.test({message:t,name:\"max\",exclusive:!0,params:{max:e},test(n){return(0,Nre.default)(n)||n<=this.resolve(i)}})}};vm.default=Oh;Oh.INVALID_DATE=LT;OT.prototype=Oh.prototype;OT.INVALID_DATE=LT});var Ore=w((Hut,Lre)=>{function sGe(r,e,t,i){var n=-1,s=r==null?0:r.length;for(i&&s&&(t=r[++n]);++n<s;)t=e(t,r[n],n,r);return t}Lre.exports=sGe});var Kre=w((Gut,Mre)=>{function oGe(r){return function(e){return r==null?void 0:r[e]}}Mre.exports=oGe});var Hre=w((Yut,Ure)=>{var aGe=Kre(),AGe={\\u00C0:\"A\",\\u00C1:\"A\",\\u00C2:\"A\",\\u00C3:\"A\",\\u00C4:\"A\",\\u00C5:\"A\",\\u00E0:\"a\",\\u00E1:\"a\",\\u00E2:\"a\",\\u00E3:\"a\",\\u00E4:\"a\",\\u00E5:\"a\",\\u00C7:\"C\",\\u00E7:\"c\",\\u00D0:\"D\",\\u00F0:\"d\",\\u00C8:\"E\",\\u00C9:\"E\",\\u00CA:\"E\",\\u00CB:\"E\",\\u00E8:\"e\",\\u00E9:\"e\",\\u00EA:\"e\",\\u00EB:\"e\",\\u00CC:\"I\",\\u00CD:\"I\",\\u00CE:\"I\",\\u00CF:\"I\",\\u00EC:\"i\",\\u00ED:\"i\",\\u00EE:\"i\",\\u00EF:\"i\",\\u00D1:\"N\",\\u00F1:\"n\",\\u00D2:\"O\",\\u00D3:\"O\",\\u00D4:\"O\",\\u00D5:\"O\",\\u00D6:\"O\",\\u00D8:\"O\",\\u00F2:\"o\",\\u00F3:\"o\",\\u00F4:\"o\",\\u00F5:\"o\",\\u00F6:\"o\",\\u00F8:\"o\",\\u00D9:\"U\",\\u00DA:\"U\",\\u00DB:\"U\",\\u00DC:\"U\",\\u00F9:\"u\",\\u00FA:\"u\",\\u00FB:\"u\",\\u00FC:\"u\",\\u00DD:\"Y\",\\u00FD:\"y\",\\u00FF:\"y\",\\u00C6:\"Ae\",\\u00E6:\"ae\",\\u00DE:\"Th\",\\u00FE:\"th\",\\u00DF:\"ss\",\\u0100:\"A\",\\u0102:\"A\",\\u0104:\"A\",\\u0101:\"a\",\\u0103:\"a\",\\u0105:\"a\",\\u0106:\"C\",\\u0108:\"C\",\\u010A:\"C\",\\u010C:\"C\",\\u0107:\"c\",\\u0109:\"c\",\\u010B:\"c\",\\u010D:\"c\",\\u010E:\"D\",\\u0110:\"D\",\\u010F:\"d\",\\u0111:\"d\",\\u0112:\"E\",\\u0114:\"E\",\\u0116:\"E\",\\u0118:\"E\",\\u011A:\"E\",\\u0113:\"e\",\\u0115:\"e\",\\u0117:\"e\",\\u0119:\"e\",\\u011B:\"e\",\\u011C:\"G\",\\u011E:\"G\",\\u0120:\"G\",\\u0122:\"G\",\\u011D:\"g\",\\u011F:\"g\",\\u0121:\"g\",\\u0123:\"g\",\\u0124:\"H\",\\u0126:\"H\",\\u0125:\"h\",\\u0127:\"h\",\\u0128:\"I\",\\u012A:\"I\",\\u012C:\"I\",\\u012E:\"I\",\\u0130:\"I\",\\u0129:\"i\",\\u012B:\"i\",\\u012D:\"i\",\\u012F:\"i\",\\u0131:\"i\",\\u0134:\"J\",\\u0135:\"j\",\\u0136:\"K\",\\u0137:\"k\",\\u0138:\"k\",\\u0139:\"L\",\\u013B:\"L\",\\u013D:\"L\",\\u013F:\"L\",\\u0141:\"L\",\\u013A:\"l\",\\u013C:\"l\",\\u013E:\"l\",\\u0140:\"l\",\\u0142:\"l\",\\u0143:\"N\",\\u0145:\"N\",\\u0147:\"N\",\\u014A:\"N\",\\u0144:\"n\",\\u0146:\"n\",\\u0148:\"n\",\\u014B:\"n\",\\u014C:\"O\",\\u014E:\"O\",\\u0150:\"O\",\\u014D:\"o\",\\u014F:\"o\",\\u0151:\"o\",\\u0154:\"R\",\\u0156:\"R\",\\u0158:\"R\",\\u0155:\"r\",\\u0157:\"r\",\\u0159:\"r\",\\u015A:\"S\",\\u015C:\"S\",\\u015E:\"S\",\\u0160:\"S\",\\u015B:\"s\",\\u015D:\"s\",\\u015F:\"s\",\\u0161:\"s\",\\u0162:\"T\",\\u0164:\"T\",\\u0166:\"T\",\\u0163:\"t\",\\u0165:\"t\",\\u0167:\"t\",\\u0168:\"U\",\\u016A:\"U\",\\u016C:\"U\",\\u016E:\"U\",\\u0170:\"U\",\\u0172:\"U\",\\u0169:\"u\",\\u016B:\"u\",\\u016D:\"u\",\\u016F:\"u\",\\u0171:\"u\",\\u0173:\"u\",\\u0174:\"W\",\\u0175:\"w\",\\u0176:\"Y\",\\u0177:\"y\",\\u0178:\"Y\",\\u0179:\"Z\",\\u017B:\"Z\",\\u017D:\"Z\",\\u017A:\"z\",\\u017C:\"z\",\\u017E:\"z\",\\u0132:\"IJ\",\\u0133:\"ij\",\\u0152:\"Oe\",\\u0153:\"oe\",\\u0149:\"'n\",\\u017F:\"s\"},lGe=aGe(AGe);Ure.exports=lGe});var Yre=w((jut,Gre)=>{var cGe=Hre(),uGe=Vf(),gGe=/[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g,fGe=\"\\\\u0300-\\\\u036f\",hGe=\"\\\\ufe20-\\\\ufe2f\",pGe=\"\\\\u20d0-\\\\u20ff\",dGe=fGe+hGe+pGe,CGe=\"[\"+dGe+\"]\",mGe=RegExp(CGe,\"g\");function EGe(r){return r=uGe(r),r&&r.replace(gGe,cGe).replace(mGe,\"\")}Gre.exports=EGe});var qre=w((qut,jre)=>{var IGe=/[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;function yGe(r){return r.match(IGe)||[]}jre.exports=yGe});var Wre=w((Jut,Jre)=>{var wGe=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;function BGe(r){return wGe.test(r)}Jre.exports=BGe});var gie=w((Wut,uie)=>{var _re=\"\\\\ud800-\\\\udfff\",QGe=\"\\\\u0300-\\\\u036f\",bGe=\"\\\\ufe20-\\\\ufe2f\",SGe=\"\\\\u20d0-\\\\u20ff\",vGe=QGe+bGe+SGe,$re=\"\\\\u2700-\\\\u27bf\",eie=\"a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff\",xGe=\"\\\\xac\\\\xb1\\\\xd7\\\\xf7\",PGe=\"\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf\",DGe=\"\\\\u2000-\\\\u206f\",kGe=\" \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000\",tie=\"A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde\",RGe=\"\\\\ufe0e\\\\ufe0f\",rie=xGe+PGe+DGe+kGe,iie=\"['\\u2019]\",zre=\"[\"+rie+\"]\",FGe=\"[\"+vGe+\"]\",nie=\"\\\\d+\",NGe=\"[\"+$re+\"]\",sie=\"[\"+eie+\"]\",oie=\"[^\"+_re+rie+nie+$re+eie+tie+\"]\",TGe=\"\\\\ud83c[\\\\udffb-\\\\udfff]\",LGe=\"(?:\"+FGe+\"|\"+TGe+\")\",OGe=\"[^\"+_re+\"]\",aie=\"(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}\",Aie=\"[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]\",Mh=\"[\"+tie+\"]\",MGe=\"\\\\u200d\",Vre=\"(?:\"+sie+\"|\"+oie+\")\",KGe=\"(?:\"+Mh+\"|\"+oie+\")\",Xre=\"(?:\"+iie+\"(?:d|ll|m|re|s|t|ve))?\",Zre=\"(?:\"+iie+\"(?:D|LL|M|RE|S|T|VE))?\",lie=LGe+\"?\",cie=\"[\"+RGe+\"]?\",UGe=\"(?:\"+MGe+\"(?:\"+[OGe,aie,Aie].join(\"|\")+\")\"+cie+lie+\")*\",HGe=\"\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])\",GGe=\"\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])\",YGe=cie+lie+UGe,jGe=\"(?:\"+[NGe,aie,Aie].join(\"|\")+\")\"+YGe,qGe=RegExp([Mh+\"?\"+sie+\"+\"+Xre+\"(?=\"+[zre,Mh,\"$\"].join(\"|\")+\")\",KGe+\"+\"+Zre+\"(?=\"+[zre,Mh+Vre,\"$\"].join(\"|\")+\")\",Mh+\"?\"+Vre+\"+\"+Xre,Mh+\"+\"+Zre,GGe,HGe,nie,jGe].join(\"|\"),\"g\");function JGe(r){return r.match(qGe)||[]}uie.exports=JGe});var hie=w((zut,fie)=>{var WGe=qre(),zGe=Wre(),VGe=Vf(),XGe=gie();function ZGe(r,e,t){return r=VGe(r),e=t?void 0:e,e===void 0?zGe(r)?XGe(r):WGe(r):r.match(e)||[]}fie.exports=ZGe});var MT=w((Vut,pie)=>{var _Ge=Ore(),$Ge=Yre(),eYe=hie(),tYe=\"['\\u2019]\",rYe=RegExp(tYe,\"g\");function iYe(r){return function(e){return _Ge(eYe($Ge(e).replace(rYe,\"\")),r,\"\")}}pie.exports=iYe});var Cie=w((Xut,die)=>{var nYe=MT(),sYe=nYe(function(r,e,t){return r+(t?\"_\":\"\")+e.toLowerCase()});die.exports=sYe});var Eie=w((Zut,mie)=>{var oYe=PB(),aYe=MT(),AYe=aYe(function(r,e,t){return e=e.toLowerCase(),r+(t?oYe(e):e)});mie.exports=AYe});var yie=w((_ut,Iie)=>{var lYe=Qh(),cYe=lT(),uYe=bT();function gYe(r,e){var t={};return e=uYe(e,3),cYe(r,function(i,n,s){lYe(t,e(i,n,s),i)}),t}Iie.exports=gYe});var Bie=w(($ut,KT)=>{KT.exports=function(r){return wie(fYe(r),r)};KT.exports.array=wie;function wie(r,e){var t=r.length,i=new Array(t),n={},s=t,o=hYe(e),a=pYe(r);for(e.forEach(function(c){if(!a.has(c[0])||!a.has(c[1]))throw new Error(\"Unknown node. There is an unknown node in the supplied edges.\")});s--;)n[s]||l(r[s],s,new Set);return i;function l(c,u,g){if(g.has(c)){var f;try{f=\", node was:\"+JSON.stringify(c)}catch{f=\"\"}throw new Error(\"Cyclic dependency\"+f)}if(!a.has(c))throw new Error(\"Found unknown node. Make sure to provided all involved nodes. Unknown node: \"+JSON.stringify(c));if(!n[u]){n[u]=!0;var h=o.get(c)||new Set;if(h=Array.from(h),u=h.length){g.add(c);do{var p=h[--u];l(p,a.get(p),g)}while(u);g.delete(c)}i[--t]=c}}}function fYe(r){for(var e=new Set,t=0,i=r.length;t<i;t++){var n=r[t];e.add(n[0]),e.add(n[1])}return Array.from(e)}function hYe(r){for(var e=new Map,t=0,i=r.length;t<i;t++){var n=r[t];e.has(n[0])||e.set(n[0],new Set),e.has(n[1])||e.set(n[1],new Set),e.get(n[0]).add(n[1])}return e}function pYe(r){for(var e=new Map,t=0,i=r.length;t<i;t++)e.set(r[t],t);return e}});var Qie=w(UT=>{\"use strict\";Object.defineProperty(UT,\"__esModule\",{value:!0});UT.default=yYe;var dYe=IQ(am()),CYe=IQ(Bie()),mYe=pm(),EYe=IQ(tu()),IYe=IQ(xh());function IQ(r){return r&&r.__esModule?r:{default:r}}function yYe(r,e=[]){let t=[],i=[];function n(s,o){var a=(0,mYe.split)(s)[0];~i.indexOf(a)||i.push(a),~e.indexOf(`${o}-${a}`)||t.push([o,a])}for(let s in r)if((0,dYe.default)(r,s)){let o=r[s];~i.indexOf(s)||i.push(s),EYe.default.isRef(o)&&o.isSibling?n(o.path,s):(0,IYe.default)(o)&&\"deps\"in o&&o.deps.forEach(a=>n(a,s))}return CYe.default.array(i,t).reverse()}});var Sie=w(HT=>{\"use strict\";Object.defineProperty(HT,\"__esModule\",{value:!0});HT.default=wYe;function bie(r,e){let t=1/0;return r.some((i,n)=>{var s;if(((s=e.path)==null?void 0:s.indexOf(i))!==-1)return t=n,!0}),t}function wYe(r){return(e,t)=>bie(r,e)-bie(r,t)}});var Fie=w(Pm=>{\"use strict\";Object.defineProperty(Pm,\"__esModule\",{value:!0});Pm.create=Rie;Pm.default=void 0;var vie=na(am()),xie=na(Cie()),BYe=na(Eie()),QYe=na(yie()),bYe=na(ST()),SYe=pm(),Pie=nA(),vYe=na(Qie()),kie=na(Sie()),xYe=na(iQ()),PYe=na(_c()),GT=na(oA());function na(r){return r&&r.__esModule?r:{default:r}}function Kh(){return Kh=Object.assign||function(r){for(var e=1;e<arguments.length;e++){var t=arguments[e];for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(r[i]=t[i])}return r},Kh.apply(this,arguments)}var Die=r=>Object.prototype.toString.call(r)===\"[object Object]\";function DYe(r,e){let t=Object.keys(r.fields);return Object.keys(e).filter(i=>t.indexOf(i)===-1)}var kYe=(0,kie.default)([]),xm=class extends GT.default{constructor(e){super({type:\"object\"}),this.fields=Object.create(null),this._sortErrors=kYe,this._nodes=[],this._excludedEdges=[],this.withMutation(()=>{this.transform(function(i){if(typeof i==\"string\")try{i=JSON.parse(i)}catch{i=null}return this.isType(i)?i:null}),e&&this.shape(e)})}_typeCheck(e){return Die(e)||typeof e==\"function\"}_cast(e,t={}){var i;let n=super._cast(e,t);if(n===void 0)return this.getDefault();if(!this._typeCheck(n))return n;let s=this.fields,o=(i=t.stripUnknown)!=null?i:this.spec.noUnknown,a=this._nodes.concat(Object.keys(n).filter(g=>this._nodes.indexOf(g)===-1)),l={},c=Kh({},t,{parent:l,__validating:t.__validating||!1}),u=!1;for(let g of a){let f=s[g],h=(0,vie.default)(n,g);if(f){let p,C=n[g];c.path=(t.path?`${t.path}.`:\"\")+g,f=f.resolve({value:C,context:t.context,parent:l});let y=\"spec\"in f?f.spec:void 0,B=y==null?void 0:y.strict;if(y!=null&&y.strip){u=u||g in n;continue}p=!t.__validating||!B?f.cast(n[g],c):n[g],p!==void 0&&(l[g]=p)}else h&&!o&&(l[g]=n[g]);l[g]!==n[g]&&(u=!0)}return u?l:n}_validate(e,t={},i){let n=[],{sync:s,from:o=[],originalValue:a=e,abortEarly:l=this.spec.abortEarly,recursive:c=this.spec.recursive}=t;o=[{schema:this,value:a},...o],t.__validating=!0,t.originalValue=a,t.from=o,super._validate(e,t,(u,g)=>{if(u){if(!PYe.default.isError(u)||l)return void i(u,g);n.push(u)}if(!c||!Die(g)){i(n[0]||null,g);return}a=a||g;let f=this._nodes.map(h=>(p,C)=>{let y=h.indexOf(\".\")===-1?(t.path?`${t.path}.`:\"\")+h:`${t.path||\"\"}[\"${h}\"]`,B=this.fields[h];if(B&&\"validate\"in B){B.validate(g[h],Kh({},t,{path:y,from:o,strict:!0,parent:g,originalValue:a[h]}),C);return}C(null)});(0,xYe.default)({sync:s,tests:f,value:g,errors:n,endEarly:l,sort:this._sortErrors,path:t.path},i)})}clone(e){let t=super.clone(e);return t.fields=Kh({},this.fields),t._nodes=this._nodes,t._excludedEdges=this._excludedEdges,t._sortErrors=this._sortErrors,t}concat(e){let t=super.concat(e),i=t.fields;for(let[n,s]of Object.entries(this.fields)){let o=i[n];o===void 0?i[n]=s:o instanceof GT.default&&s instanceof GT.default&&(i[n]=s.concat(o))}return t.withMutation(()=>t.shape(i))}getDefaultFromShape(){let e={};return this._nodes.forEach(t=>{let i=this.fields[t];e[t]=\"default\"in i?i.getDefault():void 0}),e}_getDefault(){if(\"default\"in this.spec)return super._getDefault();if(!!this._nodes.length)return this.getDefaultFromShape()}shape(e,t=[]){let i=this.clone(),n=Object.assign(i.fields,e);if(i.fields=n,i._sortErrors=(0,kie.default)(Object.keys(n)),t.length){Array.isArray(t[0])||(t=[t]);let s=t.map(([o,a])=>`${o}-${a}`);i._excludedEdges=i._excludedEdges.concat(s)}return i._nodes=(0,vYe.default)(n,i._excludedEdges),i}pick(e){let t={};for(let i of e)this.fields[i]&&(t[i]=this.fields[i]);return this.clone().withMutation(i=>(i.fields={},i.shape(t)))}omit(e){let t=this.clone(),i=t.fields;t.fields={};for(let n of e)delete i[n];return t.withMutation(()=>t.shape(i))}from(e,t,i){let n=(0,SYe.getter)(e,!0);return this.transform(s=>{if(s==null)return s;let o=s;return(0,vie.default)(s,e)&&(o=Kh({},s),i||delete o[e],o[t]=n(s)),o})}noUnknown(e=!0,t=Pie.object.noUnknown){typeof e==\"string\"&&(t=e,e=!0);let i=this.test({name:\"noUnknown\",exclusive:!0,message:t,test(n){if(n==null)return!0;let s=DYe(this.schema,n);return!e||s.length===0||this.createError({params:{unknown:s.join(\", \")}})}});return i.spec.noUnknown=e,i}unknown(e=!0,t=Pie.object.noUnknown){return this.noUnknown(!e,t)}transformKeys(e){return this.transform(t=>t&&(0,QYe.default)(t,(i,n)=>e(n)))}camelCase(){return this.transformKeys(BYe.default)}snakeCase(){return this.transformKeys(xie.default)}constantCase(){return this.transformKeys(e=>(0,xie.default)(e).toUpperCase())}describe(){let e=super.describe();return e.fields=(0,bYe.default)(this.fields,t=>t.describe()),e}};Pm.default=xm;function Rie(r){return new xm(r)}Rie.prototype=xm.prototype});var Tie=w(km=>{\"use strict\";Object.defineProperty(km,\"__esModule\",{value:!0});km.create=Nie;km.default=void 0;var YT=Uh(Lh()),RYe=Uh(xh()),FYe=Uh(om()),jT=nA(),NYe=Uh(iQ()),TYe=Uh(_c()),LYe=Uh(oA());function Uh(r){return r&&r.__esModule?r:{default:r}}function yQ(){return yQ=Object.assign||function(r){for(var e=1;e<arguments.length;e++){var t=arguments[e];for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(r[i]=t[i])}return r},yQ.apply(this,arguments)}function Nie(r){return new Dm(r)}var Dm=class extends LYe.default{constructor(e){super({type:\"array\"}),this.innerType=e,this.withMutation(()=>{this.transform(function(t){if(typeof t==\"string\")try{t=JSON.parse(t)}catch{t=null}return this.isType(t)?t:null})})}_typeCheck(e){return Array.isArray(e)}get _subType(){return this.innerType}_cast(e,t){let i=super._cast(e,t);if(!this._typeCheck(i)||!this.innerType)return i;let n=!1,s=i.map((o,a)=>{let l=this.innerType.cast(o,yQ({},t,{path:`${t.path||\"\"}[${a}]`}));return l!==o&&(n=!0),l});return n?s:i}_validate(e,t={},i){var n,s;let o=[],a=t.sync,l=t.path,c=this.innerType,u=(n=t.abortEarly)!=null?n:this.spec.abortEarly,g=(s=t.recursive)!=null?s:this.spec.recursive,f=t.originalValue!=null?t.originalValue:e;super._validate(e,t,(h,p)=>{if(h){if(!TYe.default.isError(h)||u)return void i(h,p);o.push(h)}if(!g||!c||!this._typeCheck(p)){i(o[0]||null,p);return}f=f||p;let C=new Array(p.length);for(let y=0;y<p.length;y++){let B=p[y],v=`${t.path||\"\"}[${y}]`,D=yQ({},t,{path:v,strict:!0,parent:p,index:y,originalValue:f[y]});C[y]=(T,H)=>c.validate(B,D,H)}(0,NYe.default)({sync:a,path:l,value:p,errors:o,endEarly:u,tests:C},i)})}clone(e){let t=super.clone(e);return t.innerType=this.innerType,t}concat(e){let t=super.concat(e);return t.innerType=this.innerType,e.innerType&&(t.innerType=t.innerType?t.innerType.concat(e.innerType):e.innerType),t}of(e){let t=this.clone();if(!(0,RYe.default)(e))throw new TypeError(\"`array.of()` sub-schema must be a valid yup schema not: \"+(0,FYe.default)(e));return t.innerType=e,t}length(e,t=jT.array.length){return this.test({message:t,name:\"length\",exclusive:!0,params:{length:e},test(i){return(0,YT.default)(i)||i.length===this.resolve(e)}})}min(e,t){return t=t||jT.array.min,this.test({message:t,name:\"min\",exclusive:!0,params:{min:e},test(i){return(0,YT.default)(i)||i.length>=this.resolve(e)}})}max(e,t){return t=t||jT.array.max,this.test({message:t,name:\"max\",exclusive:!0,params:{max:e},test(i){return(0,YT.default)(i)||i.length<=this.resolve(e)}})}ensure(){return this.default(()=>[]).transform((e,t)=>this._typeCheck(e)?e:t==null?[]:[].concat(t))}compact(e){let t=e?(i,n,s)=>!e(i,n,s):i=>!!i;return this.transform(i=>i!=null?i.filter(t):i)}describe(){let e=super.describe();return this.innerType&&(e.innerType=this.innerType.describe()),e}nullable(e=!0){return super.nullable(e)}defined(){return super.defined()}required(e){return super.required(e)}};km.default=Dm;Nie.prototype=Dm.prototype});var Lie=w(Rm=>{\"use strict\";Object.defineProperty(Rm,\"__esModule\",{value:!0});Rm.create=KYe;Rm.default=void 0;var OYe=MYe(xh());function MYe(r){return r&&r.__esModule?r:{default:r}}function KYe(r){return new wQ(r)}var wQ=class{constructor(e){this.type=\"lazy\",this.__isYupSchema__=!0,this._resolve=(t,i={})=>{let n=this.builder(t,i);if(!(0,OYe.default)(n))throw new TypeError(\"lazy() functions must return a valid schema\");return n.resolve(i)},this.builder=e}resolve(e){return this._resolve(e.value,e)}cast(e,t){return this._resolve(e,t).cast(e,t)}validate(e,t,i){return this._resolve(e,t).validate(e,t,i)}validateSync(e,t){return this._resolve(e,t).validateSync(e,t)}validateAt(e,t,i){return this._resolve(t,i).validateAt(e,t,i)}validateSyncAt(e,t,i){return this._resolve(t,i).validateSyncAt(e,t,i)}describe(){return null}isValid(e,t){return this._resolve(e,t).isValid(e,t)}isValidSync(e,t){return this._resolve(e,t).isValidSync(e,t)}},UYe=wQ;Rm.default=UYe});var Oie=w(qT=>{\"use strict\";Object.defineProperty(qT,\"__esModule\",{value:!0});qT.default=YYe;var HYe=GYe(nA());function GYe(r){return r&&r.__esModule?r:{default:r}}function YYe(r){Object.keys(r).forEach(e=>{Object.keys(r[e]).forEach(t=>{HYe.default[e][t]=r[e][t]})})}});var WT=w(yr=>{\"use strict\";Object.defineProperty(yr,\"__esModule\",{value:!0});yr.addMethod=XYe;Object.defineProperty(yr,\"MixedSchema\",{enumerable:!0,get:function(){return Mie.default}});Object.defineProperty(yr,\"mixed\",{enumerable:!0,get:function(){return Mie.create}});Object.defineProperty(yr,\"BooleanSchema\",{enumerable:!0,get:function(){return JT.default}});Object.defineProperty(yr,\"bool\",{enumerable:!0,get:function(){return JT.create}});Object.defineProperty(yr,\"boolean\",{enumerable:!0,get:function(){return JT.create}});Object.defineProperty(yr,\"StringSchema\",{enumerable:!0,get:function(){return Kie.default}});Object.defineProperty(yr,\"string\",{enumerable:!0,get:function(){return Kie.create}});Object.defineProperty(yr,\"NumberSchema\",{enumerable:!0,get:function(){return Uie.default}});Object.defineProperty(yr,\"number\",{enumerable:!0,get:function(){return Uie.create}});Object.defineProperty(yr,\"DateSchema\",{enumerable:!0,get:function(){return Hie.default}});Object.defineProperty(yr,\"date\",{enumerable:!0,get:function(){return Hie.create}});Object.defineProperty(yr,\"ObjectSchema\",{enumerable:!0,get:function(){return Gie.default}});Object.defineProperty(yr,\"object\",{enumerable:!0,get:function(){return Gie.create}});Object.defineProperty(yr,\"ArraySchema\",{enumerable:!0,get:function(){return Yie.default}});Object.defineProperty(yr,\"array\",{enumerable:!0,get:function(){return Yie.create}});Object.defineProperty(yr,\"ref\",{enumerable:!0,get:function(){return jYe.create}});Object.defineProperty(yr,\"lazy\",{enumerable:!0,get:function(){return qYe.create}});Object.defineProperty(yr,\"ValidationError\",{enumerable:!0,get:function(){return JYe.default}});Object.defineProperty(yr,\"reach\",{enumerable:!0,get:function(){return WYe.default}});Object.defineProperty(yr,\"isSchema\",{enumerable:!0,get:function(){return jie.default}});Object.defineProperty(yr,\"setLocale\",{enumerable:!0,get:function(){return zYe.default}});Object.defineProperty(yr,\"BaseSchema\",{enumerable:!0,get:function(){return VYe.default}});var Mie=nu(Ire()),JT=nu(bre()),Kie=nu(xre()),Uie=nu(kre()),Hie=nu(Tre()),Gie=nu(Fie()),Yie=nu(Tie()),jYe=tu(),qYe=Lie(),JYe=Fm(_c()),WYe=Fm(FT()),jie=Fm(xh()),zYe=Fm(Oie()),VYe=Fm(oA());function Fm(r){return r&&r.__esModule?r:{default:r}}function qie(){if(typeof WeakMap!=\"function\")return null;var r=new WeakMap;return qie=function(){return r},r}function nu(r){if(r&&r.__esModule)return r;if(r===null||typeof r!=\"object\"&&typeof r!=\"function\")return{default:r};var e=qie();if(e&&e.has(r))return e.get(r);var t={},i=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var n in r)if(Object.prototype.hasOwnProperty.call(r,n)){var s=i?Object.getOwnPropertyDescriptor(r,n):null;s&&(s.get||s.set)?Object.defineProperty(t,n,s):t[n]=r[n]}return t.default=r,e&&e.set(r,t),t}function XYe(r,e,t){if(!r||!(0,jie.default)(r.prototype))throw new TypeError(\"You must provide a yup schema constructor function\");if(typeof e!=\"string\")throw new TypeError(\"A Method name must be provided\");if(typeof t!=\"function\")throw new TypeError(\"Method function must be provided\");r.prototype[e]=t}});var Xie=w((Egt,Tm)=>{\"use strict\";var $Ye=process.env.TERM_PROGRAM===\"Hyper\",eje=process.platform===\"win32\",Wie=process.platform===\"linux\",zT={ballotDisabled:\"\\u2612\",ballotOff:\"\\u2610\",ballotOn:\"\\u2611\",bullet:\"\\u2022\",bulletWhite:\"\\u25E6\",fullBlock:\"\\u2588\",heart:\"\\u2764\",identicalTo:\"\\u2261\",line:\"\\u2500\",mark:\"\\u203B\",middot:\"\\xB7\",minus:\"\\uFF0D\",multiplication:\"\\xD7\",obelus:\"\\xF7\",pencilDownRight:\"\\u270E\",pencilRight:\"\\u270F\",pencilUpRight:\"\\u2710\",percent:\"%\",pilcrow2:\"\\u2761\",pilcrow:\"\\xB6\",plusMinus:\"\\xB1\",section:\"\\xA7\",starsOff:\"\\u2606\",starsOn:\"\\u2605\",upDownArrow:\"\\u2195\"},zie=Object.assign({},zT,{check:\"\\u221A\",cross:\"\\xD7\",ellipsisLarge:\"...\",ellipsis:\"...\",info:\"i\",question:\"?\",questionSmall:\"?\",pointer:\">\",pointerSmall:\"\\xBB\",radioOff:\"( )\",radioOn:\"(*)\",warning:\"\\u203C\"}),Vie=Object.assign({},zT,{ballotCross:\"\\u2718\",check:\"\\u2714\",cross:\"\\u2716\",ellipsisLarge:\"\\u22EF\",ellipsis:\"\\u2026\",info:\"\\u2139\",question:\"?\",questionFull:\"\\uFF1F\",questionSmall:\"\\uFE56\",pointer:Wie?\"\\u25B8\":\"\\u276F\",pointerSmall:Wie?\"\\u2023\":\"\\u203A\",radioOff:\"\\u25EF\",radioOn:\"\\u25C9\",warning:\"\\u26A0\"});Tm.exports=eje&&!$Ye?zie:Vie;Reflect.defineProperty(Tm.exports,\"common\",{enumerable:!1,value:zT});Reflect.defineProperty(Tm.exports,\"windows\",{enumerable:!1,value:zie});Reflect.defineProperty(Tm.exports,\"other\",{enumerable:!1,value:Vie})});var uo=w((Igt,VT)=>{\"use strict\";var tje=r=>r!==null&&typeof r==\"object\"&&!Array.isArray(r),rje=/[\\u001b\\u009b][[\\]#;?()]*(?:(?:(?:[^\\W_]*;?[^\\W_]*)\\u0007)|(?:(?:[0-9]{1,4}(;[0-9]{0,4})*)?[~0-9=<>cf-nqrtyA-PRZ]))/g,Zie=()=>{let r={enabled:!0,visible:!0,styles:{},keys:{}};\"FORCE_COLOR\"in process.env&&(r.enabled=process.env.FORCE_COLOR!==\"0\");let e=s=>{let o=s.open=`\\x1B[${s.codes[0]}m`,a=s.close=`\\x1B[${s.codes[1]}m`,l=s.regex=new RegExp(`\\\\u001b\\\\[${s.codes[1]}m`,\"g\");return s.wrap=(c,u)=>{c.includes(a)&&(c=c.replace(l,a+o));let g=o+c+a;return u?g.replace(/\\r*\\n/g,`${a}$&${o}`):g},s},t=(s,o,a)=>typeof s==\"function\"?s(o):s.wrap(o,a),i=(s,o)=>{if(s===\"\"||s==null)return\"\";if(r.enabled===!1)return s;if(r.visible===!1)return\"\";let a=\"\"+s,l=a.includes(`\n`),c=o.length;for(c>0&&o.includes(\"unstyle\")&&(o=[...new Set([\"unstyle\",...o])].reverse());c-- >0;)a=t(r.styles[o[c]],a,l);return a},n=(s,o,a)=>{r.styles[s]=e({name:s,codes:o}),(r.keys[a]||(r.keys[a]=[])).push(s),Reflect.defineProperty(r,s,{configurable:!0,enumerable:!0,set(c){r.alias(s,c)},get(){let c=u=>i(u,c.stack);return Reflect.setPrototypeOf(c,r),c.stack=this.stack?this.stack.concat(s):[s],c}})};return n(\"reset\",[0,0],\"modifier\"),n(\"bold\",[1,22],\"modifier\"),n(\"dim\",[2,22],\"modifier\"),n(\"italic\",[3,23],\"modifier\"),n(\"underline\",[4,24],\"modifier\"),n(\"inverse\",[7,27],\"modifier\"),n(\"hidden\",[8,28],\"modifier\"),n(\"strikethrough\",[9,29],\"modifier\"),n(\"black\",[30,39],\"color\"),n(\"red\",[31,39],\"color\"),n(\"green\",[32,39],\"color\"),n(\"yellow\",[33,39],\"color\"),n(\"blue\",[34,39],\"color\"),n(\"magenta\",[35,39],\"color\"),n(\"cyan\",[36,39],\"color\"),n(\"white\",[37,39],\"color\"),n(\"gray\",[90,39],\"color\"),n(\"grey\",[90,39],\"color\"),n(\"bgBlack\",[40,49],\"bg\"),n(\"bgRed\",[41,49],\"bg\"),n(\"bgGreen\",[42,49],\"bg\"),n(\"bgYellow\",[43,49],\"bg\"),n(\"bgBlue\",[44,49],\"bg\"),n(\"bgMagenta\",[45,49],\"bg\"),n(\"bgCyan\",[46,49],\"bg\"),n(\"bgWhite\",[47,49],\"bg\"),n(\"blackBright\",[90,39],\"bright\"),n(\"redBright\",[91,39],\"bright\"),n(\"greenBright\",[92,39],\"bright\"),n(\"yellowBright\",[93,39],\"bright\"),n(\"blueBright\",[94,39],\"bright\"),n(\"magentaBright\",[95,39],\"bright\"),n(\"cyanBright\",[96,39],\"bright\"),n(\"whiteBright\",[97,39],\"bright\"),n(\"bgBlackBright\",[100,49],\"bgBright\"),n(\"bgRedBright\",[101,49],\"bgBright\"),n(\"bgGreenBright\",[102,49],\"bgBright\"),n(\"bgYellowBright\",[103,49],\"bgBright\"),n(\"bgBlueBright\",[104,49],\"bgBright\"),n(\"bgMagentaBright\",[105,49],\"bgBright\"),n(\"bgCyanBright\",[106,49],\"bgBright\"),n(\"bgWhiteBright\",[107,49],\"bgBright\"),r.ansiRegex=rje,r.hasColor=r.hasAnsi=s=>(r.ansiRegex.lastIndex=0,typeof s==\"string\"&&s!==\"\"&&r.ansiRegex.test(s)),r.alias=(s,o)=>{let a=typeof o==\"string\"?r[o]:o;if(typeof a!=\"function\")throw new TypeError(\"Expected alias to be the name of an existing color (string) or a function\");a.stack||(Reflect.defineProperty(a,\"name\",{value:s}),r.styles[s]=a,a.stack=[s]),Reflect.defineProperty(r,s,{configurable:!0,enumerable:!0,set(l){r.alias(s,l)},get(){let l=c=>i(c,l.stack);return Reflect.setPrototypeOf(l,r),l.stack=this.stack?this.stack.concat(a.stack):a.stack,l}})},r.theme=s=>{if(!tje(s))throw new TypeError(\"Expected theme to be an object\");for(let o of Object.keys(s))r.alias(o,s[o]);return r},r.alias(\"unstyle\",s=>typeof s==\"string\"&&s!==\"\"?(r.ansiRegex.lastIndex=0,s.replace(r.ansiRegex,\"\")):\"\"),r.alias(\"noop\",s=>s),r.none=r.clear=r.noop,r.stripColor=r.unstyle,r.symbols=Xie(),r.define=n,r};VT.exports=Zie();VT.exports.create=Zie});var ji=w(Tt=>{\"use strict\";var ije=Object.prototype.toString,Ns=uo(),_ie=!1,XT=[],$ie={yellow:\"blue\",cyan:\"red\",green:\"magenta\",black:\"white\",blue:\"yellow\",red:\"cyan\",magenta:\"green\",white:\"black\"};Tt.longest=(r,e)=>r.reduce((t,i)=>Math.max(t,e?i[e].length:i.length),0);Tt.hasColor=r=>!!r&&Ns.hasColor(r);var QQ=Tt.isObject=r=>r!==null&&typeof r==\"object\"&&!Array.isArray(r);Tt.nativeType=r=>ije.call(r).slice(8,-1).toLowerCase().replace(/\\s/g,\"\");Tt.isAsyncFn=r=>Tt.nativeType(r)===\"asyncfunction\";Tt.isPrimitive=r=>r!=null&&typeof r!=\"object\"&&typeof r!=\"function\";Tt.resolve=(r,e,...t)=>typeof e==\"function\"?e.call(r,...t):e;Tt.scrollDown=(r=[])=>[...r.slice(1),r[0]];Tt.scrollUp=(r=[])=>[r.pop(),...r];Tt.reorder=(r=[])=>{let e=r.slice();return e.sort((t,i)=>t.index>i.index?1:t.index<i.index?-1:0),e};Tt.swap=(r,e,t)=>{let i=r.length,n=t===i?0:t<0?i-1:t,s=r[e];r[e]=r[n],r[n]=s};Tt.width=(r,e=80)=>{let t=r&&r.columns?r.columns:e;return r&&typeof r.getWindowSize==\"function\"&&(t=r.getWindowSize()[0]),process.platform===\"win32\"?t-1:t};Tt.height=(r,e=20)=>{let t=r&&r.rows?r.rows:e;return r&&typeof r.getWindowSize==\"function\"&&(t=r.getWindowSize()[1]),t};Tt.wordWrap=(r,e={})=>{if(!r)return r;typeof e==\"number\"&&(e={width:e});let{indent:t=\"\",newline:i=`\n`+t,width:n=80}=e,s=(i+t).match(/[^\\S\\n]/g)||[];n-=s.length;let o=`.{1,${n}}([\\\\s\\\\u200B]+|$)|[^\\\\s\\\\u200B]+?([\\\\s\\\\u200B]+|$)`,a=r.trim(),l=new RegExp(o,\"g\"),c=a.match(l)||[];return c=c.map(u=>u.replace(/\\n$/,\"\")),e.padEnd&&(c=c.map(u=>u.padEnd(n,\" \"))),e.padStart&&(c=c.map(u=>u.padStart(n,\" \"))),t+c.join(i)};Tt.unmute=r=>{let e=r.stack.find(i=>Ns.keys.color.includes(i));return e?Ns[e]:r.stack.find(i=>i.slice(2)===\"bg\")?Ns[e.slice(2)]:i=>i};Tt.pascal=r=>r?r[0].toUpperCase()+r.slice(1):\"\";Tt.inverse=r=>{if(!r||!r.stack)return r;let e=r.stack.find(i=>Ns.keys.color.includes(i));if(e){let i=Ns[\"bg\"+Tt.pascal(e)];return i?i.black:r}let t=r.stack.find(i=>i.slice(0,2)===\"bg\");return t?Ns[t.slice(2).toLowerCase()]||r:Ns.none};Tt.complement=r=>{if(!r||!r.stack)return r;let e=r.stack.find(i=>Ns.keys.color.includes(i)),t=r.stack.find(i=>i.slice(0,2)===\"bg\");if(e&&!t)return Ns[$ie[e]||e];if(t){let i=t.slice(2).toLowerCase(),n=$ie[i];return n&&Ns[\"bg\"+Tt.pascal(n)]||r}return Ns.none};Tt.meridiem=r=>{let e=r.getHours(),t=r.getMinutes(),i=e>=12?\"pm\":\"am\";e=e%12;let n=e===0?12:e,s=t<10?\"0\"+t:t;return n+\":\"+s+\" \"+i};Tt.set=(r={},e=\"\",t)=>e.split(\".\").reduce((i,n,s,o)=>{let a=o.length-1>s?i[n]||{}:t;return!Tt.isObject(a)&&s<o.length-1&&(a={}),i[n]=a},r);Tt.get=(r={},e=\"\",t)=>{let i=r[e]==null?e.split(\".\").reduce((n,s)=>n&&n[s],r):r[e];return i==null?t:i};Tt.mixin=(r,e)=>{if(!QQ(r))return e;if(!QQ(e))return r;for(let t of Object.keys(e)){let i=Object.getOwnPropertyDescriptor(e,t);if(i.hasOwnProperty(\"value\"))if(r.hasOwnProperty(t)&&QQ(i.value)){let n=Object.getOwnPropertyDescriptor(r,t);QQ(n.value)?r[t]=Tt.merge({},r[t],e[t]):Reflect.defineProperty(r,t,i)}else Reflect.defineProperty(r,t,i);else Reflect.defineProperty(r,t,i)}return r};Tt.merge=(...r)=>{let e={};for(let t of r)Tt.mixin(e,t);return e};Tt.mixinEmitter=(r,e)=>{let t=e.constructor.prototype;for(let i of Object.keys(t)){let n=t[i];typeof n==\"function\"?Tt.define(r,i,n.bind(e)):Tt.define(r,i,n)}};Tt.onExit=r=>{let e=(t,i)=>{_ie||(_ie=!0,XT.forEach(n=>n()),t===!0&&process.exit(128+i))};XT.length===0&&(process.once(\"SIGTERM\",e.bind(null,!0,15)),process.once(\"SIGINT\",e.bind(null,!0,2)),process.once(\"exit\",e)),XT.push(r)};Tt.define=(r,e,t)=>{Reflect.defineProperty(r,e,{value:t})};Tt.defineExport=(r,e,t)=>{let i;Reflect.defineProperty(r,e,{enumerable:!0,configurable:!0,set(n){i=n},get(){return i?i():t()}})}});var ene=w(Gh=>{\"use strict\";Gh.ctrl={a:\"first\",b:\"backward\",c:\"cancel\",d:\"deleteForward\",e:\"last\",f:\"forward\",g:\"reset\",i:\"tab\",k:\"cutForward\",l:\"reset\",n:\"newItem\",m:\"cancel\",j:\"submit\",p:\"search\",r:\"remove\",s:\"save\",u:\"undo\",w:\"cutLeft\",x:\"toggleCursor\",v:\"paste\"};Gh.shift={up:\"shiftUp\",down:\"shiftDown\",left:\"shiftLeft\",right:\"shiftRight\",tab:\"prev\"};Gh.fn={up:\"pageUp\",down:\"pageDown\",left:\"pageLeft\",right:\"pageRight\",delete:\"deleteForward\"};Gh.option={b:\"backward\",f:\"forward\",d:\"cutRight\",left:\"cutLeft\",up:\"altUp\",down:\"altDown\"};Gh.keys={pageup:\"pageUp\",pagedown:\"pageDown\",home:\"home\",end:\"end\",cancel:\"cancel\",delete:\"deleteForward\",backspace:\"delete\",down:\"down\",enter:\"submit\",escape:\"cancel\",left:\"left\",space:\"space\",number:\"number\",return:\"submit\",right:\"right\",tab:\"next\",up:\"up\"}});var ine=w((Bgt,rne)=>{\"use strict\";var tne=J(\"readline\"),nje=ene(),sje=/^(?:\\x1b)([a-zA-Z0-9])$/,oje=/^(?:\\x1b+)(O|N|\\[|\\[\\[)(?:(\\d+)(?:;(\\d+))?([~^$])|(?:1;)?(\\d+)?([a-zA-Z]))/,aje={OP:\"f1\",OQ:\"f2\",OR:\"f3\",OS:\"f4\",\"[11~\":\"f1\",\"[12~\":\"f2\",\"[13~\":\"f3\",\"[14~\":\"f4\",\"[[A\":\"f1\",\"[[B\":\"f2\",\"[[C\":\"f3\",\"[[D\":\"f4\",\"[[E\":\"f5\",\"[15~\":\"f5\",\"[17~\":\"f6\",\"[18~\":\"f7\",\"[19~\":\"f8\",\"[20~\":\"f9\",\"[21~\":\"f10\",\"[23~\":\"f11\",\"[24~\":\"f12\",\"[A\":\"up\",\"[B\":\"down\",\"[C\":\"right\",\"[D\":\"left\",\"[E\":\"clear\",\"[F\":\"end\",\"[H\":\"home\",OA:\"up\",OB:\"down\",OC:\"right\",OD:\"left\",OE:\"clear\",OF:\"end\",OH:\"home\",\"[1~\":\"home\",\"[2~\":\"insert\",\"[3~\":\"delete\",\"[4~\":\"end\",\"[5~\":\"pageup\",\"[6~\":\"pagedown\",\"[[5~\":\"pageup\",\"[[6~\":\"pagedown\",\"[7~\":\"home\",\"[8~\":\"end\",\"[a\":\"up\",\"[b\":\"down\",\"[c\":\"right\",\"[d\":\"left\",\"[e\":\"clear\",\"[2$\":\"insert\",\"[3$\":\"delete\",\"[5$\":\"pageup\",\"[6$\":\"pagedown\",\"[7$\":\"home\",\"[8$\":\"end\",Oa:\"up\",Ob:\"down\",Oc:\"right\",Od:\"left\",Oe:\"clear\",\"[2^\":\"insert\",\"[3^\":\"delete\",\"[5^\":\"pageup\",\"[6^\":\"pagedown\",\"[7^\":\"home\",\"[8^\":\"end\",\"[Z\":\"tab\"};function Aje(r){return[\"[a\",\"[b\",\"[c\",\"[d\",\"[e\",\"[2$\",\"[3$\",\"[5$\",\"[6$\",\"[7$\",\"[8$\",\"[Z\"].includes(r)}function lje(r){return[\"Oa\",\"Ob\",\"Oc\",\"Od\",\"Oe\",\"[2^\",\"[3^\",\"[5^\",\"[6^\",\"[7^\",\"[8^\"].includes(r)}var bQ=(r=\"\",e={})=>{let t,i={name:e.name,ctrl:!1,meta:!1,shift:!1,option:!1,sequence:r,raw:r,...e};if(Buffer.isBuffer(r)?r[0]>127&&r[1]===void 0?(r[0]-=128,r=\"\\x1B\"+String(r)):r=String(r):r!==void 0&&typeof r!=\"string\"?r=String(r):r||(r=i.sequence||\"\"),i.sequence=i.sequence||r||i.name,r===\"\\r\")i.raw=void 0,i.name=\"return\";else if(r===`\n`)i.name=\"enter\";else if(r===\"\t\")i.name=\"tab\";else if(r===\"\\b\"||r===\"\\x7F\"||r===\"\\x1B\\x7F\"||r===\"\\x1B\\b\")i.name=\"backspace\",i.meta=r.charAt(0)===\"\\x1B\";else if(r===\"\\x1B\"||r===\"\\x1B\\x1B\")i.name=\"escape\",i.meta=r.length===2;else if(r===\" \"||r===\"\\x1B \")i.name=\"space\",i.meta=r.length===2;else if(r<=\"\u001a\")i.name=String.fromCharCode(r.charCodeAt(0)+\"a\".charCodeAt(0)-1),i.ctrl=!0;else if(r.length===1&&r>=\"0\"&&r<=\"9\")i.name=\"number\";else if(r.length===1&&r>=\"a\"&&r<=\"z\")i.name=r;else if(r.length===1&&r>=\"A\"&&r<=\"Z\")i.name=r.toLowerCase(),i.shift=!0;else if(t=sje.exec(r))i.meta=!0,i.shift=/^[A-Z]$/.test(t[1]);else if(t=oje.exec(r)){let n=[...r];n[0]===\"\\x1B\"&&n[1]===\"\\x1B\"&&(i.option=!0);let s=[t[1],t[2],t[4],t[6]].filter(Boolean).join(\"\"),o=(t[3]||t[5]||1)-1;i.ctrl=!!(o&4),i.meta=!!(o&10),i.shift=!!(o&1),i.code=s,i.name=aje[s],i.shift=Aje(s)||i.shift,i.ctrl=lje(s)||i.ctrl}return i};bQ.listen=(r={},e)=>{let{stdin:t}=r;if(!t||t!==process.stdin&&!t.isTTY)throw new Error(\"Invalid stream passed\");let i=tne.createInterface({terminal:!0,input:t});tne.emitKeypressEvents(t,i);let n=(a,l)=>e(a,bQ(a,l),i),s=t.isRaw;return t.isTTY&&t.setRawMode(!0),t.on(\"keypress\",n),i.resume(),()=>{t.isTTY&&t.setRawMode(s),t.removeListener(\"keypress\",n),i.pause(),i.close()}};bQ.action=(r,e,t)=>{let i={...nje,...t};return e.ctrl?(e.action=i.ctrl[e.name],e):e.option&&i.option?(e.action=i.option[e.name],e):e.shift?(e.action=i.shift[e.name],e):(e.action=i.keys[e.name],e)};rne.exports=bQ});var sne=w((Qgt,nne)=>{\"use strict\";nne.exports=r=>{r.timers=r.timers||{};let e=r.options.timers;if(!!e)for(let t of Object.keys(e)){let i=e[t];typeof i==\"number\"&&(i={interval:i}),cje(r,t,i)}};function cje(r,e,t={}){let i=r.timers[e]={name:e,start:Date.now(),ms:0,tick:0},n=t.interval||120;i.frames=t.frames||[],i.loading=!0;let s=setInterval(()=>{i.ms=Date.now()-i.start,i.tick++,r.render()},n);return i.stop=()=>{i.loading=!1,clearInterval(s)},Reflect.defineProperty(i,\"interval\",{value:s}),r.once(\"close\",()=>i.stop()),i.stop}});var ane=w((bgt,one)=>{\"use strict\";var{define:uje,width:gje}=ji(),ZT=class{constructor(e){let t=e.options;uje(this,\"_prompt\",e),this.type=e.type,this.name=e.name,this.message=\"\",this.header=\"\",this.footer=\"\",this.error=\"\",this.hint=\"\",this.input=\"\",this.cursor=0,this.index=0,this.lines=0,this.tick=0,this.prompt=\"\",this.buffer=\"\",this.width=gje(t.stdout||process.stdout),Object.assign(this,t),this.name=this.name||this.message,this.message=this.message||this.name,this.symbols=e.symbols,this.styles=e.styles,this.required=new Set,this.cancelled=!1,this.submitted=!1}clone(){let e={...this};return e.status=this.status,e.buffer=Buffer.from(e.buffer),delete e.clone,e}set color(e){this._color=e}get color(){let e=this.prompt.styles;if(this.cancelled)return e.cancelled;if(this.submitted)return e.submitted;let t=this._color||e[this.status];return typeof t==\"function\"?t:e.pending}set loading(e){this._loading=e}get loading(){return typeof this._loading==\"boolean\"?this._loading:this.loadingChoices?\"choices\":!1}get status(){return this.cancelled?\"cancelled\":this.submitted?\"submitted\":\"pending\"}};one.exports=ZT});var lne=w((Sgt,Ane)=>{\"use strict\";var _T=ji(),Di=uo(),$T={default:Di.noop,noop:Di.noop,set inverse(r){this._inverse=r},get inverse(){return this._inverse||_T.inverse(this.primary)},set complement(r){this._complement=r},get complement(){return this._complement||_T.complement(this.primary)},primary:Di.cyan,success:Di.green,danger:Di.magenta,strong:Di.bold,warning:Di.yellow,muted:Di.dim,disabled:Di.gray,dark:Di.dim.gray,underline:Di.underline,set info(r){this._info=r},get info(){return this._info||this.primary},set em(r){this._em=r},get em(){return this._em||this.primary.underline},set heading(r){this._heading=r},get heading(){return this._heading||this.muted.underline},set pending(r){this._pending=r},get pending(){return this._pending||this.primary},set submitted(r){this._submitted=r},get submitted(){return this._submitted||this.success},set cancelled(r){this._cancelled=r},get cancelled(){return this._cancelled||this.danger},set typing(r){this._typing=r},get typing(){return this._typing||this.dim},set placeholder(r){this._placeholder=r},get placeholder(){return this._placeholder||this.primary.dim},set highlight(r){this._highlight=r},get highlight(){return this._highlight||this.inverse}};$T.merge=(r={})=>{r.styles&&typeof r.styles.enabled==\"boolean\"&&(Di.enabled=r.styles.enabled),r.styles&&typeof r.styles.visible==\"boolean\"&&(Di.visible=r.styles.visible);let e=_T.merge({},$T,r.styles);delete e.merge;for(let t of Object.keys(Di))e.hasOwnProperty(t)||Reflect.defineProperty(e,t,{get:()=>Di[t]});for(let t of Object.keys(Di.styles))e.hasOwnProperty(t)||Reflect.defineProperty(e,t,{get:()=>Di[t]});return e};Ane.exports=$T});var une=w((vgt,cne)=>{\"use strict\";var eL=process.platform===\"win32\",AA=uo(),fje=ji(),tL={...AA.symbols,upDownDoubleArrow:\"\\u21D5\",upDownDoubleArrow2:\"\\u2B0D\",upDownArrow:\"\\u2195\",asterisk:\"*\",asterism:\"\\u2042\",bulletWhite:\"\\u25E6\",electricArrow:\"\\u2301\",ellipsisLarge:\"\\u22EF\",ellipsisSmall:\"\\u2026\",fullBlock:\"\\u2588\",identicalTo:\"\\u2261\",indicator:AA.symbols.check,leftAngle:\"\\u2039\",mark:\"\\u203B\",minus:\"\\u2212\",multiplication:\"\\xD7\",obelus:\"\\xF7\",percent:\"%\",pilcrow:\"\\xB6\",pilcrow2:\"\\u2761\",pencilUpRight:\"\\u2710\",pencilDownRight:\"\\u270E\",pencilRight:\"\\u270F\",plus:\"+\",plusMinus:\"\\xB1\",pointRight:\"\\u261E\",rightAngle:\"\\u203A\",section:\"\\xA7\",hexagon:{off:\"\\u2B21\",on:\"\\u2B22\",disabled:\"\\u2B22\"},ballot:{on:\"\\u2611\",off:\"\\u2610\",disabled:\"\\u2612\"},stars:{on:\"\\u2605\",off:\"\\u2606\",disabled:\"\\u2606\"},folder:{on:\"\\u25BC\",off:\"\\u25B6\",disabled:\"\\u25B6\"},prefix:{pending:AA.symbols.question,submitted:AA.symbols.check,cancelled:AA.symbols.cross},separator:{pending:AA.symbols.pointerSmall,submitted:AA.symbols.middot,cancelled:AA.symbols.middot},radio:{off:eL?\"( )\":\"\\u25EF\",on:eL?\"(*)\":\"\\u25C9\",disabled:eL?\"(|)\":\"\\u24BE\"},numbers:[\"\\u24EA\",\"\\u2460\",\"\\u2461\",\"\\u2462\",\"\\u2463\",\"\\u2464\",\"\\u2465\",\"\\u2466\",\"\\u2467\",\"\\u2468\",\"\\u2469\",\"\\u246A\",\"\\u246B\",\"\\u246C\",\"\\u246D\",\"\\u246E\",\"\\u246F\",\"\\u2470\",\"\\u2471\",\"\\u2472\",\"\\u2473\",\"\\u3251\",\"\\u3252\",\"\\u3253\",\"\\u3254\",\"\\u3255\",\"\\u3256\",\"\\u3257\",\"\\u3258\",\"\\u3259\",\"\\u325A\",\"\\u325B\",\"\\u325C\",\"\\u325D\",\"\\u325E\",\"\\u325F\",\"\\u32B1\",\"\\u32B2\",\"\\u32B3\",\"\\u32B4\",\"\\u32B5\",\"\\u32B6\",\"\\u32B7\",\"\\u32B8\",\"\\u32B9\",\"\\u32BA\",\"\\u32BB\",\"\\u32BC\",\"\\u32BD\",\"\\u32BE\",\"\\u32BF\"]};tL.merge=r=>{let e=fje.merge({},AA.symbols,tL,r.symbols);return delete e.merge,e};cne.exports=tL});var fne=w((xgt,gne)=>{\"use strict\";var hje=lne(),pje=une(),dje=ji();gne.exports=r=>{r.options=dje.merge({},r.options.theme,r.options),r.symbols=pje.merge(r.options),r.styles=hje.merge(r.options)}});var mne=w((dne,Cne)=>{\"use strict\";var hne=process.env.TERM_PROGRAM===\"Apple_Terminal\",Cje=uo(),rL=ji(),go=Cne.exports=dne,Dr=\"\\x1B[\",pne=\"\\x07\",iL=!1,dl=go.code={bell:pne,beep:pne,beginning:`${Dr}G`,down:`${Dr}J`,esc:Dr,getPosition:`${Dr}6n`,hide:`${Dr}?25l`,line:`${Dr}2K`,lineEnd:`${Dr}K`,lineStart:`${Dr}1K`,restorePosition:Dr+(hne?\"8\":\"u\"),savePosition:Dr+(hne?\"7\":\"s\"),screen:`${Dr}2J`,show:`${Dr}?25h`,up:`${Dr}1J`},su=go.cursor={get hidden(){return iL},hide(){return iL=!0,dl.hide},show(){return iL=!1,dl.show},forward:(r=1)=>`${Dr}${r}C`,backward:(r=1)=>`${Dr}${r}D`,nextLine:(r=1)=>`${Dr}E`.repeat(r),prevLine:(r=1)=>`${Dr}F`.repeat(r),up:(r=1)=>r?`${Dr}${r}A`:\"\",down:(r=1)=>r?`${Dr}${r}B`:\"\",right:(r=1)=>r?`${Dr}${r}C`:\"\",left:(r=1)=>r?`${Dr}${r}D`:\"\",to(r,e){return e?`${Dr}${e+1};${r+1}H`:`${Dr}${r+1}G`},move(r=0,e=0){let t=\"\";return t+=r<0?su.left(-r):r>0?su.right(r):\"\",t+=e<0?su.up(-e):e>0?su.down(e):\"\",t},restore(r={}){let{after:e,cursor:t,initial:i,input:n,prompt:s,size:o,value:a}=r;if(i=rL.isPrimitive(i)?String(i):\"\",n=rL.isPrimitive(n)?String(n):\"\",a=rL.isPrimitive(a)?String(a):\"\",o){let l=go.cursor.up(o)+go.cursor.to(s.length),c=n.length-t;return c>0&&(l+=go.cursor.left(c)),l}if(a||e){let l=!n&&!!i?-i.length:-n.length+t;return e&&(l-=e.length),n===\"\"&&i&&!s.includes(i)&&(l+=i.length),go.cursor.move(l)}}},nL=go.erase={screen:dl.screen,up:dl.up,down:dl.down,line:dl.line,lineEnd:dl.lineEnd,lineStart:dl.lineStart,lines(r){let e=\"\";for(let t=0;t<r;t++)e+=go.erase.line+(t<r-1?go.cursor.up(1):\"\");return r&&(e+=go.code.beginning),e}};go.clear=(r=\"\",e=process.stdout.columns)=>{if(!e)return nL.line+su.to(0);let t=s=>[...Cje.unstyle(s)].length,i=r.split(/\\r?\\n/),n=0;for(let s of i)n+=1+Math.floor(Math.max(t(s)-1,0)/e);return(nL.line+su.prevLine()).repeat(n-1)+nL.line+su.to(0)}});var Yh=w((Pgt,Ine)=>{\"use strict\";var mje=J(\"events\"),Ene=uo(),sL=ine(),Eje=sne(),Ije=ane(),yje=fne(),kn=ji(),ou=mne(),Lm=class extends mje{constructor(e={}){super(),this.name=e.name,this.type=e.type,this.options=e,yje(this),Eje(this),this.state=new Ije(this),this.initial=[e.initial,e.default].find(t=>t!=null),this.stdout=e.stdout||process.stdout,this.stdin=e.stdin||process.stdin,this.scale=e.scale||1,this.term=this.options.term||process.env.TERM_PROGRAM,this.margin=Bje(this.options.margin),this.setMaxListeners(0),wje(this)}async keypress(e,t={}){this.keypressed=!0;let i=sL.action(e,sL(e,t),this.options.actions);this.state.keypress=i,this.emit(\"keypress\",e,i),this.emit(\"state\",this.state.clone());let n=this.options[i.action]||this[i.action]||this.dispatch;if(typeof n==\"function\")return await n.call(this,e,i);this.alert()}alert(){delete this.state.alert,this.options.show===!1?this.emit(\"alert\"):this.stdout.write(ou.code.beep)}cursorHide(){this.stdout.write(ou.cursor.hide()),kn.onExit(()=>this.cursorShow())}cursorShow(){this.stdout.write(ou.cursor.show())}write(e){!e||(this.stdout&&this.state.show!==!1&&this.stdout.write(e),this.state.buffer+=e)}clear(e=0){let t=this.state.buffer;this.state.buffer=\"\",!(!t&&!e||this.options.show===!1)&&this.stdout.write(ou.cursor.down(e)+ou.clear(t,this.width))}restore(){if(this.state.closed||this.options.show===!1)return;let{prompt:e,after:t,rest:i}=this.sections(),{cursor:n,initial:s=\"\",input:o=\"\",value:a=\"\"}=this,l=this.state.size=i.length,c={after:t,cursor:n,initial:s,input:o,prompt:e,size:l,value:a},u=ou.cursor.restore(c);u&&this.stdout.write(u)}sections(){let{buffer:e,input:t,prompt:i}=this.state;i=Ene.unstyle(i);let n=Ene.unstyle(e),s=n.indexOf(i),o=n.slice(0,s),l=n.slice(s).split(`\n`),c=l[0],u=l[l.length-1],f=(i+(t?\" \"+t:\"\")).length,h=f<c.length?c.slice(f+1):\"\";return{header:o,prompt:c,after:h,rest:l.slice(1),last:u}}async submit(){this.state.submitted=!0,this.state.validating=!0,this.options.onSubmit&&await this.options.onSubmit.call(this,this.name,this.value,this);let e=this.state.error||await this.validate(this.value,this.state);if(e!==!0){let t=`\n`+this.symbols.pointer+\" \";typeof e==\"string\"?t+=e.trim():t+=\"Invalid input\",this.state.error=`\n`+this.styles.danger(t),this.state.submitted=!1,await this.render(),await this.alert(),this.state.validating=!1,this.state.error=void 0;return}this.state.validating=!1,await this.render(),await this.close(),this.value=await this.result(this.value),this.emit(\"submit\",this.value)}async cancel(e){this.state.cancelled=this.state.submitted=!0,await this.render(),await this.close(),typeof this.options.onCancel==\"function\"&&await this.options.onCancel.call(this,this.name,this.value,this),this.emit(\"cancel\",await this.error(e))}async close(){this.state.closed=!0;try{let e=this.sections(),t=Math.ceil(e.prompt.length/this.width);e.rest&&this.write(ou.cursor.down(e.rest.length)),this.write(`\n`.repeat(t))}catch{}this.emit(\"close\")}start(){!this.stop&&this.options.show!==!1&&(this.stop=sL.listen(this,this.keypress.bind(this)),this.once(\"close\",this.stop))}async skip(){return this.skipped=this.options.skip===!0,typeof this.options.skip==\"function\"&&(this.skipped=await this.options.skip.call(this,this.name,this.value)),this.skipped}async initialize(){let{format:e,options:t,result:i}=this;if(this.format=()=>e.call(this,this.value),this.result=()=>i.call(this,this.value),typeof t.initial==\"function\"&&(this.initial=await t.initial.call(this,this)),typeof t.onRun==\"function\"&&await t.onRun.call(this,this),typeof t.onSubmit==\"function\"){let n=t.onSubmit.bind(this),s=this.submit.bind(this);delete this.options.onSubmit,this.submit=async()=>(await n(this.name,this.value,this),s())}await this.start(),await this.render()}render(){throw new Error(\"expected prompt to have a custom render method\")}run(){return new Promise(async(e,t)=>{if(this.once(\"submit\",e),this.once(\"cancel\",t),await this.skip())return this.render=()=>{},this.submit();await this.initialize(),this.emit(\"run\")})}async element(e,t,i){let{options:n,state:s,symbols:o,timers:a}=this,l=a&&a[e];s.timer=l;let c=n[e]||s[e]||o[e],u=t&&t[e]!=null?t[e]:await c;if(u===\"\")return u;let g=await this.resolve(u,s,t,i);return!g&&t&&t[e]?this.resolve(c,s,t,i):g}async prefix(){let e=await this.element(\"prefix\")||this.symbols,t=this.timers&&this.timers.prefix,i=this.state;return i.timer=t,kn.isObject(e)&&(e=e[i.status]||e.pending),kn.hasColor(e)?e:(this.styles[i.status]||this.styles.pending)(e)}async message(){let e=await this.element(\"message\");return kn.hasColor(e)?e:this.styles.strong(e)}async separator(){let e=await this.element(\"separator\")||this.symbols,t=this.timers&&this.timers.separator,i=this.state;i.timer=t;let n=e[i.status]||e.pending||i.separator,s=await this.resolve(n,i);return kn.isObject(s)&&(s=s[i.status]||s.pending),kn.hasColor(s)?s:this.styles.muted(s)}async pointer(e,t){let i=await this.element(\"pointer\",e,t);if(typeof i==\"string\"&&kn.hasColor(i))return i;if(i){let n=this.styles,s=this.index===t,o=s?n.primary:c=>c,a=await this.resolve(i[s?\"on\":\"off\"]||i,this.state),l=kn.hasColor(a)?a:o(a);return s?l:\" \".repeat(a.length)}}async indicator(e,t){let i=await this.element(\"indicator\",e,t);if(typeof i==\"string\"&&kn.hasColor(i))return i;if(i){let n=this.styles,s=e.enabled===!0,o=s?n.success:n.dark,a=i[s?\"on\":\"off\"]||i;return kn.hasColor(a)?a:o(a)}return\"\"}body(){return null}footer(){if(this.state.status===\"pending\")return this.element(\"footer\")}header(){if(this.state.status===\"pending\")return this.element(\"header\")}async hint(){if(this.state.status===\"pending\"&&!this.isValue(this.state.input)){let e=await this.element(\"hint\");return kn.hasColor(e)?e:this.styles.muted(e)}}error(e){return this.state.submitted?\"\":e||this.state.error}format(e){return e}result(e){return e}validate(e){return this.options.required===!0?this.isValue(e):!0}isValue(e){return e!=null&&e!==\"\"}resolve(e,...t){return kn.resolve(this,e,...t)}get base(){return Lm.prototype}get style(){return this.styles[this.state.status]}get height(){return this.options.rows||kn.height(this.stdout,25)}get width(){return this.options.columns||kn.width(this.stdout,80)}get size(){return{width:this.width,height:this.height}}set cursor(e){this.state.cursor=e}get cursor(){return this.state.cursor}set input(e){this.state.input=e}get input(){return this.state.input}set value(e){this.state.value=e}get value(){let{input:e,value:t}=this.state,i=[t,e].find(this.isValue.bind(this));return this.isValue(i)?i:this.initial}static get prompt(){return e=>new this(e).run()}};function wje(r){let e=n=>r[n]===void 0||typeof r[n]==\"function\",t=[\"actions\",\"choices\",\"initial\",\"margin\",\"roles\",\"styles\",\"symbols\",\"theme\",\"timers\",\"value\"],i=[\"body\",\"footer\",\"error\",\"header\",\"hint\",\"indicator\",\"message\",\"prefix\",\"separator\",\"skip\"];for(let n of Object.keys(r.options)){if(t.includes(n)||/^on[A-Z]/.test(n))continue;let s=r.options[n];typeof s==\"function\"&&e(n)?i.includes(n)||(r[n]=s.bind(r)):typeof r[n]!=\"function\"&&(r[n]=s)}}function Bje(r){typeof r==\"number\"&&(r=[r,r,r,r]);let e=[].concat(r||[]),t=n=>n%2===0?`\n`:\" \",i=[];for(let n=0;n<4;n++){let s=t(n);e[n]?i.push(s.repeat(e[n])):i.push(\"\")}return i}Ine.exports=Lm});var Bne=w((Dgt,wne)=>{\"use strict\";var Qje=ji(),yne={default(r,e){return e},checkbox(r,e){throw new Error(\"checkbox role is not implemented yet\")},editable(r,e){throw new Error(\"editable role is not implemented yet\")},expandable(r,e){throw new Error(\"expandable role is not implemented yet\")},heading(r,e){return e.disabled=\"\",e.indicator=[e.indicator,\" \"].find(t=>t!=null),e.message=e.message||\"\",e},input(r,e){throw new Error(\"input role is not implemented yet\")},option(r,e){return yne.default(r,e)},radio(r,e){throw new Error(\"radio role is not implemented yet\")},separator(r,e){return e.disabled=\"\",e.indicator=[e.indicator,\" \"].find(t=>t!=null),e.message=e.message||r.symbols.line.repeat(5),e},spacer(r,e){return e}};wne.exports=(r,e={})=>{let t=Qje.merge({},yne,e.roles);return t[r]||t.default}});var Om=w((kgt,Sne)=>{\"use strict\";var bje=uo(),Sje=Yh(),vje=Bne(),SQ=ji(),{reorder:oL,scrollUp:xje,scrollDown:Pje,isObject:Qne,swap:Dje}=SQ,aL=class extends Sje{constructor(e){super(e),this.cursorHide(),this.maxSelected=e.maxSelected||1/0,this.multiple=e.multiple||!1,this.initial=e.initial||0,this.delay=e.delay||0,this.longest=0,this.num=\"\"}async initialize(){typeof this.options.initial==\"function\"&&(this.initial=await this.options.initial.call(this)),await this.reset(!0),await super.initialize()}async reset(){let{choices:e,initial:t,autofocus:i,suggest:n}=this.options;if(this.state._choices=[],this.state.choices=[],this.choices=await Promise.all(await this.toChoices(e)),this.choices.forEach(s=>s.enabled=!1),typeof n!=\"function\"&&this.selectable.length===0)throw new Error(\"At least one choice must be selectable\");Qne(t)&&(t=Object.keys(t)),Array.isArray(t)?(i!=null&&(this.index=this.findIndex(i)),t.forEach(s=>this.enable(this.find(s))),await this.render()):(i!=null&&(t=i),typeof t==\"string\"&&(t=this.findIndex(t)),typeof t==\"number\"&&t>-1&&(this.index=Math.max(0,Math.min(t,this.choices.length)),this.enable(this.find(this.index)))),this.isDisabled(this.focused)&&await this.down()}async toChoices(e,t){this.state.loadingChoices=!0;let i=[],n=0,s=async(o,a)=>{typeof o==\"function\"&&(o=await o.call(this)),o instanceof Promise&&(o=await o);for(let l=0;l<o.length;l++){let c=o[l]=await this.toChoice(o[l],n++,a);i.push(c),c.choices&&await s(c.choices,c)}return i};return s(e,t).then(o=>(this.state.loadingChoices=!1,o))}async toChoice(e,t,i){if(typeof e==\"function\"&&(e=await e.call(this,this)),e instanceof Promise&&(e=await e),typeof e==\"string\"&&(e={name:e}),e.normalized)return e;e.normalized=!0;let n=e.value;if(e=vje(e.role,this.options)(this,e),typeof e.disabled==\"string\"&&!e.hint&&(e.hint=e.disabled,e.disabled=!0),e.disabled===!0&&e.hint==null&&(e.hint=\"(disabled)\"),e.index!=null)return e;e.name=e.name||e.key||e.title||e.value||e.message,e.message=e.message||e.name||\"\",e.value=[e.value,e.name].find(this.isValue.bind(this)),e.input=\"\",e.index=t,e.cursor=0,SQ.define(e,\"parent\",i),e.level=i?i.level+1:1,e.indent==null&&(e.indent=i?i.indent+\"  \":e.indent||\"\"),e.path=i?i.path+\".\"+e.name:e.name,e.enabled=!!(this.multiple&&!this.isDisabled(e)&&(e.enabled||this.isSelected(e))),this.isDisabled(e)||(this.longest=Math.max(this.longest,bje.unstyle(e.message).length));let o={...e};return e.reset=(a=o.input,l=o.value)=>{for(let c of Object.keys(o))e[c]=o[c];e.input=a,e.value=l},n==null&&typeof e.initial==\"function\"&&(e.input=await e.initial.call(this,this.state,e,t)),e}async onChoice(e,t){this.emit(\"choice\",e,t,this),typeof e.onChoice==\"function\"&&await e.onChoice.call(this,this.state,e,t)}async addChoice(e,t,i){let n=await this.toChoice(e,t,i);return this.choices.push(n),this.index=this.choices.length-1,this.limit=this.choices.length,n}async newItem(e,t,i){let n={name:\"New choice name?\",editable:!0,newChoice:!0,...e},s=await this.addChoice(n,t,i);return s.updateChoice=()=>{delete s.newChoice,s.name=s.message=s.input,s.input=\"\",s.cursor=0},this.render()}indent(e){return e.indent==null?e.level>1?\"  \".repeat(e.level-1):\"\":e.indent}dispatch(e,t){if(this.multiple&&this[t.name])return this[t.name]();this.alert()}focus(e,t){return typeof t!=\"boolean\"&&(t=e.enabled),t&&!e.enabled&&this.selected.length>=this.maxSelected?this.alert():(this.index=e.index,e.enabled=t&&!this.isDisabled(e),e)}space(){return this.multiple?(this.toggle(this.focused),this.render()):this.alert()}a(){if(this.maxSelected<this.choices.length)return this.alert();let e=this.selectable.every(t=>t.enabled);return this.choices.forEach(t=>t.enabled=!e),this.render()}i(){return this.choices.length-this.selected.length>this.maxSelected?this.alert():(this.choices.forEach(e=>e.enabled=!e.enabled),this.render())}g(e=this.focused){return this.choices.some(t=>!!t.parent)?(this.toggle(e.parent&&!e.choices?e.parent:e),this.render()):this.a()}toggle(e,t){if(!e.enabled&&this.selected.length>=this.maxSelected)return this.alert();typeof t!=\"boolean\"&&(t=!e.enabled),e.enabled=t,e.choices&&e.choices.forEach(n=>this.toggle(n,t));let i=e.parent;for(;i;){let n=i.choices.filter(s=>this.isDisabled(s));i.enabled=n.every(s=>s.enabled===!0),i=i.parent}return bne(this,this.choices),this.emit(\"toggle\",e,this),e}enable(e){return this.selected.length>=this.maxSelected?this.alert():(e.enabled=!this.isDisabled(e),e.choices&&e.choices.forEach(this.enable.bind(this)),e)}disable(e){return e.enabled=!1,e.choices&&e.choices.forEach(this.disable.bind(this)),e}number(e){this.num+=e;let t=i=>{let n=Number(i);if(n>this.choices.length-1)return this.alert();let s=this.focused,o=this.choices.find(a=>n===a.index);if(!o.enabled&&this.selected.length>=this.maxSelected)return this.alert();if(this.visible.indexOf(o)===-1){let a=oL(this.choices),l=a.indexOf(o);if(s.index>l){let c=a.slice(l,l+this.limit),u=a.filter(g=>!c.includes(g));this.choices=c.concat(u)}else{let c=l-this.limit+1;this.choices=a.slice(c).concat(a.slice(0,c))}}return this.index=this.choices.indexOf(o),this.toggle(this.focused),this.render()};return clearTimeout(this.numberTimeout),new Promise(i=>{let n=this.choices.length,s=this.num,o=(a=!1,l)=>{clearTimeout(this.numberTimeout),a&&(l=t(s)),this.num=\"\",i(l)};if(s===\"0\"||s.length===1&&Number(s+\"0\")>n)return o(!0);if(Number(s)>n)return o(!1,this.alert());this.numberTimeout=setTimeout(()=>o(!0),this.delay)})}home(){return this.choices=oL(this.choices),this.index=0,this.render()}end(){let e=this.choices.length-this.limit,t=oL(this.choices);return this.choices=t.slice(e).concat(t.slice(0,e)),this.index=this.limit-1,this.render()}first(){return this.index=0,this.render()}last(){return this.index=this.visible.length-1,this.render()}prev(){return this.visible.length<=1?this.alert():this.up()}next(){return this.visible.length<=1?this.alert():this.down()}right(){return this.cursor>=this.input.length?this.alert():(this.cursor++,this.render())}left(){return this.cursor<=0?this.alert():(this.cursor--,this.render())}up(){let e=this.choices.length,t=this.visible.length,i=this.index;return this.options.scroll===!1&&i===0?this.alert():e>t&&i===0?this.scrollUp():(this.index=(i-1%e+e)%e,this.isDisabled()?this.up():this.render())}down(){let e=this.choices.length,t=this.visible.length,i=this.index;return this.options.scroll===!1&&i===t-1?this.alert():e>t&&i===t-1?this.scrollDown():(this.index=(i+1)%e,this.isDisabled()?this.down():this.render())}scrollUp(e=0){return this.choices=xje(this.choices),this.index=e,this.isDisabled()?this.up():this.render()}scrollDown(e=this.visible.length-1){return this.choices=Pje(this.choices),this.index=e,this.isDisabled()?this.down():this.render()}async shiftUp(){if(this.options.sort===!0){this.sorting=!0,this.swap(this.index-1),await this.up(),this.sorting=!1;return}return this.scrollUp(this.index)}async shiftDown(){if(this.options.sort===!0){this.sorting=!0,this.swap(this.index+1),await this.down(),this.sorting=!1;return}return this.scrollDown(this.index)}pageUp(){return this.visible.length<=1?this.alert():(this.limit=Math.max(this.limit-1,0),this.index=Math.min(this.limit-1,this.index),this._limit=this.limit,this.isDisabled()?this.up():this.render())}pageDown(){return this.visible.length>=this.choices.length?this.alert():(this.index=Math.max(0,this.index),this.limit=Math.min(this.limit+1,this.choices.length),this._limit=this.limit,this.isDisabled()?this.down():this.render())}swap(e){Dje(this.choices,this.index,e)}isDisabled(e=this.focused){return e&&[\"disabled\",\"collapsed\",\"hidden\",\"completing\",\"readonly\"].some(i=>e[i]===!0)?!0:e&&e.role===\"heading\"}isEnabled(e=this.focused){if(Array.isArray(e))return e.every(t=>this.isEnabled(t));if(e.choices){let t=e.choices.filter(i=>!this.isDisabled(i));return e.enabled&&t.every(i=>this.isEnabled(i))}return e.enabled&&!this.isDisabled(e)}isChoice(e,t){return e.name===t||e.index===Number(t)}isSelected(e){return Array.isArray(this.initial)?this.initial.some(t=>this.isChoice(e,t)):this.isChoice(e,this.initial)}map(e=[],t=\"value\"){return[].concat(e||[]).reduce((i,n)=>(i[n]=this.find(n,t),i),{})}filter(e,t){let n=typeof e==\"function\"?e:(a,l)=>[a.name,l].includes(e),o=(this.options.multiple?this.state._choices:this.choices).filter(n);return t?o.map(a=>a[t]):o}find(e,t){if(Qne(e))return t?e[t]:e;let n=typeof e==\"function\"?e:(o,a)=>[o.name,a].includes(e),s=this.choices.find(n);if(s)return t?s[t]:s}findIndex(e){return this.choices.indexOf(this.find(e))}async submit(){let e=this.focused;if(!e)return this.alert();if(e.newChoice)return e.input?(e.updateChoice(),this.render()):this.alert();if(this.choices.some(o=>o.newChoice))return this.alert();let{reorder:t,sort:i}=this.options,n=this.multiple===!0,s=this.selected;return s===void 0?this.alert():(Array.isArray(s)&&t!==!1&&i!==!0&&(s=SQ.reorder(s)),this.value=n?s.map(o=>o.name):s.name,super.submit())}set choices(e=[]){this.state._choices=this.state._choices||[],this.state.choices=e;for(let t of e)this.state._choices.some(i=>i.name===t.name)||this.state._choices.push(t);if(!this._initial&&this.options.initial){this._initial=!0;let t=this.initial;if(typeof t==\"string\"||typeof t==\"number\"){let i=this.find(t);i&&(this.initial=i.index,this.focus(i,!0))}}}get choices(){return bne(this,this.state.choices||[])}set visible(e){this.state.visible=e}get visible(){return(this.state.visible||this.choices).slice(0,this.limit)}set limit(e){this.state.limit=e}get limit(){let{state:e,options:t,choices:i}=this,n=e.limit||this._limit||t.limit||i.length;return Math.min(n,this.height)}set value(e){super.value=e}get value(){return typeof super.value!=\"string\"&&super.value===this.initial?this.input:super.value}set index(e){this.state.index=e}get index(){return Math.max(0,this.state?this.state.index:0)}get enabled(){return this.filter(this.isEnabled.bind(this))}get focused(){let e=this.choices[this.index];return e&&this.state.submitted&&this.multiple!==!0&&(e.enabled=!0),e}get selectable(){return this.choices.filter(e=>!this.isDisabled(e))}get selected(){return this.multiple?this.enabled:this.focused}};function bne(r,e){if(e instanceof Promise)return e;if(typeof e==\"function\"){if(SQ.isAsyncFn(e))return e;e=e.call(r,r)}for(let t of e){if(Array.isArray(t.choices)){let i=t.choices.filter(n=>!r.isDisabled(n));t.enabled=i.every(n=>n.enabled===!0)}r.isDisabled(t)===!0&&delete t.enabled}return e}Sne.exports=aL});var Cl=w((Rgt,vne)=>{\"use strict\";var kje=Om(),AL=ji(),lL=class extends kje{constructor(e){super(e),this.emptyError=this.options.emptyError||\"No items were selected\"}async dispatch(e,t){if(this.multiple)return this[t.name]?await this[t.name](e,t):await super.dispatch(e,t);this.alert()}separator(){if(this.options.separator)return super.separator();let e=this.styles.muted(this.symbols.ellipsis);return this.state.submitted?super.separator():e}pointer(e,t){return!this.multiple||this.options.pointer?super.pointer(e,t):\"\"}indicator(e,t){return this.multiple?super.indicator(e,t):\"\"}choiceMessage(e,t){let i=this.resolve(e.message,this.state,e,t);return e.role===\"heading\"&&!AL.hasColor(i)&&(i=this.styles.strong(i)),this.resolve(i,this.state,e,t)}choiceSeparator(){return\":\"}async renderChoice(e,t){await this.onChoice(e,t);let i=this.index===t,n=await this.pointer(e,t),s=await this.indicator(e,t)+(e.pad||\"\"),o=await this.resolve(e.hint,this.state,e,t);o&&!AL.hasColor(o)&&(o=this.styles.muted(o));let a=this.indent(e),l=await this.choiceMessage(e,t),c=()=>[this.margin[3],a+n+s,l,this.margin[1],o].filter(Boolean).join(\" \");return e.role===\"heading\"?c():e.disabled?(AL.hasColor(l)||(l=this.styles.disabled(l)),c()):(i&&(l=this.styles.em(l)),c())}async renderChoices(){if(this.state.loading===\"choices\")return this.styles.warning(\"Loading choices\");if(this.state.submitted)return\"\";let e=this.visible.map(async(s,o)=>await this.renderChoice(s,o)),t=await Promise.all(e);t.length||t.push(this.styles.danger(\"No matching choices\"));let i=this.margin[0]+t.join(`\n`),n;return this.options.choicesHeader&&(n=await this.resolve(this.options.choicesHeader,this.state)),[n,i].filter(Boolean).join(`\n`)}format(){return!this.state.submitted||this.state.cancelled?\"\":Array.isArray(this.selected)?this.selected.map(e=>this.styles.primary(e.name)).join(\", \"):this.styles.primary(this.selected.name)}async render(){let{submitted:e,size:t}=this.state,i=\"\",n=await this.header(),s=await this.prefix(),o=await this.separator(),a=await this.message();this.options.promptLine!==!1&&(i=[s,a,o,\"\"].join(\" \"),this.state.prompt=i);let l=await this.format(),c=await this.error()||await this.hint(),u=await this.renderChoices(),g=await this.footer();l&&(i+=l),c&&!i.includes(c)&&(i+=\" \"+c),e&&!l&&!u.trim()&&this.multiple&&this.emptyError!=null&&(i+=this.styles.danger(this.emptyError)),this.clear(t),this.write([n,i,u,g].filter(Boolean).join(`\n`)),this.write(this.margin[2]),this.restore()}};vne.exports=lL});var Pne=w((Fgt,xne)=>{\"use strict\";var Rje=Cl(),Fje=(r,e)=>{let t=r.toLowerCase();return i=>{let s=i.toLowerCase().indexOf(t),o=e(i.slice(s,s+t.length));return s>=0?i.slice(0,s)+o+i.slice(s+t.length):i}},cL=class extends Rje{constructor(e){super(e),this.cursorShow()}moveCursor(e){this.state.cursor+=e}dispatch(e){return this.append(e)}space(e){return this.options.multiple?super.space(e):this.append(e)}append(e){let{cursor:t,input:i}=this.state;return this.input=i.slice(0,t)+e+i.slice(t),this.moveCursor(1),this.complete()}delete(){let{cursor:e,input:t}=this.state;return t?(this.input=t.slice(0,e-1)+t.slice(e),this.moveCursor(-1),this.complete()):this.alert()}deleteForward(){let{cursor:e,input:t}=this.state;return t[e]===void 0?this.alert():(this.input=`${t}`.slice(0,e)+`${t}`.slice(e+1),this.complete())}number(e){return this.append(e)}async complete(){this.completing=!0,this.choices=await this.suggest(this.input,this.state._choices),this.state.limit=void 0,this.index=Math.min(Math.max(this.visible.length-1,0),this.index),await this.render(),this.completing=!1}suggest(e=this.input,t=this.state._choices){if(typeof this.options.suggest==\"function\")return this.options.suggest.call(this,e,t);let i=e.toLowerCase();return t.filter(n=>n.message.toLowerCase().includes(i))}pointer(){return\"\"}format(){if(!this.focused)return this.input;if(this.options.multiple&&this.state.submitted)return this.selected.map(e=>this.styles.primary(e.message)).join(\", \");if(this.state.submitted){let e=this.value=this.input=this.focused.value;return this.styles.primary(e)}return this.input}async render(){if(this.state.status!==\"pending\")return super.render();let e=this.options.highlight?this.options.highlight.bind(this):this.styles.placeholder,t=Fje(this.input,e),i=this.choices;this.choices=i.map(n=>({...n,message:t(n.message)})),await super.render(),this.choices=i}submit(){return this.options.multiple&&(this.value=this.selected.map(e=>e.name)),super.submit()}};xne.exports=cL});var gL=w((Ngt,Dne)=>{\"use strict\";var uL=ji();Dne.exports=(r,e={})=>{r.cursorHide();let{input:t=\"\",initial:i=\"\",pos:n,showCursor:s=!0,color:o}=e,a=o||r.styles.placeholder,l=uL.inverse(r.styles.primary),c=C=>l(r.styles.black(C)),u=t,g=\" \",f=c(g);if(r.blink&&r.blink.off===!0&&(c=C=>C,f=\"\"),s&&n===0&&i===\"\"&&t===\"\")return c(g);if(s&&n===0&&(t===i||t===\"\"))return c(i[0])+a(i.slice(1));i=uL.isPrimitive(i)?`${i}`:\"\",t=uL.isPrimitive(t)?`${t}`:\"\";let h=i&&i.startsWith(t)&&i!==t,p=h?c(i[t.length]):f;if(n!==t.length&&s===!0&&(u=t.slice(0,n)+c(t[n])+t.slice(n+1),p=\"\"),s===!1&&(p=\"\"),h){let C=r.styles.unstyle(u+p);return u+p+a(i.slice(C.length))}return u+p}});var vQ=w((Tgt,kne)=>{\"use strict\";var Nje=uo(),Tje=Cl(),Lje=gL(),fL=class extends Tje{constructor(e){super({...e,multiple:!0}),this.type=\"form\",this.initial=this.options.initial,this.align=[this.options.align,\"right\"].find(t=>t!=null),this.emptyError=\"\",this.values={}}async reset(e){return await super.reset(),e===!0&&(this._index=this.index),this.index=this._index,this.values={},this.choices.forEach(t=>t.reset&&t.reset()),this.render()}dispatch(e){return!!e&&this.append(e)}append(e){let t=this.focused;if(!t)return this.alert();let{cursor:i,input:n}=t;return t.value=t.input=n.slice(0,i)+e+n.slice(i),t.cursor++,this.render()}delete(){let e=this.focused;if(!e||e.cursor<=0)return this.alert();let{cursor:t,input:i}=e;return e.value=e.input=i.slice(0,t-1)+i.slice(t),e.cursor--,this.render()}deleteForward(){let e=this.focused;if(!e)return this.alert();let{cursor:t,input:i}=e;if(i[t]===void 0)return this.alert();let n=`${i}`.slice(0,t)+`${i}`.slice(t+1);return e.value=e.input=n,this.render()}right(){let e=this.focused;return e?e.cursor>=e.input.length?this.alert():(e.cursor++,this.render()):this.alert()}left(){let e=this.focused;return e?e.cursor<=0?this.alert():(e.cursor--,this.render()):this.alert()}space(e,t){return this.dispatch(e,t)}number(e,t){return this.dispatch(e,t)}next(){let e=this.focused;if(!e)return this.alert();let{initial:t,input:i}=e;return t&&t.startsWith(i)&&i!==t?(e.value=e.input=t,e.cursor=e.value.length,this.render()):super.next()}prev(){let e=this.focused;return e?e.cursor===0?super.prev():(e.value=e.input=\"\",e.cursor=0,this.render()):this.alert()}separator(){return\"\"}format(e){return this.state.submitted?\"\":super.format(e)}pointer(){return\"\"}indicator(e){return e.input?\"\\u29BF\":\"\\u2299\"}async choiceSeparator(e,t){let i=await this.resolve(e.separator,this.state,e,t)||\":\";return i?\" \"+this.styles.disabled(i):\"\"}async renderChoice(e,t){await this.onChoice(e,t);let{state:i,styles:n}=this,{cursor:s,initial:o=\"\",name:a,hint:l,input:c=\"\"}=e,{muted:u,submitted:g,primary:f,danger:h}=n,p=l,C=this.index===t,y=e.validate||(()=>!0),B=await this.choiceSeparator(e,t),v=e.message;this.align===\"right\"&&(v=v.padStart(this.longest+1,\" \")),this.align===\"left\"&&(v=v.padEnd(this.longest+1,\" \"));let D=this.values[a]=c||o,T=c?\"success\":\"dark\";await y.call(e,D,this.state)!==!0&&(T=\"danger\");let H=n[T],j=H(await this.indicator(e,t))+(e.pad||\"\"),$=this.indent(e),V=()=>[$,j,v+B,c,p].filter(Boolean).join(\" \");if(i.submitted)return v=Nje.unstyle(v),c=g(c),p=\"\",V();if(e.format)c=await e.format.call(this,c,e,t);else{let W=this.styles.muted;c=Lje(this,{input:c,initial:o,pos:s,showCursor:C,color:W})}return this.isValue(c)||(c=this.styles.muted(this.symbols.ellipsis)),e.result&&(this.values[a]=await e.result.call(this,D,e,t)),C&&(v=f(v)),e.error?c+=(c?\" \":\"\")+h(e.error.trim()):e.hint&&(c+=(c?\" \":\"\")+u(e.hint.trim())),V()}async submit(){return this.value=this.values,super.base.submit.call(this)}};kne.exports=fL});var hL=w((Lgt,Fne)=>{\"use strict\";var Oje=vQ(),Mje=()=>{throw new Error(\"expected prompt to have a custom authenticate method\")},Rne=(r=Mje)=>{class e extends Oje{constructor(i){super(i)}async submit(){this.value=await r.call(this,this.values,this.state),super.base.submit.call(this)}static create(i){return Rne(i)}}return e};Fne.exports=Rne()});var Lne=w((Ogt,Tne)=>{\"use strict\";var Kje=hL();function Uje(r,e){return r.username===this.options.username&&r.password===this.options.password}var Nne=(r=Uje)=>{let e=[{name:\"username\",message:\"username\"},{name:\"password\",message:\"password\",format(i){return this.options.showPassword?i:(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(i.length))}}];class t extends Kje.create(r){constructor(n){super({...n,choices:e})}static create(n){return Nne(n)}}return t};Tne.exports=Nne()});var xQ=w((Mgt,One)=>{\"use strict\";var Hje=Yh(),{isPrimitive:Gje,hasColor:Yje}=ji(),pL=class extends Hje{constructor(e){super(e),this.cursorHide()}async initialize(){let e=await this.resolve(this.initial,this.state);this.input=await this.cast(e),await super.initialize()}dispatch(e){return this.isValue(e)?(this.input=e,this.submit()):this.alert()}format(e){let{styles:t,state:i}=this;return i.submitted?t.success(e):t.primary(e)}cast(e){return this.isTrue(e)}isTrue(e){return/^[ty1]/i.test(e)}isFalse(e){return/^[fn0]/i.test(e)}isValue(e){return Gje(e)&&(this.isTrue(e)||this.isFalse(e))}async hint(){if(this.state.status===\"pending\"){let e=await this.element(\"hint\");return Yje(e)?e:this.styles.muted(e)}}async render(){let{input:e,size:t}=this.state,i=await this.prefix(),n=await this.separator(),s=await this.message(),o=this.styles.muted(this.default),a=[i,s,o,n].filter(Boolean).join(\" \");this.state.prompt=a;let l=await this.header(),c=this.value=this.cast(e),u=await this.format(c),g=await this.error()||await this.hint(),f=await this.footer();g&&!a.includes(g)&&(u+=\" \"+g),a+=\" \"+u,this.clear(t),this.write([l,a,f].filter(Boolean).join(`\n`)),this.restore()}set value(e){super.value=e}get value(){return this.cast(super.value)}};One.exports=pL});var Kne=w((Kgt,Mne)=>{\"use strict\";var jje=xQ(),dL=class extends jje{constructor(e){super(e),this.default=this.options.default||(this.initial?\"(Y/n)\":\"(y/N)\")}};Mne.exports=dL});var Hne=w((Ugt,Une)=>{\"use strict\";var qje=Cl(),Jje=vQ(),jh=Jje.prototype,CL=class extends qje{constructor(e){super({...e,multiple:!0}),this.align=[this.options.align,\"left\"].find(t=>t!=null),this.emptyError=\"\",this.values={}}dispatch(e,t){let i=this.focused,n=i.parent||{};return!i.editable&&!n.editable&&(e===\"a\"||e===\"i\")?super[e]():jh.dispatch.call(this,e,t)}append(e,t){return jh.append.call(this,e,t)}delete(e,t){return jh.delete.call(this,e,t)}space(e){return this.focused.editable?this.append(e):super.space()}number(e){return this.focused.editable?this.append(e):super.number(e)}next(){return this.focused.editable?jh.next.call(this):super.next()}prev(){return this.focused.editable?jh.prev.call(this):super.prev()}async indicator(e,t){let i=e.indicator||\"\",n=e.editable?i:super.indicator(e,t);return await this.resolve(n,this.state,e,t)||\"\"}indent(e){return e.role===\"heading\"?\"\":e.editable?\" \":\"  \"}async renderChoice(e,t){return e.indent=\"\",e.editable?jh.renderChoice.call(this,e,t):super.renderChoice(e,t)}error(){return\"\"}footer(){return this.state.error}async validate(){let e=!0;for(let t of this.choices){if(typeof t.validate!=\"function\"||t.role===\"heading\")continue;let i=t.parent?this.value[t.parent.name]:this.value;if(t.editable?i=t.value===t.name?t.initial||\"\":t.value:this.isDisabled(t)||(i=t.enabled===!0),e=await t.validate(i,this.state),e!==!0)break}return e!==!0&&(this.state.error=typeof e==\"string\"?e:\"Invalid Input\"),e}submit(){if(this.focused.newChoice===!0)return super.submit();if(this.choices.some(e=>e.newChoice))return this.alert();this.value={};for(let e of this.choices){let t=e.parent?this.value[e.parent.name]:this.value;if(e.role===\"heading\"){this.value[e.name]={};continue}e.editable?t[e.name]=e.value===e.name?e.initial||\"\":e.value:this.isDisabled(e)||(t[e.name]=e.enabled===!0)}return this.base.submit.call(this)}};Une.exports=CL});var au=w((Hgt,Gne)=>{\"use strict\";var Wje=Yh(),zje=gL(),{isPrimitive:Vje}=ji(),mL=class extends Wje{constructor(e){super(e),this.initial=Vje(this.initial)?String(this.initial):\"\",this.initial&&this.cursorHide(),this.state.prevCursor=0,this.state.clipboard=[]}async keypress(e,t={}){let i=this.state.prevKeypress;return this.state.prevKeypress=t,this.options.multiline===!0&&t.name===\"return\"&&(!i||i.name!==\"return\")?this.append(`\n`,t):super.keypress(e,t)}moveCursor(e){this.cursor+=e}reset(){return this.input=this.value=\"\",this.cursor=0,this.render()}dispatch(e,t){if(!e||t.ctrl||t.code)return this.alert();this.append(e)}append(e){let{cursor:t,input:i}=this.state;this.input=`${i}`.slice(0,t)+e+`${i}`.slice(t),this.moveCursor(String(e).length),this.render()}insert(e){this.append(e)}delete(){let{cursor:e,input:t}=this.state;if(e<=0)return this.alert();this.input=`${t}`.slice(0,e-1)+`${t}`.slice(e),this.moveCursor(-1),this.render()}deleteForward(){let{cursor:e,input:t}=this.state;if(t[e]===void 0)return this.alert();this.input=`${t}`.slice(0,e)+`${t}`.slice(e+1),this.render()}cutForward(){let e=this.cursor;if(this.input.length<=e)return this.alert();this.state.clipboard.push(this.input.slice(e)),this.input=this.input.slice(0,e),this.render()}cutLeft(){let e=this.cursor;if(e===0)return this.alert();let t=this.input.slice(0,e),i=this.input.slice(e),n=t.split(\" \");this.state.clipboard.push(n.pop()),this.input=n.join(\" \"),this.cursor=this.input.length,this.input+=i,this.render()}paste(){if(!this.state.clipboard.length)return this.alert();this.insert(this.state.clipboard.pop()),this.render()}toggleCursor(){this.state.prevCursor?(this.cursor=this.state.prevCursor,this.state.prevCursor=0):(this.state.prevCursor=this.cursor,this.cursor=0),this.render()}first(){this.cursor=0,this.render()}last(){this.cursor=this.input.length-1,this.render()}next(){let e=this.initial!=null?String(this.initial):\"\";if(!e||!e.startsWith(this.input))return this.alert();this.input=this.initial,this.cursor=this.initial.length,this.render()}prev(){if(!this.input)return this.alert();this.reset()}backward(){return this.left()}forward(){return this.right()}right(){return this.cursor>=this.input.length?this.alert():(this.moveCursor(1),this.render())}left(){return this.cursor<=0?this.alert():(this.moveCursor(-1),this.render())}isValue(e){return!!e}async format(e=this.value){let t=await this.resolve(this.initial,this.state);return this.state.submitted?this.styles.submitted(e||t):zje(this,{input:e,initial:t,pos:this.cursor})}async render(){let e=this.state.size,t=await this.prefix(),i=await this.separator(),n=await this.message(),s=[t,n,i].filter(Boolean).join(\" \");this.state.prompt=s;let o=await this.header(),a=await this.format(),l=await this.error()||await this.hint(),c=await this.footer();l&&!a.includes(l)&&(a+=\" \"+l),s+=\" \"+a,this.clear(e),this.write([o,s,c].filter(Boolean).join(`\n`)),this.restore()}};Gne.exports=mL});var jne=w((Ggt,Yne)=>{\"use strict\";var Xje=r=>r.filter((e,t)=>r.lastIndexOf(e)===t),PQ=r=>Xje(r).filter(Boolean);Yne.exports=(r,e={},t=\"\")=>{let{past:i=[],present:n=\"\"}=e,s,o;switch(r){case\"prev\":case\"undo\":return s=i.slice(0,i.length-1),o=i[i.length-1]||\"\",{past:PQ([t,...s]),present:o};case\"next\":case\"redo\":return s=i.slice(1),o=i[0]||\"\",{past:PQ([...s,t]),present:o};case\"save\":return{past:PQ([...i,t]),present:\"\"};case\"remove\":return o=PQ(i.filter(a=>a!==t)),n=\"\",o.length&&(n=o.pop()),{past:o,present:n};default:throw new Error(`Invalid action: \"${r}\"`)}}});var IL=w((Ygt,Jne)=>{\"use strict\";var Zje=au(),qne=jne(),EL=class extends Zje{constructor(e){super(e);let t=this.options.history;if(t&&t.store){let i=t.values||this.initial;this.autosave=!!t.autosave,this.store=t.store,this.data=this.store.get(\"values\")||{past:[],present:i},this.initial=this.data.present||this.data.past[this.data.past.length-1]}}completion(e){return this.store?(this.data=qne(e,this.data,this.input),this.data.present?(this.input=this.data.present,this.cursor=this.input.length,this.render()):this.alert()):this.alert()}altUp(){return this.completion(\"prev\")}altDown(){return this.completion(\"next\")}prev(){return this.save(),super.prev()}save(){!this.store||(this.data=qne(\"save\",this.data,this.input),this.store.set(\"values\",this.data))}submit(){return this.store&&this.autosave===!0&&this.save(),super.submit()}};Jne.exports=EL});var zne=w((jgt,Wne)=>{\"use strict\";var _je=au(),yL=class extends _je{format(){return\"\"}};Wne.exports=yL});var Xne=w((qgt,Vne)=>{\"use strict\";var $je=au(),wL=class extends $je{constructor(e={}){super(e),this.sep=this.options.separator||/, */,this.initial=e.initial||\"\"}split(e=this.value){return e?String(e).split(this.sep):[]}format(){let e=this.state.submitted?this.styles.primary:t=>t;return this.list.map(e).join(\", \")}async submit(e){let t=this.state.error||await this.validate(this.list,this.state);return t!==!0?(this.state.error=t,super.submit()):(this.value=this.list,super.submit())}get list(){return this.split()}};Vne.exports=wL});var _ne=w((Jgt,Zne)=>{\"use strict\";var eqe=Cl(),BL=class extends eqe{constructor(e){super({...e,multiple:!0})}};Zne.exports=BL});var bL=w((Wgt,$ne)=>{\"use strict\";var tqe=au(),QL=class extends tqe{constructor(e={}){super({style:\"number\",...e}),this.min=this.isValue(e.min)?this.toNumber(e.min):-1/0,this.max=this.isValue(e.max)?this.toNumber(e.max):1/0,this.delay=e.delay!=null?e.delay:1e3,this.float=e.float!==!1,this.round=e.round===!0||e.float===!1,this.major=e.major||10,this.minor=e.minor||1,this.initial=e.initial!=null?e.initial:\"\",this.input=String(this.initial),this.cursor=this.input.length,this.cursorShow()}append(e){return!/[-+.]/.test(e)||e===\".\"&&this.input.includes(\".\")?this.alert(\"invalid number\"):super.append(e)}number(e){return super.append(e)}next(){return this.input&&this.input!==this.initial?this.alert():this.isValue(this.initial)?(this.input=this.initial,this.cursor=String(this.initial).length,this.render()):this.alert()}up(e){let t=e||this.minor,i=this.toNumber(this.input);return i>this.max+t?this.alert():(this.input=`${i+t}`,this.render())}down(e){let t=e||this.minor,i=this.toNumber(this.input);return i<this.min-t?this.alert():(this.input=`${i-t}`,this.render())}shiftDown(){return this.down(this.major)}shiftUp(){return this.up(this.major)}format(e=this.input){return typeof this.options.format==\"function\"?this.options.format.call(this,e):this.styles.info(e)}toNumber(e=\"\"){return this.float?+e:Math.round(+e)}isValue(e){return/^[-+]?[0-9]+((\\.)|(\\.[0-9]+))?$/.test(e)}submit(){let e=[this.input,this.initial].find(t=>this.isValue(t));return this.value=this.toNumber(e||0),super.submit()}};$ne.exports=QL});var tse=w((zgt,ese)=>{ese.exports=bL()});var ise=w((Vgt,rse)=>{\"use strict\";var rqe=au(),SL=class extends rqe{constructor(e){super(e),this.cursorShow()}format(e=this.input){return this.keypressed?(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(e.length)):\"\"}};rse.exports=SL});var ose=w((Xgt,sse)=>{\"use strict\";var iqe=uo(),nqe=Om(),nse=ji(),vL=class extends nqe{constructor(e={}){super(e),this.widths=[].concat(e.messageWidth||50),this.align=[].concat(e.align||\"left\"),this.linebreak=e.linebreak||!1,this.edgeLength=e.edgeLength||3,this.newline=e.newline||`\n   `;let t=e.startNumber||1;typeof this.scale==\"number\"&&(this.scaleKey=!1,this.scale=Array(this.scale).fill(0).map((i,n)=>({name:n+t})))}async reset(){return this.tableized=!1,await super.reset(),this.render()}tableize(){if(this.tableized===!0)return;this.tableized=!0;let e=0;for(let t of this.choices){e=Math.max(e,t.message.length),t.scaleIndex=t.initial||2,t.scale=[];for(let i=0;i<this.scale.length;i++)t.scale.push({index:i})}this.widths[0]=Math.min(this.widths[0],e+3)}async dispatch(e,t){if(this.multiple)return this[t.name]?await this[t.name](e,t):await super.dispatch(e,t);this.alert()}heading(e,t,i){return this.styles.strong(e)}separator(){return this.styles.muted(this.symbols.ellipsis)}right(){let e=this.focused;return e.scaleIndex>=this.scale.length-1?this.alert():(e.scaleIndex++,this.render())}left(){let e=this.focused;return e.scaleIndex<=0?this.alert():(e.scaleIndex--,this.render())}indent(){return\"\"}format(){return this.state.submitted?this.choices.map(t=>this.styles.info(t.index)).join(\", \"):\"\"}pointer(){return\"\"}renderScaleKey(){return this.scaleKey===!1||this.state.submitted?\"\":[\"\",...this.scale.map(i=>`   ${i.name} - ${i.message}`)].map(i=>this.styles.muted(i)).join(`\n`)}renderScaleHeading(e){let t=this.scale.map(l=>l.name);typeof this.options.renderScaleHeading==\"function\"&&(t=this.options.renderScaleHeading.call(this,e));let i=this.scaleLength-t.join(\"\").length,n=Math.round(i/(t.length-1)),o=t.map(l=>this.styles.strong(l)).join(\" \".repeat(n)),a=\" \".repeat(this.widths[0]);return this.margin[3]+a+this.margin[1]+o}scaleIndicator(e,t,i){if(typeof this.options.scaleIndicator==\"function\")return this.options.scaleIndicator.call(this,e,t,i);let n=e.scaleIndex===t.index;return t.disabled?this.styles.hint(this.symbols.radio.disabled):n?this.styles.success(this.symbols.radio.on):this.symbols.radio.off}renderScale(e,t){let i=e.scale.map(s=>this.scaleIndicator(e,s,t)),n=this.term===\"Hyper\"?\"\":\" \";return i.join(n+this.symbols.line.repeat(this.edgeLength))}async renderChoice(e,t){await this.onChoice(e,t);let i=this.index===t,n=await this.pointer(e,t),s=await e.hint;s&&!nse.hasColor(s)&&(s=this.styles.muted(s));let o=p=>this.margin[3]+p.replace(/\\s+$/,\"\").padEnd(this.widths[0],\" \"),a=this.newline,l=this.indent(e),c=await this.resolve(e.message,this.state,e,t),u=await this.renderScale(e,t),g=this.margin[1]+this.margin[3];this.scaleLength=iqe.unstyle(u).length,this.widths[0]=Math.min(this.widths[0],this.width-this.scaleLength-g.length);let h=nse.wordWrap(c,{width:this.widths[0],newline:a}).split(`\n`).map(p=>o(p)+this.margin[1]);return i&&(u=this.styles.info(u),h=h.map(p=>this.styles.info(p))),h[0]+=u,this.linebreak&&h.push(\"\"),[l+n,h.join(`\n`)].filter(Boolean)}async renderChoices(){if(this.state.submitted)return\"\";this.tableize();let e=this.visible.map(async(n,s)=>await this.renderChoice(n,s)),t=await Promise.all(e),i=await this.renderScaleHeading();return this.margin[0]+[i,...t.map(n=>n.join(\" \"))].join(`\n`)}async render(){let{submitted:e,size:t}=this.state,i=await this.prefix(),n=await this.separator(),s=await this.message(),o=\"\";this.options.promptLine!==!1&&(o=[i,s,n,\"\"].join(\" \"),this.state.prompt=o);let a=await this.header(),l=await this.format(),c=await this.renderScaleKey(),u=await this.error()||await this.hint(),g=await this.renderChoices(),f=await this.footer(),h=this.emptyError;l&&(o+=l),u&&!o.includes(u)&&(o+=\" \"+u),e&&!l&&!g.trim()&&this.multiple&&h!=null&&(o+=this.styles.danger(h)),this.clear(t),this.write([a,o,c,g,f].filter(Boolean).join(`\n`)),this.state.submitted||this.write(this.margin[2]),this.restore()}submit(){this.value={};for(let e of this.choices)this.value[e.name]=e.scaleIndex;return this.base.submit.call(this)}};sse.exports=vL});var lse=w((Zgt,Ase)=>{\"use strict\";var ase=uo(),sqe=(r=\"\")=>typeof r==\"string\"?r.replace(/^['\"]|['\"]$/g,\"\"):\"\",PL=class{constructor(e){this.name=e.key,this.field=e.field||{},this.value=sqe(e.initial||this.field.initial||\"\"),this.message=e.message||this.name,this.cursor=0,this.input=\"\",this.lines=[]}},oqe=async(r={},e={},t=i=>i)=>{let i=new Set,n=r.fields||[],s=r.template,o=[],a=[],l=[],c=1;typeof s==\"function\"&&(s=await s());let u=-1,g=()=>s[++u],f=()=>s[u+1],h=p=>{p.line=c,o.push(p)};for(h({type:\"bos\",value:\"\"});u<s.length-1;){let p=g();if(/^[^\\S\\n ]$/.test(p)){h({type:\"text\",value:p});continue}if(p===`\n`){h({type:\"newline\",value:p}),c++;continue}if(p===\"\\\\\"){p+=g(),h({type:\"text\",value:p});continue}if((p===\"$\"||p===\"#\"||p===\"{\")&&f()===\"{\"){let y=g();p+=y;let B={type:\"template\",open:p,inner:\"\",close:\"\",value:p},v;for(;v=g();){if(v===\"}\"){f()===\"}\"&&(v+=g()),B.value+=v,B.close=v;break}v===\":\"?(B.initial=\"\",B.key=B.inner):B.initial!==void 0&&(B.initial+=v),B.value+=v,B.inner+=v}B.template=B.open+(B.initial||B.inner)+B.close,B.key=B.key||B.inner,e.hasOwnProperty(B.key)&&(B.initial=e[B.key]),B=t(B),h(B),l.push(B.key),i.add(B.key);let D=a.find(T=>T.name===B.key);B.field=n.find(T=>T.name===B.key),D||(D=new PL(B),a.push(D)),D.lines.push(B.line-1);continue}let C=o[o.length-1];C.type===\"text\"&&C.line===c?C.value+=p:h({type:\"text\",value:p})}return h({type:\"eos\",value:\"\"}),{input:s,tabstops:o,unique:i,keys:l,items:a}};Ase.exports=async r=>{let e=r.options,t=new Set(e.required===!0?[]:e.required||[]),i={...e.values,...e.initial},{tabstops:n,items:s,keys:o}=await oqe(e,i),a=xL(\"result\",r,e),l=xL(\"format\",r,e),c=xL(\"validate\",r,e,!0),u=r.isValue.bind(r);return async(g={},f=!1)=>{let h=0;g.required=t,g.items=s,g.keys=o,g.output=\"\";let p=async(v,D,T,H)=>{let j=await c(v,D,T,H);return j===!1?\"Invalid field \"+T.name:j};for(let v of n){let D=v.value,T=v.key;if(v.type!==\"template\"){D&&(g.output+=D);continue}if(v.type===\"template\"){let H=s.find(_=>_.name===T);e.required===!0&&g.required.add(H.name);let j=[H.input,g.values[H.value],H.value,D].find(u),V=(H.field||{}).message||v.inner;if(f){let _=await p(g.values[T],g,H,h);if(_&&typeof _==\"string\"||_===!1){g.invalid.set(T,_);continue}g.invalid.delete(T);let A=await a(g.values[T],g,H,h);g.output+=ase.unstyle(A);continue}H.placeholder=!1;let W=D;D=await l(D,g,H,h),j!==D?(g.values[T]=j,D=r.styles.typing(j),g.missing.delete(V)):(g.values[T]=void 0,j=`<${V}>`,D=r.styles.primary(j),H.placeholder=!0,g.required.has(T)&&g.missing.add(V)),g.missing.has(V)&&g.validating&&(D=r.styles.warning(j)),g.invalid.has(T)&&g.validating&&(D=r.styles.danger(j)),h===g.index&&(W!==D?D=r.styles.underline(D):D=r.styles.heading(ase.unstyle(D))),h++}D&&(g.output+=D)}let C=g.output.split(`\n`).map(v=>\" \"+v),y=s.length,B=0;for(let v of s)g.invalid.has(v.name)&&v.lines.forEach(D=>{C[D][0]===\" \"&&(C[D]=g.styles.danger(g.symbols.bullet)+C[D].slice(1))}),r.isValue(g.values[v.name])&&B++;return g.completed=(B/y*100).toFixed(0),g.output=C.join(`\n`),g.output}};function xL(r,e,t,i){return(n,s,o,a)=>typeof o.field[r]==\"function\"?o.field[r].call(e,n,s,o,a):[i,n].find(l=>e.isValue(l))}});var use=w((_gt,cse)=>{\"use strict\";var aqe=uo(),Aqe=lse(),lqe=Yh(),DL=class extends lqe{constructor(e){super(e),this.cursorHide(),this.reset(!0)}async initialize(){this.interpolate=await Aqe(this),await super.initialize()}async reset(e){this.state.keys=[],this.state.invalid=new Map,this.state.missing=new Set,this.state.completed=0,this.state.values={},e!==!0&&(await this.initialize(),await this.render())}moveCursor(e){let t=this.getItem();this.cursor+=e,t.cursor+=e}dispatch(e,t){if(!t.code&&!t.ctrl&&e!=null&&this.getItem()){this.append(e,t);return}this.alert()}append(e,t){let i=this.getItem(),n=i.input.slice(0,this.cursor),s=i.input.slice(this.cursor);this.input=i.input=`${n}${e}${s}`,this.moveCursor(1),this.render()}delete(){let e=this.getItem();if(this.cursor<=0||!e.input)return this.alert();let t=e.input.slice(this.cursor),i=e.input.slice(0,this.cursor-1);this.input=e.input=`${i}${t}`,this.moveCursor(-1),this.render()}increment(e){return e>=this.state.keys.length-1?0:e+1}decrement(e){return e<=0?this.state.keys.length-1:e-1}first(){this.state.index=0,this.render()}last(){this.state.index=this.state.keys.length-1,this.render()}right(){if(this.cursor>=this.input.length)return this.alert();this.moveCursor(1),this.render()}left(){if(this.cursor<=0)return this.alert();this.moveCursor(-1),this.render()}prev(){this.state.index=this.decrement(this.state.index),this.getItem(),this.render()}next(){this.state.index=this.increment(this.state.index),this.getItem(),this.render()}up(){this.prev()}down(){this.next()}format(e){let t=this.state.completed<100?this.styles.warning:this.styles.success;return this.state.submitted===!0&&this.state.completed!==100&&(t=this.styles.danger),t(`${this.state.completed}% completed`)}async render(){let{index:e,keys:t=[],submitted:i,size:n}=this.state,s=[this.options.newline,`\n`].find(v=>v!=null),o=await this.prefix(),a=await this.separator(),l=await this.message(),c=[o,l,a].filter(Boolean).join(\" \");this.state.prompt=c;let u=await this.header(),g=await this.error()||\"\",f=await this.hint()||\"\",h=i?\"\":await this.interpolate(this.state),p=this.state.key=t[e]||\"\",C=await this.format(p),y=await this.footer();C&&(c+=\" \"+C),f&&!C&&this.state.completed===0&&(c+=\" \"+f),this.clear(n);let B=[u,c,h,y,g.trim()];this.write(B.filter(Boolean).join(s)),this.restore()}getItem(e){let{items:t,keys:i,index:n}=this.state,s=t.find(o=>o.name===i[n]);return s&&s.input!=null&&(this.input=s.input,this.cursor=s.cursor),s}async submit(){typeof this.interpolate!=\"function\"&&await this.initialize(),await this.interpolate(this.state,!0);let{invalid:e,missing:t,output:i,values:n}=this.state;if(e.size){let a=\"\";for(let[l,c]of e)a+=`Invalid ${l}: ${c}\n`;return this.state.error=a,super.submit()}if(t.size)return this.state.error=\"Required: \"+[...t.keys()].join(\", \"),super.submit();let o=aqe.unstyle(i).split(`\n`).map(a=>a.slice(1)).join(`\n`);return this.value={values:n,result:o},super.submit()}};cse.exports=DL});var fse=w(($gt,gse)=>{\"use strict\";var cqe=\"(Use <shift>+<up/down> to sort)\",uqe=Cl(),kL=class extends uqe{constructor(e){super({...e,reorder:!1,sort:!0,multiple:!0}),this.state.hint=[this.options.hint,cqe].find(this.isValue.bind(this))}indicator(){return\"\"}async renderChoice(e,t){let i=await super.renderChoice(e,t),n=this.symbols.identicalTo+\" \",s=this.index===t&&this.sorting?this.styles.muted(n):\"  \";return this.options.drag===!1&&(s=\"\"),this.options.numbered===!0?s+`${t+1} - `+i:s+i}get selected(){return this.choices}submit(){return this.value=this.choices.map(e=>e.value),super.submit()}};gse.exports=kL});var pse=w((eft,hse)=>{\"use strict\";var gqe=Om(),RL=class extends gqe{constructor(e={}){if(super(e),this.emptyError=e.emptyError||\"No items were selected\",this.term=process.env.TERM_PROGRAM,!this.options.header){let t=[\"\",\"4 - Strongly Agree\",\"3 - Agree\",\"2 - Neutral\",\"1 - Disagree\",\"0 - Strongly Disagree\",\"\"];t=t.map(i=>this.styles.muted(i)),this.state.header=t.join(`\n   `)}}async toChoices(...e){if(this.createdScales)return!1;this.createdScales=!0;let t=await super.toChoices(...e);for(let i of t)i.scale=fqe(5,this.options),i.scaleIdx=2;return t}dispatch(){this.alert()}space(){let e=this.focused,t=e.scale[e.scaleIdx],i=t.selected;return e.scale.forEach(n=>n.selected=!1),t.selected=!i,this.render()}indicator(){return\"\"}pointer(){return\"\"}separator(){return this.styles.muted(this.symbols.ellipsis)}right(){let e=this.focused;return e.scaleIdx>=e.scale.length-1?this.alert():(e.scaleIdx++,this.render())}left(){let e=this.focused;return e.scaleIdx<=0?this.alert():(e.scaleIdx--,this.render())}indent(){return\"   \"}async renderChoice(e,t){await this.onChoice(e,t);let i=this.index===t,n=this.term===\"Hyper\",s=n?9:8,o=n?\"\":\" \",a=this.symbols.line.repeat(s),l=\" \".repeat(s+(n?0:1)),c=D=>(D?this.styles.success(\"\\u25C9\"):\"\\u25EF\")+o,u=t+1+\".\",g=i?this.styles.heading:this.styles.noop,f=await this.resolve(e.message,this.state,e,t),h=this.indent(e),p=h+e.scale.map((D,T)=>c(T===e.scaleIdx)).join(a),C=D=>D===e.scaleIdx?g(D):D,y=h+e.scale.map((D,T)=>C(T)).join(l),B=()=>[u,f].filter(Boolean).join(\" \"),v=()=>[B(),p,y,\" \"].filter(Boolean).join(`\n`);return i&&(p=this.styles.cyan(p),y=this.styles.cyan(y)),v()}async renderChoices(){if(this.state.submitted)return\"\";let e=this.visible.map(async(i,n)=>await this.renderChoice(i,n)),t=await Promise.all(e);return t.length||t.push(this.styles.danger(\"No matching choices\")),t.join(`\n`)}format(){return this.state.submitted?this.choices.map(t=>this.styles.info(t.scaleIdx)).join(\", \"):\"\"}async render(){let{submitted:e,size:t}=this.state,i=await this.prefix(),n=await this.separator(),s=await this.message(),o=[i,s,n].filter(Boolean).join(\" \");this.state.prompt=o;let a=await this.header(),l=await this.format(),c=await this.error()||await this.hint(),u=await this.renderChoices(),g=await this.footer();(l||!c)&&(o+=\" \"+l),c&&!o.includes(c)&&(o+=\" \"+c),e&&!l&&!u&&this.multiple&&this.type!==\"form\"&&(o+=this.styles.danger(this.emptyError)),this.clear(t),this.write([o,a,u,g].filter(Boolean).join(`\n`)),this.restore()}submit(){this.value={};for(let e of this.choices)this.value[e.name]=e.scaleIdx;return this.base.submit.call(this)}};function fqe(r,e={}){if(Array.isArray(e.scale))return e.scale.map(i=>({...i}));let t=[];for(let i=1;i<r+1;i++)t.push({i,selected:!1});return t}hse.exports=RL});var Cse=w((tft,dse)=>{dse.exports=IL()});var Ese=w((rft,mse)=>{\"use strict\";var hqe=xQ(),FL=class extends hqe{async initialize(){await super.initialize(),this.value=this.initial=!!this.options.initial,this.disabled=this.options.disabled||\"no\",this.enabled=this.options.enabled||\"yes\",await this.render()}reset(){this.value=this.initial,this.render()}delete(){this.alert()}toggle(){this.value=!this.value,this.render()}enable(){if(this.value===!0)return this.alert();this.value=!0,this.render()}disable(){if(this.value===!1)return this.alert();this.value=!1,this.render()}up(){this.toggle()}down(){this.toggle()}right(){this.toggle()}left(){this.toggle()}next(){this.toggle()}prev(){this.toggle()}dispatch(e=\"\",t){switch(e.toLowerCase()){case\" \":return this.toggle();case\"1\":case\"y\":case\"t\":return this.enable();case\"0\":case\"n\":case\"f\":return this.disable();default:return this.alert()}}format(){let e=i=>this.styles.primary.underline(i);return[this.value?this.disabled:e(this.disabled),this.value?e(this.enabled):this.enabled].join(this.styles.muted(\" / \"))}async render(){let{size:e}=this.state,t=await this.header(),i=await this.prefix(),n=await this.separator(),s=await this.message(),o=await this.format(),a=await this.error()||await this.hint(),l=await this.footer(),c=[i,s,n,o].join(\" \");this.state.prompt=c,a&&!c.includes(a)&&(c+=\" \"+a),this.clear(e),this.write([t,c,l].filter(Boolean).join(`\n`)),this.write(this.margin[2]),this.restore()}};mse.exports=FL});var yse=w((ift,Ise)=>{\"use strict\";var pqe=Cl(),NL=class extends pqe{constructor(e){if(super(e),typeof this.options.correctChoice!=\"number\"||this.options.correctChoice<0)throw new Error(\"Please specify the index of the correct answer from the list of choices\")}async toChoices(e,t){let i=await super.toChoices(e,t);if(i.length<2)throw new Error(\"Please give at least two choices to the user\");if(this.options.correctChoice>i.length)throw new Error(\"Please specify the index of the correct answer from the list of choices\");return i}check(e){return e.index===this.options.correctChoice}async result(e){return{selectedAnswer:e,correctAnswer:this.options.choices[this.options.correctChoice].value,correct:await this.check(this.state)}}};Ise.exports=NL});var Bse=w(TL=>{\"use strict\";var wse=ji(),ui=(r,e)=>{wse.defineExport(TL,r,e),wse.defineExport(TL,r.toLowerCase(),e)};ui(\"AutoComplete\",()=>Pne());ui(\"BasicAuth\",()=>Lne());ui(\"Confirm\",()=>Kne());ui(\"Editable\",()=>Hne());ui(\"Form\",()=>vQ());ui(\"Input\",()=>IL());ui(\"Invisible\",()=>zne());ui(\"List\",()=>Xne());ui(\"MultiSelect\",()=>_ne());ui(\"Numeral\",()=>tse());ui(\"Password\",()=>ise());ui(\"Scale\",()=>ose());ui(\"Select\",()=>Cl());ui(\"Snippet\",()=>use());ui(\"Sort\",()=>fse());ui(\"Survey\",()=>pse());ui(\"Text\",()=>Cse());ui(\"Toggle\",()=>Ese());ui(\"Quiz\",()=>yse())});var bse=w((sft,Qse)=>{Qse.exports={ArrayPrompt:Om(),AuthPrompt:hL(),BooleanPrompt:xQ(),NumberPrompt:bL(),StringPrompt:au()}});var Km=w((oft,vse)=>{\"use strict\";var Sse=J(\"assert\"),OL=J(\"events\"),ml=ji(),fo=class extends OL{constructor(e,t){super(),this.options=ml.merge({},e),this.answers={...t}}register(e,t){if(ml.isObject(e)){for(let n of Object.keys(e))this.register(n,e[n]);return this}Sse.equal(typeof t,\"function\",\"expected a function\");let i=e.toLowerCase();return t.prototype instanceof this.Prompt?this.prompts[i]=t:this.prompts[i]=t(this.Prompt,this),this}async prompt(e=[]){for(let t of[].concat(e))try{typeof t==\"function\"&&(t=await t.call(this)),await this.ask(ml.merge({},this.options,t))}catch(i){return Promise.reject(i)}return this.answers}async ask(e){typeof e==\"function\"&&(e=await e.call(this));let t=ml.merge({},this.options,e),{type:i,name:n}=e,{set:s,get:o}=ml;if(typeof i==\"function\"&&(i=await i.call(this,e,this.answers)),!i)return this.answers[n];Sse(this.prompts[i],`Prompt \"${i}\" is not registered`);let a=new this.prompts[i](t),l=o(this.answers,n);a.state.answers=this.answers,a.enquirer=this,n&&a.on(\"submit\",u=>{this.emit(\"answer\",n,u,a),s(this.answers,n,u)});let c=a.emit.bind(a);return a.emit=(...u)=>(this.emit.call(this,...u),c(...u)),this.emit(\"prompt\",a,this),t.autofill&&l!=null?(a.value=a.input=l,t.autofill===\"show\"&&await a.submit()):l=a.value=await a.run(),l}use(e){return e.call(this,this),this}set Prompt(e){this._Prompt=e}get Prompt(){return this._Prompt||this.constructor.Prompt}get prompts(){return this.constructor.prompts}static set Prompt(e){this._Prompt=e}static get Prompt(){return this._Prompt||Yh()}static get prompts(){return Bse()}static get types(){return bse()}static get prompt(){let e=(t,...i)=>{let n=new this(...i),s=n.emit.bind(n);return n.emit=(...o)=>(e.emit(...o),s(...o)),n.prompt(t)};return ml.mixinEmitter(e,new OL),e}};ml.mixinEmitter(fo,new OL);var LL=fo.prompts;for(let r of Object.keys(LL)){let e=r.toLowerCase(),t=i=>new LL[r](i).run();fo.prompt[e]=t,fo[e]=t,fo[r]||Reflect.defineProperty(fo,r,{get:()=>LL[r]})}var Mm=r=>{ml.defineExport(fo,r,()=>fo.types[r])};Mm(\"ArrayPrompt\");Mm(\"AuthPrompt\");Mm(\"BooleanPrompt\");Mm(\"NumberPrompt\");Mm(\"StringPrompt\");vse.exports=fo});var Ose=w((Wft,Lse)=>{function Iqe(r,e){for(var t=-1,i=r==null?0:r.length;++t<i&&e(r[t],t,r)!==!1;);return r}Lse.exports=Iqe});var Jh=w((zft,Mse)=>{var yqe=Y0(),wqe=Qh();function Bqe(r,e,t,i){var n=!t;t||(t={});for(var s=-1,o=e.length;++s<o;){var a=e[s],l=i?i(t[a],r[a],a,t,r):void 0;l===void 0&&(l=r[a]),n?wqe(t,a,l):yqe(t,a,l)}return t}Mse.exports=Bqe});var Use=w((Vft,Kse)=>{var Qqe=Jh(),bqe=Rh();function Sqe(r,e){return r&&Qqe(e,bqe(e),r)}Kse.exports=Sqe});var Gse=w((Xft,Hse)=>{function vqe(r){var e=[];if(r!=null)for(var t in Object(r))e.push(t);return e}Hse.exports=vqe});var jse=w((Zft,Yse)=>{var xqe=vn(),Pqe=aQ(),Dqe=Gse(),kqe=Object.prototype,Rqe=kqe.hasOwnProperty;function Fqe(r){if(!xqe(r))return Dqe(r);var e=Pqe(r),t=[];for(var i in r)i==\"constructor\"&&(e||!Rqe.call(r,i))||t.push(i);return t}Yse.exports=Fqe});var Wh=w((_ft,qse)=>{var Nqe=aT(),Tqe=jse(),Lqe=gm();function Oqe(r){return Lqe(r)?Nqe(r,!0):Tqe(r)}qse.exports=Oqe});var Wse=w(($ft,Jse)=>{var Mqe=Jh(),Kqe=Wh();function Uqe(r,e){return r&&Mqe(e,Kqe(e),r)}Jse.exports=Uqe});var YL=w((Ym,zh)=>{var Hqe=ys(),Zse=typeof Ym==\"object\"&&Ym&&!Ym.nodeType&&Ym,zse=Zse&&typeof zh==\"object\"&&zh&&!zh.nodeType&&zh,Gqe=zse&&zse.exports===Zse,Vse=Gqe?Hqe.Buffer:void 0,Xse=Vse?Vse.allocUnsafe:void 0;function Yqe(r,e){if(e)return r.slice();var t=r.length,i=Xse?Xse(t):new r.constructor(t);return r.copy(i),i}zh.exports=Yqe});var jL=w((eht,_se)=>{function jqe(r,e){var t=-1,i=r.length;for(e||(e=Array(i));++t<i;)e[t]=r[t];return e}_se.exports=jqe});var eoe=w((tht,$se)=>{var qqe=Jh(),Jqe=lQ();function Wqe(r,e){return qqe(r,Jqe(r),e)}$se.exports=Wqe});var kQ=w((rht,toe)=>{var zqe=AT(),Vqe=zqe(Object.getPrototypeOf,Object);toe.exports=Vqe});var qL=w((iht,roe)=>{var Xqe=q0(),Zqe=kQ(),_qe=lQ(),$qe=hT(),eJe=Object.getOwnPropertySymbols,tJe=eJe?function(r){for(var e=[];r;)Xqe(e,_qe(r)),r=Zqe(r);return e}:$qe;roe.exports=tJe});var noe=w((nht,ioe)=>{var rJe=Jh(),iJe=qL();function nJe(r,e){return rJe(r,iJe(r),e)}ioe.exports=nJe});var ooe=w((sht,soe)=>{var sJe=fT(),oJe=qL(),aJe=Wh();function AJe(r){return sJe(r,aJe,oJe)}soe.exports=AJe});var Aoe=w((oht,aoe)=>{var lJe=Object.prototype,cJe=lJe.hasOwnProperty;function uJe(r){var e=r.length,t=new r.constructor(e);return e&&typeof r[0]==\"string\"&&cJe.call(r,\"index\")&&(t.index=r.index,t.input=r.input),t}aoe.exports=uJe});var RQ=w((aht,coe)=>{var loe=uT();function gJe(r){var e=new r.constructor(r.byteLength);return new loe(e).set(new loe(r)),e}coe.exports=gJe});var goe=w((Aht,uoe)=>{var fJe=RQ();function hJe(r,e){var t=e?fJe(r.buffer):r.buffer;return new r.constructor(t,r.byteOffset,r.byteLength)}uoe.exports=hJe});var hoe=w((lht,foe)=>{var pJe=/\\w*$/;function dJe(r){var e=new r.constructor(r.source,pJe.exec(r));return e.lastIndex=r.lastIndex,e}foe.exports=dJe});var Eoe=w((cht,moe)=>{var poe=Rc(),doe=poe?poe.prototype:void 0,Coe=doe?doe.valueOf:void 0;function CJe(r){return Coe?Object(Coe.call(r)):{}}moe.exports=CJe});var JL=w((uht,Ioe)=>{var mJe=RQ();function EJe(r,e){var t=e?mJe(r.buffer):r.buffer;return new r.constructor(t,r.byteOffset,r.length)}Ioe.exports=EJe});var woe=w((ght,yoe)=>{var IJe=RQ(),yJe=goe(),wJe=hoe(),BJe=Eoe(),QJe=JL(),bJe=\"[object Boolean]\",SJe=\"[object Date]\",vJe=\"[object Map]\",xJe=\"[object Number]\",PJe=\"[object RegExp]\",DJe=\"[object Set]\",kJe=\"[object String]\",RJe=\"[object Symbol]\",FJe=\"[object ArrayBuffer]\",NJe=\"[object DataView]\",TJe=\"[object Float32Array]\",LJe=\"[object Float64Array]\",OJe=\"[object Int8Array]\",MJe=\"[object Int16Array]\",KJe=\"[object Int32Array]\",UJe=\"[object Uint8Array]\",HJe=\"[object Uint8ClampedArray]\",GJe=\"[object Uint16Array]\",YJe=\"[object Uint32Array]\";function jJe(r,e,t){var i=r.constructor;switch(e){case FJe:return IJe(r);case bJe:case SJe:return new i(+r);case NJe:return yJe(r,t);case TJe:case LJe:case OJe:case MJe:case KJe:case UJe:case HJe:case GJe:case YJe:return QJe(r,t);case vJe:return new i;case xJe:case kJe:return new i(r);case PJe:return wJe(r);case DJe:return new i;case RJe:return BJe(r)}}yoe.exports=jJe});var boe=w((fht,Qoe)=>{var qJe=vn(),Boe=Object.create,JJe=function(){function r(){}return function(e){if(!qJe(e))return{};if(Boe)return Boe(e);r.prototype=e;var t=new r;return r.prototype=void 0,t}}();Qoe.exports=JJe});var WL=w((hht,Soe)=>{var WJe=boe(),zJe=kQ(),VJe=aQ();function XJe(r){return typeof r.constructor==\"function\"&&!VJe(r)?WJe(zJe(r)):{}}Soe.exports=XJe});var xoe=w((pht,voe)=>{var ZJe=hm(),_Je=Jo(),$Je=\"[object Map]\";function e3e(r){return _Je(r)&&ZJe(r)==$Je}voe.exports=e3e});var Roe=w((dht,koe)=>{var t3e=xoe(),r3e=nQ(),Poe=sQ(),Doe=Poe&&Poe.isMap,i3e=Doe?r3e(Doe):t3e;koe.exports=i3e});var Noe=w((Cht,Foe)=>{var n3e=hm(),s3e=Jo(),o3e=\"[object Set]\";function a3e(r){return s3e(r)&&n3e(r)==o3e}Foe.exports=a3e});var Moe=w((mht,Ooe)=>{var A3e=Noe(),l3e=nQ(),Toe=sQ(),Loe=Toe&&Toe.isSet,c3e=Loe?l3e(Loe):A3e;Ooe.exports=c3e});var Yoe=w((Eht,Goe)=>{var u3e=fm(),g3e=Ose(),f3e=Y0(),h3e=Use(),p3e=Wse(),d3e=YL(),C3e=jL(),m3e=eoe(),E3e=noe(),I3e=pT(),y3e=ooe(),w3e=hm(),B3e=Aoe(),Q3e=woe(),b3e=WL(),S3e=vs(),v3e=lm(),x3e=Roe(),P3e=vn(),D3e=Moe(),k3e=Rh(),R3e=Wh(),F3e=1,N3e=2,T3e=4,Koe=\"[object Arguments]\",L3e=\"[object Array]\",O3e=\"[object Boolean]\",M3e=\"[object Date]\",K3e=\"[object Error]\",Uoe=\"[object Function]\",U3e=\"[object GeneratorFunction]\",H3e=\"[object Map]\",G3e=\"[object Number]\",Hoe=\"[object Object]\",Y3e=\"[object RegExp]\",j3e=\"[object Set]\",q3e=\"[object String]\",J3e=\"[object Symbol]\",W3e=\"[object WeakMap]\",z3e=\"[object ArrayBuffer]\",V3e=\"[object DataView]\",X3e=\"[object Float32Array]\",Z3e=\"[object Float64Array]\",_3e=\"[object Int8Array]\",$3e=\"[object Int16Array]\",e4e=\"[object Int32Array]\",t4e=\"[object Uint8Array]\",r4e=\"[object Uint8ClampedArray]\",i4e=\"[object Uint16Array]\",n4e=\"[object Uint32Array]\",ur={};ur[Koe]=ur[L3e]=ur[z3e]=ur[V3e]=ur[O3e]=ur[M3e]=ur[X3e]=ur[Z3e]=ur[_3e]=ur[$3e]=ur[e4e]=ur[H3e]=ur[G3e]=ur[Hoe]=ur[Y3e]=ur[j3e]=ur[q3e]=ur[J3e]=ur[t4e]=ur[r4e]=ur[i4e]=ur[n4e]=!0;ur[K3e]=ur[Uoe]=ur[W3e]=!1;function FQ(r,e,t,i,n,s){var o,a=e&F3e,l=e&N3e,c=e&T3e;if(t&&(o=n?t(r,i,n,s):t(r)),o!==void 0)return o;if(!P3e(r))return r;var u=S3e(r);if(u){if(o=B3e(r),!a)return C3e(r,o)}else{var g=w3e(r),f=g==Uoe||g==U3e;if(v3e(r))return d3e(r,a);if(g==Hoe||g==Koe||f&&!n){if(o=l||f?{}:b3e(r),!a)return l?E3e(r,p3e(o,r)):m3e(r,h3e(o,r))}else{if(!ur[g])return n?r:{};o=Q3e(r,g,a)}}s||(s=new u3e);var h=s.get(r);if(h)return h;s.set(r,o),D3e(r)?r.forEach(function(y){o.add(FQ(y,e,t,y,r,s))}):x3e(r)&&r.forEach(function(y,B){o.set(B,FQ(y,e,t,B,r,s))});var p=c?l?y3e:I3e:l?R3e:k3e,C=u?void 0:p(r);return g3e(C||r,function(y,B){C&&(B=y,y=r[B]),f3e(o,B,FQ(y,e,t,B,r,s))}),o}Goe.exports=FQ});var zL=w((Iht,joe)=>{var s4e=Yoe(),o4e=1,a4e=4;function A4e(r){return s4e(r,o4e|a4e)}joe.exports=A4e});var Joe=w((yht,qoe)=>{var l4e=KN();function c4e(r,e,t){return r==null?r:l4e(r,e,t)}qoe.exports=c4e});var Zoe=w((vht,Xoe)=>{function u4e(r){var e=r==null?0:r.length;return e?r[e-1]:void 0}Xoe.exports=u4e});var $oe=w((xht,_oe)=>{var g4e=rm(),f4e=HR();function h4e(r,e){return e.length<2?r:g4e(r,f4e(e,0,-1))}_oe.exports=h4e});var tae=w((Pht,eae)=>{var p4e=Bh(),d4e=Zoe(),C4e=$oe(),m4e=Zc();function E4e(r,e){return e=p4e(e,r),r=C4e(r,e),r==null||delete r[m4e(d4e(e))]}eae.exports=E4e});var iae=w((Dht,rae)=>{var I4e=tae();function y4e(r,e){return r==null?!0:I4e(r,e)}rae.exports=y4e});var Aae=w((npt,Q4e)=>{Q4e.exports={name:\"@yarnpkg/cli\",version:\"3.6.0\",license:\"BSD-2-Clause\",main:\"./sources/index.ts\",dependencies:{\"@yarnpkg/core\":\"workspace:^\",\"@yarnpkg/fslib\":\"workspace:^\",\"@yarnpkg/libzip\":\"workspace:^\",\"@yarnpkg/parsers\":\"workspace:^\",\"@yarnpkg/plugin-compat\":\"workspace:^\",\"@yarnpkg/plugin-dlx\":\"workspace:^\",\"@yarnpkg/plugin-essentials\":\"workspace:^\",\"@yarnpkg/plugin-file\":\"workspace:^\",\"@yarnpkg/plugin-git\":\"workspace:^\",\"@yarnpkg/plugin-github\":\"workspace:^\",\"@yarnpkg/plugin-http\":\"workspace:^\",\"@yarnpkg/plugin-init\":\"workspace:^\",\"@yarnpkg/plugin-link\":\"workspace:^\",\"@yarnpkg/plugin-nm\":\"workspace:^\",\"@yarnpkg/plugin-npm\":\"workspace:^\",\"@yarnpkg/plugin-npm-cli\":\"workspace:^\",\"@yarnpkg/plugin-pack\":\"workspace:^\",\"@yarnpkg/plugin-patch\":\"workspace:^\",\"@yarnpkg/plugin-pnp\":\"workspace:^\",\"@yarnpkg/plugin-pnpm\":\"workspace:^\",\"@yarnpkg/shell\":\"workspace:^\",chalk:\"^3.0.0\",\"ci-info\":\"^3.2.0\",clipanion:\"3.2.0-rc.4\",semver:\"^7.1.2\",tslib:\"^1.13.0\",typanion:\"^3.3.0\",yup:\"^0.32.9\"},devDependencies:{\"@types/semver\":\"^7.1.0\",\"@types/yup\":\"^0\",\"@yarnpkg/builder\":\"workspace:^\",\"@yarnpkg/monorepo\":\"workspace:^\",\"@yarnpkg/pnpify\":\"workspace:^\",micromatch:\"^4.0.2\"},peerDependencies:{\"@yarnpkg/core\":\"workspace:^\"},scripts:{postpack:\"rm -rf lib\",prepack:'run build:compile \"$(pwd)\"',\"build:cli+hook\":\"run build:pnp:hook && builder build bundle\",\"build:cli\":\"builder build bundle\",\"run:cli\":\"builder run\",\"update-local\":\"run build:cli --no-git-hash && rsync -a --delete bundles/ bin/\"},publishConfig:{main:\"./lib/index.js\",types:\"./lib/index.d.ts\",bin:null},files:[\"/lib/**/*\",\"!/lib/pluginConfiguration.*\",\"!/lib/cli.*\"],\"@yarnpkg/builder\":{bundles:{standard:[\"@yarnpkg/plugin-essentials\",\"@yarnpkg/plugin-compat\",\"@yarnpkg/plugin-dlx\",\"@yarnpkg/plugin-file\",\"@yarnpkg/plugin-git\",\"@yarnpkg/plugin-github\",\"@yarnpkg/plugin-http\",\"@yarnpkg/plugin-init\",\"@yarnpkg/plugin-link\",\"@yarnpkg/plugin-nm\",\"@yarnpkg/plugin-npm\",\"@yarnpkg/plugin-npm-cli\",\"@yarnpkg/plugin-pack\",\"@yarnpkg/plugin-patch\",\"@yarnpkg/plugin-pnp\",\"@yarnpkg/plugin-pnpm\"]}},repository:{type:\"git\",url:\"ssh://git@github.com/yarnpkg/berry.git\",directory:\"packages/yarnpkg-cli\"},engines:{node:\">=12 <14 || 14.2 - 14.9 || >14.10.0\"}}});var nO=w((Pmt,wae)=>{\"use strict\";wae.exports=function(e,t){t===!0&&(t=0);var i=\"\";if(typeof e==\"string\")try{i=new URL(e).protocol}catch{}else e&&e.constructor===URL&&(i=e.protocol);var n=i.split(/\\:|\\+/).filter(Boolean);return typeof t==\"number\"?n[t]:n}});var Qae=w((Dmt,Bae)=>{\"use strict\";var Y4e=nO();function j4e(r){var e={protocols:[],protocol:null,port:null,resource:\"\",host:\"\",user:\"\",password:\"\",pathname:\"\",hash:\"\",search:\"\",href:r,query:{},parse_failed:!1};try{var t=new URL(r);e.protocols=Y4e(t),e.protocol=e.protocols[0],e.port=t.port,e.resource=t.hostname,e.host=t.host,e.user=t.username||\"\",e.password=t.password||\"\",e.pathname=t.pathname,e.hash=t.hash.slice(1),e.search=t.search.slice(1),e.href=t.href,e.query=Object.fromEntries(t.searchParams)}catch{e.protocols=[\"file\"],e.protocol=e.protocols[0],e.port=\"\",e.resource=\"\",e.user=\"\",e.pathname=\"\",e.hash=\"\",e.search=\"\",e.href=r,e.query={},e.parse_failed=!0}return e}Bae.exports=j4e});var vae=w((kmt,Sae)=>{\"use strict\";var q4e=Qae();function J4e(r){return r&&typeof r==\"object\"&&\"default\"in r?r:{default:r}}var W4e=J4e(q4e),z4e=\"text/plain\",V4e=\"us-ascii\",bae=(r,e)=>e.some(t=>t instanceof RegExp?t.test(r):t===r),X4e=(r,{stripHash:e})=>{let t=/^data:(?<type>[^,]*?),(?<data>[^#]*?)(?:#(?<hash>.*))?$/.exec(r);if(!t)throw new Error(`Invalid URL: ${r}`);let{type:i,data:n,hash:s}=t.groups,o=i.split(\";\");s=e?\"\":s;let a=!1;o[o.length-1]===\"base64\"&&(o.pop(),a=!0);let l=(o.shift()||\"\").toLowerCase(),u=[...o.map(g=>{let[f,h=\"\"]=g.split(\"=\").map(p=>p.trim());return f===\"charset\"&&(h=h.toLowerCase(),h===V4e)?\"\":`${f}${h?`=${h}`:\"\"}`}).filter(Boolean)];return a&&u.push(\"base64\"),(u.length>0||l&&l!==z4e)&&u.unshift(l),`data:${u.join(\";\")},${a?n.trim():n}${s?`#${s}`:\"\"}`};function Z4e(r,e){if(e={defaultProtocol:\"http:\",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripAuthentication:!0,stripHash:!1,stripTextFragment:!0,stripWWW:!0,removeQueryParameters:[/^utm_\\w+/i],removeTrailingSlash:!0,removeSingleSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0,...e},r=r.trim(),/^data:/i.test(r))return X4e(r,e);if(/^view-source:/i.test(r))throw new Error(\"`view-source:` is not supported as it is a non-standard protocol\");let t=r.startsWith(\"//\");!t&&/^\\.*\\//.test(r)||(r=r.replace(/^(?!(?:\\w+:)?\\/\\/)|^\\/\\//,e.defaultProtocol));let n=new URL(r);if(e.forceHttp&&e.forceHttps)throw new Error(\"The `forceHttp` and `forceHttps` options cannot be used together\");if(e.forceHttp&&n.protocol===\"https:\"&&(n.protocol=\"http:\"),e.forceHttps&&n.protocol===\"http:\"&&(n.protocol=\"https:\"),e.stripAuthentication&&(n.username=\"\",n.password=\"\"),e.stripHash?n.hash=\"\":e.stripTextFragment&&(n.hash=n.hash.replace(/#?:~:text.*?$/i,\"\")),n.pathname){let o=/\\b[a-z][a-z\\d+\\-.]{1,50}:\\/\\//g,a=0,l=\"\";for(;;){let u=o.exec(n.pathname);if(!u)break;let g=u[0],f=u.index,h=n.pathname.slice(a,f);l+=h.replace(/\\/{2,}/g,\"/\"),l+=g,a=f+g.length}let c=n.pathname.slice(a,n.pathname.length);l+=c.replace(/\\/{2,}/g,\"/\"),n.pathname=l}if(n.pathname)try{n.pathname=decodeURI(n.pathname)}catch{}if(e.removeDirectoryIndex===!0&&(e.removeDirectoryIndex=[/^index\\.[a-z]+$/]),Array.isArray(e.removeDirectoryIndex)&&e.removeDirectoryIndex.length>0){let o=n.pathname.split(\"/\"),a=o[o.length-1];bae(a,e.removeDirectoryIndex)&&(o=o.slice(0,-1),n.pathname=o.slice(1).join(\"/\")+\"/\")}if(n.hostname&&(n.hostname=n.hostname.replace(/\\.$/,\"\"),e.stripWWW&&/^www\\.(?!www\\.)[a-z\\-\\d]{1,63}\\.[a-z.\\-\\d]{2,63}$/.test(n.hostname)&&(n.hostname=n.hostname.replace(/^www\\./,\"\"))),Array.isArray(e.removeQueryParameters))for(let o of[...n.searchParams.keys()])bae(o,e.removeQueryParameters)&&n.searchParams.delete(o);if(e.removeQueryParameters===!0&&(n.search=\"\"),e.sortQueryParameters){n.searchParams.sort();try{n.search=decodeURIComponent(n.search)}catch{}}e.removeTrailingSlash&&(n.pathname=n.pathname.replace(/\\/$/,\"\"));let s=r;return r=n.toString(),!e.removeSingleSlash&&n.pathname===\"/\"&&!s.endsWith(\"/\")&&n.hash===\"\"&&(r=r.replace(/\\/$/,\"\")),(e.removeTrailingSlash||n.pathname===\"/\")&&n.hash===\"\"&&e.removeSingleSlash&&(r=r.replace(/\\/$/,\"\")),t&&!e.normalizeProtocol&&(r=r.replace(/^http:\\/\\//,\"//\")),e.stripProtocol&&(r=r.replace(/^(?:https?:)?\\/\\//,\"\")),r}var sO=(r,e=!1)=>{let t=/^(?:([a-z_][a-z0-9_-]{0,31})@|https?:\\/\\/)([\\w\\.\\-@]+)[\\/:]([\\~,\\.\\w,\\-,\\_,\\/]+?(?:\\.git|\\/)?)$/,i=s=>{let o=new Error(s);throw o.subject_url=r,o};(typeof r!=\"string\"||!r.trim())&&i(\"Invalid url.\"),r.length>sO.MAX_INPUT_LENGTH&&i(\"Input exceeds maximum length. If needed, change the value of parseUrl.MAX_INPUT_LENGTH.\"),e&&(typeof e!=\"object\"&&(e={stripHash:!1}),r=Z4e(r,e));let n=W4e.default(r);if(n.parse_failed){let s=n.href.match(t);s?(n.protocols=[\"ssh\"],n.protocol=\"ssh\",n.resource=s[2],n.host=s[2],n.user=s[1],n.pathname=`/${s[3]}`,n.parse_failed=!1):i(\"URL parsing failed.\")}return n};sO.MAX_INPUT_LENGTH=2048;Sae.exports=sO});var Dae=w((Rmt,Pae)=>{\"use strict\";var _4e=nO();function xae(r){if(Array.isArray(r))return r.indexOf(\"ssh\")!==-1||r.indexOf(\"rsync\")!==-1;if(typeof r!=\"string\")return!1;var e=_4e(r);if(r=r.substring(r.indexOf(\"://\")+3),xae(e))return!0;var t=new RegExp(\".([a-zA-Z\\\\d]+):(\\\\d+)/\");return!r.match(t)&&r.indexOf(\"@\")<r.indexOf(\":\")}Pae.exports=xae});var Fae=w((Fmt,Rae)=>{\"use strict\";var $4e=vae(),kae=Dae();function eWe(r){var e=$4e(r);return e.token=\"\",e.password===\"x-oauth-basic\"?e.token=e.user:e.user===\"x-token-auth\"&&(e.token=e.password),kae(e.protocols)||e.protocols.length===0&&kae(r)?e.protocol=\"ssh\":e.protocols.length?e.protocol=e.protocols[0]:(e.protocol=\"file\",e.protocols=[\"file\"]),e.href=e.href.replace(/\\/$/,\"\"),e}Rae.exports=eWe});var Tae=w((Nmt,Nae)=>{\"use strict\";var tWe=Fae();function oO(r){if(typeof r!=\"string\")throw new Error(\"The url must be a string.\");var e=/^([a-z\\d-]{1,39})\\/([-\\.\\w]{1,100})$/i;e.test(r)&&(r=\"https://github.com/\"+r);var t=tWe(r),i=t.resource.split(\".\"),n=null;switch(t.toString=function(y){return oO.stringify(this,y)},t.source=i.length>2?i.slice(1-i.length).join(\".\"):t.source=t.resource,t.git_suffix=/\\.git$/.test(t.pathname),t.name=decodeURIComponent((t.pathname||t.href).replace(/(^\\/)|(\\/$)/g,\"\").replace(/\\.git$/,\"\")),t.owner=decodeURIComponent(t.user),t.source){case\"git.cloudforge.com\":t.owner=t.user,t.organization=i[0],t.source=\"cloudforge.com\";break;case\"visualstudio.com\":if(t.resource===\"vs-ssh.visualstudio.com\"){n=t.name.split(\"/\"),n.length===4&&(t.organization=n[1],t.owner=n[2],t.name=n[3],t.full_name=n[2]+\"/\"+n[3]);break}else{n=t.name.split(\"/\"),n.length===2?(t.owner=n[1],t.name=n[1],t.full_name=\"_git/\"+t.name):n.length===3?(t.name=n[2],n[0]===\"DefaultCollection\"?(t.owner=n[2],t.organization=n[0],t.full_name=t.organization+\"/_git/\"+t.name):(t.owner=n[0],t.full_name=t.owner+\"/_git/\"+t.name)):n.length===4&&(t.organization=n[0],t.owner=n[1],t.name=n[3],t.full_name=t.organization+\"/\"+t.owner+\"/_git/\"+t.name);break}case\"dev.azure.com\":case\"azure.com\":if(t.resource===\"ssh.dev.azure.com\"){n=t.name.split(\"/\"),n.length===4&&(t.organization=n[1],t.owner=n[2],t.name=n[3]);break}else{n=t.name.split(\"/\"),n.length===5?(t.organization=n[0],t.owner=n[1],t.name=n[4],t.full_name=\"_git/\"+t.name):n.length===3?(t.name=n[2],n[0]===\"DefaultCollection\"?(t.owner=n[2],t.organization=n[0],t.full_name=t.organization+\"/_git/\"+t.name):(t.owner=n[0],t.full_name=t.owner+\"/_git/\"+t.name)):n.length===4&&(t.organization=n[0],t.owner=n[1],t.name=n[3],t.full_name=t.organization+\"/\"+t.owner+\"/_git/\"+t.name),t.query&&t.query.path&&(t.filepath=t.query.path.replace(/^\\/+/g,\"\")),t.query&&t.query.version&&(t.ref=t.query.version.replace(/^GB/,\"\"));break}default:n=t.name.split(\"/\");var s=n.length-1;if(n.length>=2){var o=n.indexOf(\"-\",2),a=n.indexOf(\"blob\",2),l=n.indexOf(\"tree\",2),c=n.indexOf(\"commit\",2),u=n.indexOf(\"src\",2),g=n.indexOf(\"raw\",2),f=n.indexOf(\"edit\",2);s=o>0?o-1:a>0?a-1:l>0?l-1:c>0?c-1:u>0?u-1:g>0?g-1:f>0?f-1:s,t.owner=n.slice(0,s).join(\"/\"),t.name=n[s],c&&(t.commit=n[s+2])}t.ref=\"\",t.filepathtype=\"\",t.filepath=\"\";var h=n.length>s&&n[s+1]===\"-\"?s+1:s;n.length>h+2&&[\"raw\",\"src\",\"blob\",\"tree\",\"edit\"].indexOf(n[h+1])>=0&&(t.filepathtype=n[h+1],t.ref=n[h+2],n.length>h+3&&(t.filepath=n.slice(h+3).join(\"/\"))),t.organization=t.owner;break}t.full_name||(t.full_name=t.owner,t.name&&(t.full_name&&(t.full_name+=\"/\"),t.full_name+=t.name)),t.owner.startsWith(\"scm/\")&&(t.source=\"bitbucket-server\",t.owner=t.owner.replace(\"scm/\",\"\"),t.organization=t.owner,t.full_name=t.owner+\"/\"+t.name);var p=/(projects|users)\\/(.*?)\\/repos\\/(.*?)((\\/.*$)|$)/,C=p.exec(t.pathname);return C!=null&&(t.source=\"bitbucket-server\",C[1]===\"users\"?t.owner=\"~\"+C[2]:t.owner=C[2],t.organization=t.owner,t.name=C[3],n=C[4].split(\"/\"),n.length>1&&([\"raw\",\"browse\"].indexOf(n[1])>=0?(t.filepathtype=n[1],n.length>2&&(t.filepath=n.slice(2).join(\"/\"))):n[1]===\"commits\"&&n.length>2&&(t.commit=n[2])),t.full_name=t.owner+\"/\"+t.name,t.query.at?t.ref=t.query.at:t.ref=\"\"),t}oO.stringify=function(r,e){e=e||(r.protocols&&r.protocols.length?r.protocols.join(\"+\"):r.protocol);var t=r.port?\":\"+r.port:\"\",i=r.user||\"git\",n=r.git_suffix?\".git\":\"\";switch(e){case\"ssh\":return t?\"ssh://\"+i+\"@\"+r.resource+t+\"/\"+r.full_name+n:i+\"@\"+r.resource+\":\"+r.full_name+n;case\"git+ssh\":case\"ssh+git\":case\"ftp\":case\"ftps\":return e+\"://\"+i+\"@\"+r.resource+t+\"/\"+r.full_name+n;case\"http\":case\"https\":var s=r.token?rWe(r):r.user&&(r.protocols.includes(\"http\")||r.protocols.includes(\"https\"))?r.user+\"@\":\"\";return e+\"://\"+s+r.resource+t+\"/\"+iWe(r)+n;default:return r.href}};function rWe(r){switch(r.source){case\"bitbucket.org\":return\"x-token-auth:\"+r.token+\"@\";default:return r.token+\"@\"}}function iWe(r){switch(r.source){case\"bitbucket-server\":return\"scm/\"+r.full_name;default:return\"\"+r.full_name}}Nae.exports=oO});var xO=w((Qyt,tAe)=>{var QWe=Qh(),bWe=Ih();function SWe(r,e,t){(t!==void 0&&!bWe(r[e],t)||t===void 0&&!(e in r))&&QWe(r,e,t)}tAe.exports=SWe});var iAe=w((byt,rAe)=>{var vWe=gm(),xWe=Jo();function PWe(r){return xWe(r)&&vWe(r)}rAe.exports=PWe});var oAe=w((Syt,sAe)=>{var DWe=Fc(),kWe=kQ(),RWe=Jo(),FWe=\"[object Object]\",NWe=Function.prototype,TWe=Object.prototype,nAe=NWe.toString,LWe=TWe.hasOwnProperty,OWe=nAe.call(Object);function MWe(r){if(!RWe(r)||DWe(r)!=FWe)return!1;var e=kWe(r);if(e===null)return!0;var t=LWe.call(e,\"constructor\")&&e.constructor;return typeof t==\"function\"&&t instanceof t&&nAe.call(t)==OWe}sAe.exports=MWe});var PO=w((vyt,aAe)=>{function KWe(r,e){if(!(e===\"constructor\"&&typeof r[e]==\"function\")&&e!=\"__proto__\")return r[e]}aAe.exports=KWe});var lAe=w((xyt,AAe)=>{var UWe=Jh(),HWe=Wh();function GWe(r){return UWe(r,HWe(r))}AAe.exports=GWe});var pAe=w((Pyt,hAe)=>{var cAe=xO(),YWe=YL(),jWe=JL(),qWe=jL(),JWe=WL(),uAe=nm(),gAe=vs(),WWe=iAe(),zWe=lm(),VWe=U0(),XWe=vn(),ZWe=oAe(),_We=oQ(),fAe=PO(),$We=lAe();function e8e(r,e,t,i,n,s,o){var a=fAe(r,t),l=fAe(e,t),c=o.get(l);if(c){cAe(r,t,c);return}var u=s?s(a,l,t+\"\",r,e,o):void 0,g=u===void 0;if(g){var f=gAe(l),h=!f&&zWe(l),p=!f&&!h&&_We(l);u=l,f||h||p?gAe(a)?u=a:WWe(a)?u=qWe(a):h?(g=!1,u=YWe(l,!0)):p?(g=!1,u=jWe(l,!0)):u=[]:ZWe(l)||uAe(l)?(u=a,uAe(a)?u=$We(a):(!XWe(a)||VWe(a))&&(u=JWe(l))):g=!1}g&&(o.set(l,u),n(u,l,i,s,o),o.delete(l)),cAe(r,t,u)}hAe.exports=e8e});var mAe=w((Dyt,CAe)=>{var t8e=fm(),r8e=xO(),i8e=sT(),n8e=pAe(),s8e=vn(),o8e=Wh(),a8e=PO();function dAe(r,e,t,i,n){r!==e&&i8e(e,function(s,o){if(n||(n=new t8e),s8e(s))n8e(r,e,o,t,dAe,i,n);else{var a=i?i(a8e(r,o),s,o+\"\",r,e,n):void 0;a===void 0&&(a=s),r8e(r,o,a)}},o8e)}CAe.exports=dAe});var IAe=w((kyt,EAe)=>{var A8e=J0(),l8e=GN(),c8e=YN();function u8e(r,e){return c8e(l8e(r,e,A8e),r+\"\")}EAe.exports=u8e});var wAe=w((Ryt,yAe)=>{var g8e=Ih(),f8e=gm(),h8e=im(),p8e=vn();function d8e(r,e,t){if(!p8e(t))return!1;var i=typeof e;return(i==\"number\"?f8e(t)&&h8e(e,t.length):i==\"string\"&&e in t)?g8e(t[e],r):!1}yAe.exports=d8e});var QAe=w((Fyt,BAe)=>{var C8e=IAe(),m8e=wAe();function E8e(r){return C8e(function(e,t){var i=-1,n=t.length,s=n>1?t[n-1]:void 0,o=n>2?t[2]:void 0;for(s=r.length>3&&typeof s==\"function\"?(n--,s):void 0,o&&m8e(t[0],t[1],o)&&(s=n<3?void 0:s,n=1),e=Object(e);++i<n;){var a=t[i];a&&r(e,a,i,s)}return e})}BAe.exports=E8e});var SAe=w((Nyt,bAe)=>{var I8e=mAe(),y8e=QAe(),w8e=y8e(function(r,e,t){I8e(r,e,t)});bAe.exports=w8e});var UAe=w((Fwt,KAe)=>{var KO;KAe.exports=()=>(typeof KO>\"u\"&&(KO=J(\"zlib\").brotliDecompressSync(Buffer.from(\"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\",\"base64\")).toString()),KO)});var ale=w((iBt,ole)=>{var zO=Symbol(\"arg flag\"),Rn=class extends Error{constructor(e,t){super(e),this.name=\"ArgError\",this.code=t,Object.setPrototypeOf(this,Rn.prototype)}};function uE(r,{argv:e=process.argv.slice(2),permissive:t=!1,stopAtPositional:i=!1}={}){if(!r)throw new Rn(\"argument specification object is required\",\"ARG_CONFIG_NO_SPEC\");let n={_:[]},s={},o={};for(let a of Object.keys(r)){if(!a)throw new Rn(\"argument key cannot be an empty string\",\"ARG_CONFIG_EMPTY_KEY\");if(a[0]!==\"-\")throw new Rn(`argument key must start with '-' but found: '${a}'`,\"ARG_CONFIG_NONOPT_KEY\");if(a.length===1)throw new Rn(`argument key must have a name; singular '-' keys are not allowed: ${a}`,\"ARG_CONFIG_NONAME_KEY\");if(typeof r[a]==\"string\"){s[a]=r[a];continue}let l=r[a],c=!1;if(Array.isArray(l)&&l.length===1&&typeof l[0]==\"function\"){let[u]=l;l=(g,f,h=[])=>(h.push(u(g,f,h[h.length-1])),h),c=u===Boolean||u[zO]===!0}else if(typeof l==\"function\")c=l===Boolean||l[zO]===!0;else throw new Rn(`type missing or not a function or valid array type: ${a}`,\"ARG_CONFIG_VAD_TYPE\");if(a[1]!==\"-\"&&a.length>2)throw new Rn(`short argument keys (with a single hyphen) must have only one character: ${a}`,\"ARG_CONFIG_SHORTOPT_TOOLONG\");o[a]=[l,c]}for(let a=0,l=e.length;a<l;a++){let c=e[a];if(i&&n._.length>0){n._=n._.concat(e.slice(a));break}if(c===\"--\"){n._=n._.concat(e.slice(a+1));break}if(c.length>1&&c[0]===\"-\"){let u=c[1]===\"-\"||c.length===2?[c]:c.slice(1).split(\"\").map(g=>`-${g}`);for(let g=0;g<u.length;g++){let f=u[g],[h,p]=f[1]===\"-\"?f.split(/=(.*)/,2):[f,void 0],C=h;for(;C in s;)C=s[C];if(!(C in o))if(t){n._.push(f);continue}else throw new Rn(`unknown or unexpected option: ${h}`,\"ARG_UNKNOWN_OPTION\");let[y,B]=o[C];if(!B&&g+1<u.length)throw new Rn(`option requires argument (but was followed by another short argument): ${h}`,\"ARG_MISSING_REQUIRED_SHORTARG\");if(B)n[C]=y(!0,C,n[C]);else if(p===void 0){if(e.length<a+2||e[a+1].length>1&&e[a+1][0]===\"-\"&&!(e[a+1].match(/^-?\\d*(\\.(?=\\d))?\\d*$/)&&(y===Number||typeof BigInt<\"u\"&&y===BigInt))){let v=h===C?\"\":` (alias for ${C})`;throw new Rn(`option requires argument: ${h}${v}`,\"ARG_MISSING_REQUIRED_LONGARG\")}n[C]=y(e[a+1],C,n[C]),++a}else n[C]=y(p,C,n[C])}}else n._.push(c)}return n}uE.flag=r=>(r[zO]=!0,r);uE.COUNT=uE.flag((r,e,t)=>(t||0)+1);uE.ArgError=Rn;ole.exports=uE});var mle=w((NBt,Cle)=>{var _O;Cle.exports=()=>(typeof _O>\"u\"&&(_O=J(\"zlib\").brotliDecompressSync(Buffer.from(\"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\",\"base64\")).toString()),_O)});var ble=w((nM,sM)=>{(function(r){nM&&typeof nM==\"object\"&&typeof sM<\"u\"?sM.exports=r():typeof define==\"function\"&&define.amd?define([],r):typeof window<\"u\"?window.isWindows=r():typeof global<\"u\"?global.isWindows=r():typeof self<\"u\"?self.isWindows=r():this.isWindows=r()})(function(){\"use strict\";return function(){return process&&(process.platform===\"win32\"||/^(msys|cygwin)$/.test(process.env.OSTYPE))}})});var Ple=w((F0t,xle)=>{\"use strict\";oM.ifExists=Ize;var np=J(\"util\"),Ts=J(\"path\"),Sle=ble(),Cze=/^#!\\s*(?:\\/usr\\/bin\\/env)?\\s*([^ \\t]+)(.*)$/,mze={createPwshFile:!0,createCmdFile:Sle(),fs:J(\"fs\")},Eze=new Map([[\".js\",\"node\"],[\".cjs\",\"node\"],[\".mjs\",\"node\"],[\".cmd\",\"cmd\"],[\".bat\",\"cmd\"],[\".ps1\",\"pwsh\"],[\".sh\",\"sh\"]]);function vle(r){let e={...mze,...r},t=e.fs;return e.fs_={chmod:t.chmod?np.promisify(t.chmod):async()=>{},mkdir:np.promisify(t.mkdir),readFile:np.promisify(t.readFile),stat:np.promisify(t.stat),unlink:np.promisify(t.unlink),writeFile:np.promisify(t.writeFile)},e}async function oM(r,e,t){let i=vle(t);await i.fs_.stat(r),await wze(r,e,i)}function Ize(r,e,t){return oM(r,e,t).catch(()=>{})}function yze(r,e){return e.fs_.unlink(r).catch(()=>{})}async function wze(r,e,t){let i=await vze(r,t);return await Bze(e,t),Qze(r,e,i,t)}function Bze(r,e){return e.fs_.mkdir(Ts.dirname(r),{recursive:!0})}function Qze(r,e,t,i){let n=vle(i),s=[{generator:Dze,extension:\"\"}];return n.createCmdFile&&s.push({generator:Pze,extension:\".cmd\"}),n.createPwshFile&&s.push({generator:kze,extension:\".ps1\"}),Promise.all(s.map(o=>xze(r,e+o.extension,t,o.generator,n)))}function bze(r,e){return yze(r,e)}function Sze(r,e){return Rze(r,e)}async function vze(r,e){let n=(await e.fs_.readFile(r,\"utf8\")).trim().split(/\\r*\\n/)[0].match(Cze);if(!n){let s=Ts.extname(r).toLowerCase();return{program:Eze.get(s)||null,additionalArgs:\"\"}}return{program:n[1],additionalArgs:n[2]}}async function xze(r,e,t,i,n){let s=n.preserveSymlinks?\"--preserve-symlinks\":\"\",o=[t.additionalArgs,s].filter(a=>a).join(\" \");return n=Object.assign({},n,{prog:t.program,args:o}),await bze(e,n),await n.fs_.writeFile(e,i(r,e,n),\"utf8\"),Sze(e,n)}function Pze(r,e,t){let n=Ts.relative(Ts.dirname(e),r).split(\"/\").join(\"\\\\\"),s=Ts.isAbsolute(n)?`\"${n}\"`:`\"%~dp0\\\\${n}\"`,o,a=t.prog,l=t.args||\"\",c=aM(t.nodePath).win32;a?(o=`\"%~dp0\\\\${a}.exe\"`,n=s):(a=s,l=\"\",n=\"\");let u=t.progArgs?`${t.progArgs.join(\" \")} `:\"\",g=c?`@SET NODE_PATH=${c}\\r\n`:\"\";return o?g+=`@IF EXIST ${o} (\\r\n  ${o} ${l} ${n} ${u}%*\\r\n) ELSE (\\r\n  @SETLOCAL\\r\n  @SET PATHEXT=%PATHEXT:;.JS;=;%\\r\n  ${a} ${l} ${n} ${u}%*\\r\n)\\r\n`:g+=`@${a} ${l} ${n} ${u}%*\\r\n`,g}function Dze(r,e,t){let i=Ts.relative(Ts.dirname(e),r),n=t.prog&&t.prog.split(\"\\\\\").join(\"/\"),s;i=i.split(\"\\\\\").join(\"/\");let o=Ts.isAbsolute(i)?`\"${i}\"`:`\"$basedir/${i}\"`,a=t.args||\"\",l=aM(t.nodePath).posix;n?(s=`\"$basedir/${t.prog}\"`,i=o):(n=o,a=\"\",i=\"\");let c=t.progArgs?`${t.progArgs.join(\" \")} `:\"\",u=`#!/bin/sh\nbasedir=$(dirname \"$(echo \"$0\" | sed -e 's,\\\\\\\\,/,g')\")\n\ncase \\`uname\\` in\n    *CYGWIN*) basedir=\\`cygpath -w \"$basedir\"\\`;;\nesac\n\n`,g=t.nodePath?`export NODE_PATH=\"${l}\"\n`:\"\";return s?u+=`${g}if [ -x ${s} ]; then\n  exec ${s} ${a} ${i} ${c}\"$@\"\nelse\n  exec ${n} ${a} ${i} ${c}\"$@\"\nfi\n`:u+=`${g}${n} ${a} ${i} ${c}\"$@\"\nexit $?\n`,u}function kze(r,e,t){let i=Ts.relative(Ts.dirname(e),r),n=t.prog&&t.prog.split(\"\\\\\").join(\"/\"),s=n&&`\"${n}$exe\"`,o;i=i.split(\"\\\\\").join(\"/\");let a=Ts.isAbsolute(i)?`\"${i}\"`:`\"$basedir/${i}\"`,l=t.args||\"\",c=aM(t.nodePath),u=c.win32,g=c.posix;s?(o=`\"$basedir/${t.prog}$exe\"`,i=a):(s=a,l=\"\",i=\"\");let f=t.progArgs?`${t.progArgs.join(\" \")} `:\"\",h=`#!/usr/bin/env pwsh\n$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent\n\n$exe=\"\"\n${t.nodePath?`$env_node_path=$env:NODE_PATH\n$env:NODE_PATH=\"${u}\"\n`:\"\"}if ($PSVersionTable.PSVersion -lt \"6.0\" -or $IsWindows) {\n  # Fix case when both the Windows and Linux builds of Node\n  # are installed in the same directory\n  $exe=\".exe\"\n}`;return t.nodePath&&(h+=` else {\n  $env:NODE_PATH=\"${g}\"\n}`),o?h+=`\n$ret=0\nif (Test-Path ${o}) {\n  # Support pipeline input\n  if ($MyInvocation.ExpectingInput) {\n    $input | & ${o} ${l} ${i} ${f}$args\n  } else {\n    & ${o} ${l} ${i} ${f}$args\n  }\n  $ret=$LASTEXITCODE\n} else {\n  # Support pipeline input\n  if ($MyInvocation.ExpectingInput) {\n    $input | & ${s} ${l} ${i} ${f}$args\n  } else {\n    & ${s} ${l} ${i} ${f}$args\n  }\n  $ret=$LASTEXITCODE\n}\n${t.nodePath?`$env:NODE_PATH=$env_node_path\n`:\"\"}exit $ret\n`:h+=`\n# Support pipeline input\nif ($MyInvocation.ExpectingInput) {\n  $input | & ${s} ${l} ${i} ${f}$args\n} else {\n  & ${s} ${l} ${i} ${f}$args\n}\n${t.nodePath?`$env:NODE_PATH=$env_node_path\n`:\"\"}exit $LASTEXITCODE\n`,h}function Rze(r,e){return e.fs_.chmod(r,493)}function aM(r){if(!r)return{win32:\"\",posix:\"\"};let e=typeof r==\"string\"?r.split(Ts.delimiter):Array.from(r),t={};for(let i=0;i<e.length;i++){let n=e[i].split(\"/\").join(\"\\\\\"),s=Sle()?e[i].split(\"\\\\\").join(\"/\").replace(/^([^:\\\\/]*):/,(o,a)=>`/mnt/${a.toLowerCase()}`):e[i];t.win32=t.win32?`${t.win32};${n}`:n,t.posix=t.posix?`${t.posix}:${s}`:s,t[i]={win32:n,posix:s}}return t}xle.exports=oM});var EM=w((ZQt,Vle)=>{Vle.exports=J(\"stream\")});var $le=w((_Qt,_le)=>{\"use strict\";function Xle(r,e){var t=Object.keys(r);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(r);e&&(i=i.filter(function(n){return Object.getOwnPropertyDescriptor(r,n).enumerable})),t.push.apply(t,i)}return t}function _ze(r){for(var e=1;e<arguments.length;e++){var t=arguments[e]!=null?arguments[e]:{};e%2?Xle(Object(t),!0).forEach(function(i){$ze(r,i,t[i])}):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(t)):Xle(Object(t)).forEach(function(i){Object.defineProperty(r,i,Object.getOwnPropertyDescriptor(t,i))})}return r}function $ze(r,e,t){return e in r?Object.defineProperty(r,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):r[e]=t,r}function e5e(r,e){if(!(r instanceof e))throw new TypeError(\"Cannot call a class as a function\")}function Zle(r,e){for(var t=0;t<e.length;t++){var i=e[t];i.enumerable=i.enumerable||!1,i.configurable=!0,\"value\"in i&&(i.writable=!0),Object.defineProperty(r,i.key,i)}}function t5e(r,e,t){return e&&Zle(r.prototype,e),t&&Zle(r,t),r}var r5e=J(\"buffer\"),pb=r5e.Buffer,i5e=J(\"util\"),IM=i5e.inspect,n5e=IM&&IM.custom||\"inspect\";function s5e(r,e,t){pb.prototype.copy.call(r,e,t)}_le.exports=function(){function r(){e5e(this,r),this.head=null,this.tail=null,this.length=0}return t5e(r,[{key:\"push\",value:function(t){var i={data:t,next:null};this.length>0?this.tail.next=i:this.head=i,this.tail=i,++this.length}},{key:\"unshift\",value:function(t){var i={data:t,next:this.head};this.length===0&&(this.tail=i),this.head=i,++this.length}},{key:\"shift\",value:function(){if(this.length!==0){var t=this.head.data;return this.length===1?this.head=this.tail=null:this.head=this.head.next,--this.length,t}}},{key:\"clear\",value:function(){this.head=this.tail=null,this.length=0}},{key:\"join\",value:function(t){if(this.length===0)return\"\";for(var i=this.head,n=\"\"+i.data;i=i.next;)n+=t+i.data;return n}},{key:\"concat\",value:function(t){if(this.length===0)return pb.alloc(0);for(var i=pb.allocUnsafe(t>>>0),n=this.head,s=0;n;)s5e(n.data,i,s),s+=n.data.length,n=n.next;return i}},{key:\"consume\",value:function(t,i){var n;return t<this.head.data.length?(n=this.head.data.slice(0,t),this.head.data=this.head.data.slice(t)):t===this.head.data.length?n=this.shift():n=i?this._getString(t):this._getBuffer(t),n}},{key:\"first\",value:function(){return this.head.data}},{key:\"_getString\",value:function(t){var i=this.head,n=1,s=i.data;for(t-=s.length;i=i.next;){var o=i.data,a=t>o.length?o.length:t;if(a===o.length?s+=o:s+=o.slice(0,t),t-=a,t===0){a===o.length?(++n,i.next?this.head=i.next:this.head=this.tail=null):(this.head=i,i.data=o.slice(a));break}++n}return this.length-=n,s}},{key:\"_getBuffer\",value:function(t){var i=pb.allocUnsafe(t),n=this.head,s=1;for(n.data.copy(i),t-=n.data.length;n=n.next;){var o=n.data,a=t>o.length?o.length:t;if(o.copy(i,i.length-t,0,a),t-=a,t===0){a===o.length?(++s,n.next?this.head=n.next:this.head=this.tail=null):(this.head=n,n.data=o.slice(a));break}++s}return this.length-=s,i}},{key:n5e,value:function(t,i){return IM(this,_ze({},i,{depth:0,customInspect:!1}))}}]),r}()});var wM=w(($Qt,tce)=>{\"use strict\";function o5e(r,e){var t=this,i=this._readableState&&this._readableState.destroyed,n=this._writableState&&this._writableState.destroyed;return i||n?(e?e(r):r&&(this._writableState?this._writableState.errorEmitted||(this._writableState.errorEmitted=!0,process.nextTick(yM,this,r)):process.nextTick(yM,this,r)),this):(this._readableState&&(this._readableState.destroyed=!0),this._writableState&&(this._writableState.destroyed=!0),this._destroy(r||null,function(s){!e&&s?t._writableState?t._writableState.errorEmitted?process.nextTick(db,t):(t._writableState.errorEmitted=!0,process.nextTick(ece,t,s)):process.nextTick(ece,t,s):e?(process.nextTick(db,t),e(s)):process.nextTick(db,t)}),this)}function ece(r,e){yM(r,e),db(r)}function db(r){r._writableState&&!r._writableState.emitClose||r._readableState&&!r._readableState.emitClose||r.emit(\"close\")}function a5e(){this._readableState&&(this._readableState.destroyed=!1,this._readableState.reading=!1,this._readableState.ended=!1,this._readableState.endEmitted=!1),this._writableState&&(this._writableState.destroyed=!1,this._writableState.ended=!1,this._writableState.ending=!1,this._writableState.finalCalled=!1,this._writableState.prefinished=!1,this._writableState.finished=!1,this._writableState.errorEmitted=!1)}function yM(r,e){r.emit(\"error\",e)}function A5e(r,e){var t=r._readableState,i=r._writableState;t&&t.autoDestroy||i&&i.autoDestroy?r.destroy(e):r.emit(\"error\",e)}tce.exports={destroy:o5e,undestroy:a5e,errorOrDestroy:A5e}});var Sl=w((ebt,nce)=>{\"use strict\";var ice={};function Os(r,e,t){t||(t=Error);function i(s,o,a){return typeof e==\"string\"?e:e(s,o,a)}class n extends t{constructor(o,a,l){super(i(o,a,l))}}n.prototype.name=t.name,n.prototype.code=r,ice[r]=n}function rce(r,e){if(Array.isArray(r)){let t=r.length;return r=r.map(i=>String(i)),t>2?`one of ${e} ${r.slice(0,t-1).join(\", \")}, or `+r[t-1]:t===2?`one of ${e} ${r[0]} or ${r[1]}`:`of ${e} ${r[0]}`}else return`of ${e} ${String(r)}`}function l5e(r,e,t){return r.substr(!t||t<0?0:+t,e.length)===e}function c5e(r,e,t){return(t===void 0||t>r.length)&&(t=r.length),r.substring(t-e.length,t)===e}function u5e(r,e,t){return typeof t!=\"number\"&&(t=0),t+e.length>r.length?!1:r.indexOf(e,t)!==-1}Os(\"ERR_INVALID_OPT_VALUE\",function(r,e){return'The value \"'+e+'\" is invalid for option \"'+r+'\"'},TypeError);Os(\"ERR_INVALID_ARG_TYPE\",function(r,e,t){let i;typeof e==\"string\"&&l5e(e,\"not \")?(i=\"must not be\",e=e.replace(/^not /,\"\")):i=\"must be\";let n;if(c5e(r,\" argument\"))n=`The ${r} ${i} ${rce(e,\"type\")}`;else{let s=u5e(r,\".\")?\"property\":\"argument\";n=`The \"${r}\" ${s} ${i} ${rce(e,\"type\")}`}return n+=`. Received type ${typeof t}`,n},TypeError);Os(\"ERR_STREAM_PUSH_AFTER_EOF\",\"stream.push() after EOF\");Os(\"ERR_METHOD_NOT_IMPLEMENTED\",function(r){return\"The \"+r+\" method is not implemented\"});Os(\"ERR_STREAM_PREMATURE_CLOSE\",\"Premature close\");Os(\"ERR_STREAM_DESTROYED\",function(r){return\"Cannot call \"+r+\" after a stream was destroyed\"});Os(\"ERR_MULTIPLE_CALLBACK\",\"Callback called multiple times\");Os(\"ERR_STREAM_CANNOT_PIPE\",\"Cannot pipe, not readable\");Os(\"ERR_STREAM_WRITE_AFTER_END\",\"write after end\");Os(\"ERR_STREAM_NULL_VALUES\",\"May not write null values to stream\",TypeError);Os(\"ERR_UNKNOWN_ENCODING\",function(r){return\"Unknown encoding: \"+r},TypeError);Os(\"ERR_STREAM_UNSHIFT_AFTER_END_EVENT\",\"stream.unshift() after end event\");nce.exports.codes=ice});var BM=w((tbt,sce)=>{\"use strict\";var g5e=Sl().codes.ERR_INVALID_OPT_VALUE;function f5e(r,e,t){return r.highWaterMark!=null?r.highWaterMark:e?r[t]:null}function h5e(r,e,t,i){var n=f5e(e,i,t);if(n!=null){if(!(isFinite(n)&&Math.floor(n)===n)||n<0){var s=i?t:\"highWaterMark\";throw new g5e(s,n)}return Math.floor(n)}return r.objectMode?16:16*1024}sce.exports={getHighWaterMark:h5e}});var oce=w((rbt,QM)=>{typeof Object.create==\"function\"?QM.exports=function(e,t){t&&(e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))}:QM.exports=function(e,t){if(t){e.super_=t;var i=function(){};i.prototype=t.prototype,e.prototype=new i,e.prototype.constructor=e}}});var vl=w((ibt,SM)=>{try{if(bM=J(\"util\"),typeof bM.inherits!=\"function\")throw\"\";SM.exports=bM.inherits}catch{SM.exports=oce()}var bM});var Ace=w((nbt,ace)=>{ace.exports=J(\"util\").deprecate});var PM=w((sbt,hce)=>{\"use strict\";hce.exports=Lr;function cce(r){var e=this;this.next=null,this.entry=null,this.finish=function(){H5e(e,r)}}var ap;Lr.WritableState=dE;var p5e={deprecate:Ace()},uce=EM(),mb=J(\"buffer\").Buffer,d5e=global.Uint8Array||function(){};function C5e(r){return mb.from(r)}function m5e(r){return mb.isBuffer(r)||r instanceof d5e}var xM=wM(),E5e=BM(),I5e=E5e.getHighWaterMark,xl=Sl().codes,y5e=xl.ERR_INVALID_ARG_TYPE,w5e=xl.ERR_METHOD_NOT_IMPLEMENTED,B5e=xl.ERR_MULTIPLE_CALLBACK,Q5e=xl.ERR_STREAM_CANNOT_PIPE,b5e=xl.ERR_STREAM_DESTROYED,S5e=xl.ERR_STREAM_NULL_VALUES,v5e=xl.ERR_STREAM_WRITE_AFTER_END,x5e=xl.ERR_UNKNOWN_ENCODING,Ap=xM.errorOrDestroy;vl()(Lr,uce);function P5e(){}function dE(r,e,t){ap=ap||qu(),r=r||{},typeof t!=\"boolean\"&&(t=e instanceof ap),this.objectMode=!!r.objectMode,t&&(this.objectMode=this.objectMode||!!r.writableObjectMode),this.highWaterMark=I5e(this,r,\"writableHighWaterMark\",t),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var i=r.decodeStrings===!1;this.decodeStrings=!i,this.defaultEncoding=r.defaultEncoding||\"utf8\",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(n){L5e(e,n)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.emitClose=r.emitClose!==!1,this.autoDestroy=!!r.autoDestroy,this.bufferedRequestCount=0,this.corkedRequestsFree=new cce(this)}dE.prototype.getBuffer=function(){for(var e=this.bufferedRequest,t=[];e;)t.push(e),e=e.next;return t};(function(){try{Object.defineProperty(dE.prototype,\"buffer\",{get:p5e.deprecate(function(){return this.getBuffer()},\"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.\",\"DEP0003\")})}catch{}})();var Cb;typeof Symbol==\"function\"&&Symbol.hasInstance&&typeof Function.prototype[Symbol.hasInstance]==\"function\"?(Cb=Function.prototype[Symbol.hasInstance],Object.defineProperty(Lr,Symbol.hasInstance,{value:function(e){return Cb.call(this,e)?!0:this!==Lr?!1:e&&e._writableState instanceof dE}})):Cb=function(e){return e instanceof this};function Lr(r){ap=ap||qu();var e=this instanceof ap;if(!e&&!Cb.call(Lr,this))return new Lr(r);this._writableState=new dE(r,this,e),this.writable=!0,r&&(typeof r.write==\"function\"&&(this._write=r.write),typeof r.writev==\"function\"&&(this._writev=r.writev),typeof r.destroy==\"function\"&&(this._destroy=r.destroy),typeof r.final==\"function\"&&(this._final=r.final)),uce.call(this)}Lr.prototype.pipe=function(){Ap(this,new Q5e)};function D5e(r,e){var t=new v5e;Ap(r,t),process.nextTick(e,t)}function k5e(r,e,t,i){var n;return t===null?n=new S5e:typeof t!=\"string\"&&!e.objectMode&&(n=new y5e(\"chunk\",[\"string\",\"Buffer\"],t)),n?(Ap(r,n),process.nextTick(i,n),!1):!0}Lr.prototype.write=function(r,e,t){var i=this._writableState,n=!1,s=!i.objectMode&&m5e(r);return s&&!mb.isBuffer(r)&&(r=C5e(r)),typeof e==\"function\"&&(t=e,e=null),s?e=\"buffer\":e||(e=i.defaultEncoding),typeof t!=\"function\"&&(t=P5e),i.ending?D5e(this,t):(s||k5e(this,i,r,t))&&(i.pendingcb++,n=F5e(this,i,s,r,e,t)),n};Lr.prototype.cork=function(){this._writableState.corked++};Lr.prototype.uncork=function(){var r=this._writableState;r.corked&&(r.corked--,!r.writing&&!r.corked&&!r.bufferProcessing&&r.bufferedRequest&&gce(this,r))};Lr.prototype.setDefaultEncoding=function(e){if(typeof e==\"string\"&&(e=e.toLowerCase()),!([\"hex\",\"utf8\",\"utf-8\",\"ascii\",\"binary\",\"base64\",\"ucs2\",\"ucs-2\",\"utf16le\",\"utf-16le\",\"raw\"].indexOf((e+\"\").toLowerCase())>-1))throw new x5e(e);return this._writableState.defaultEncoding=e,this};Object.defineProperty(Lr.prototype,\"writableBuffer\",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}});function R5e(r,e,t){return!r.objectMode&&r.decodeStrings!==!1&&typeof e==\"string\"&&(e=mb.from(e,t)),e}Object.defineProperty(Lr.prototype,\"writableHighWaterMark\",{enumerable:!1,get:function(){return this._writableState.highWaterMark}});function F5e(r,e,t,i,n,s){if(!t){var o=R5e(e,i,n);i!==o&&(t=!0,n=\"buffer\",i=o)}var a=e.objectMode?1:i.length;e.length+=a;var l=e.length<e.highWaterMark;if(l||(e.needDrain=!0),e.writing||e.corked){var c=e.lastBufferedRequest;e.lastBufferedRequest={chunk:i,encoding:n,isBuf:t,callback:s,next:null},c?c.next=e.lastBufferedRequest:e.bufferedRequest=e.lastBufferedRequest,e.bufferedRequestCount+=1}else vM(r,e,!1,a,i,n,s);return l}function vM(r,e,t,i,n,s,o){e.writelen=i,e.writecb=o,e.writing=!0,e.sync=!0,e.destroyed?e.onwrite(new b5e(\"write\")):t?r._writev(n,e.onwrite):r._write(n,s,e.onwrite),e.sync=!1}function N5e(r,e,t,i,n){--e.pendingcb,t?(process.nextTick(n,i),process.nextTick(pE,r,e),r._writableState.errorEmitted=!0,Ap(r,i)):(n(i),r._writableState.errorEmitted=!0,Ap(r,i),pE(r,e))}function T5e(r){r.writing=!1,r.writecb=null,r.length-=r.writelen,r.writelen=0}function L5e(r,e){var t=r._writableState,i=t.sync,n=t.writecb;if(typeof n!=\"function\")throw new B5e;if(T5e(t),e)N5e(r,t,i,e,n);else{var s=fce(t)||r.destroyed;!s&&!t.corked&&!t.bufferProcessing&&t.bufferedRequest&&gce(r,t),i?process.nextTick(lce,r,t,s,n):lce(r,t,s,n)}}function lce(r,e,t,i){t||O5e(r,e),e.pendingcb--,i(),pE(r,e)}function O5e(r,e){e.length===0&&e.needDrain&&(e.needDrain=!1,r.emit(\"drain\"))}function gce(r,e){e.bufferProcessing=!0;var t=e.bufferedRequest;if(r._writev&&t&&t.next){var i=e.bufferedRequestCount,n=new Array(i),s=e.corkedRequestsFree;s.entry=t;for(var o=0,a=!0;t;)n[o]=t,t.isBuf||(a=!1),t=t.next,o+=1;n.allBuffers=a,vM(r,e,!0,e.length,n,\"\",s.finish),e.pendingcb++,e.lastBufferedRequest=null,s.next?(e.corkedRequestsFree=s.next,s.next=null):e.corkedRequestsFree=new cce(e),e.bufferedRequestCount=0}else{for(;t;){var l=t.chunk,c=t.encoding,u=t.callback,g=e.objectMode?1:l.length;if(vM(r,e,!1,g,l,c,u),t=t.next,e.bufferedRequestCount--,e.writing)break}t===null&&(e.lastBufferedRequest=null)}e.bufferedRequest=t,e.bufferProcessing=!1}Lr.prototype._write=function(r,e,t){t(new w5e(\"_write()\"))};Lr.prototype._writev=null;Lr.prototype.end=function(r,e,t){var i=this._writableState;return typeof r==\"function\"?(t=r,r=null,e=null):typeof e==\"function\"&&(t=e,e=null),r!=null&&this.write(r,e),i.corked&&(i.corked=1,this.uncork()),i.ending||U5e(this,i,t),this};Object.defineProperty(Lr.prototype,\"writableLength\",{enumerable:!1,get:function(){return this._writableState.length}});function fce(r){return r.ending&&r.length===0&&r.bufferedRequest===null&&!r.finished&&!r.writing}function M5e(r,e){r._final(function(t){e.pendingcb--,t&&Ap(r,t),e.prefinished=!0,r.emit(\"prefinish\"),pE(r,e)})}function K5e(r,e){!e.prefinished&&!e.finalCalled&&(typeof r._final==\"function\"&&!e.destroyed?(e.pendingcb++,e.finalCalled=!0,process.nextTick(M5e,r,e)):(e.prefinished=!0,r.emit(\"prefinish\")))}function pE(r,e){var t=fce(e);if(t&&(K5e(r,e),e.pendingcb===0&&(e.finished=!0,r.emit(\"finish\"),e.autoDestroy))){var i=r._readableState;(!i||i.autoDestroy&&i.endEmitted)&&r.destroy()}return t}function U5e(r,e,t){e.ending=!0,pE(r,e),t&&(e.finished?process.nextTick(t):r.once(\"finish\",t)),e.ended=!0,r.writable=!1}function H5e(r,e,t){var i=r.entry;for(r.entry=null;i;){var n=i.callback;e.pendingcb--,n(t),i=i.next}e.corkedRequestsFree.next=r}Object.defineProperty(Lr.prototype,\"destroyed\",{enumerable:!1,get:function(){return this._writableState===void 0?!1:this._writableState.destroyed},set:function(e){!this._writableState||(this._writableState.destroyed=e)}});Lr.prototype.destroy=xM.destroy;Lr.prototype._undestroy=xM.undestroy;Lr.prototype._destroy=function(r,e){e(r)}});var qu=w((obt,dce)=>{\"use strict\";var G5e=Object.keys||function(r){var e=[];for(var t in r)e.push(t);return e};dce.exports=Aa;var pce=RM(),kM=PM();vl()(Aa,pce);for(DM=G5e(kM.prototype),Eb=0;Eb<DM.length;Eb++)Ib=DM[Eb],Aa.prototype[Ib]||(Aa.prototype[Ib]=kM.prototype[Ib]);var DM,Ib,Eb;function Aa(r){if(!(this instanceof Aa))return new Aa(r);pce.call(this,r),kM.call(this,r),this.allowHalfOpen=!0,r&&(r.readable===!1&&(this.readable=!1),r.writable===!1&&(this.writable=!1),r.allowHalfOpen===!1&&(this.allowHalfOpen=!1,this.once(\"end\",Y5e)))}Object.defineProperty(Aa.prototype,\"writableHighWaterMark\",{enumerable:!1,get:function(){return this._writableState.highWaterMark}});Object.defineProperty(Aa.prototype,\"writableBuffer\",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}});Object.defineProperty(Aa.prototype,\"writableLength\",{enumerable:!1,get:function(){return this._writableState.length}});function Y5e(){this._writableState.ended||process.nextTick(j5e,this)}function j5e(r){r.end()}Object.defineProperty(Aa.prototype,\"destroyed\",{enumerable:!1,get:function(){return this._readableState===void 0||this._writableState===void 0?!1:this._readableState.destroyed&&this._writableState.destroyed},set:function(e){this._readableState===void 0||this._writableState===void 0||(this._readableState.destroyed=e,this._writableState.destroyed=e)}})});var Ece=w((FM,mce)=>{var yb=J(\"buffer\"),hA=yb.Buffer;function Cce(r,e){for(var t in r)e[t]=r[t]}hA.from&&hA.alloc&&hA.allocUnsafe&&hA.allocUnsafeSlow?mce.exports=yb:(Cce(yb,FM),FM.Buffer=lp);function lp(r,e,t){return hA(r,e,t)}Cce(hA,lp);lp.from=function(r,e,t){if(typeof r==\"number\")throw new TypeError(\"Argument must not be a number\");return hA(r,e,t)};lp.alloc=function(r,e,t){if(typeof r!=\"number\")throw new TypeError(\"Argument must be a number\");var i=hA(r);return e!==void 0?typeof t==\"string\"?i.fill(e,t):i.fill(e):i.fill(0),i};lp.allocUnsafe=function(r){if(typeof r!=\"number\")throw new TypeError(\"Argument must be a number\");return hA(r)};lp.allocUnsafeSlow=function(r){if(typeof r!=\"number\")throw new TypeError(\"Argument must be a number\");return yb.SlowBuffer(r)}});var LM=w(yce=>{\"use strict\";var TM=Ece().Buffer,Ice=TM.isEncoding||function(r){switch(r=\"\"+r,r&&r.toLowerCase()){case\"hex\":case\"utf8\":case\"utf-8\":case\"ascii\":case\"binary\":case\"base64\":case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":case\"raw\":return!0;default:return!1}};function q5e(r){if(!r)return\"utf8\";for(var e;;)switch(r){case\"utf8\":case\"utf-8\":return\"utf8\";case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return\"utf16le\";case\"latin1\":case\"binary\":return\"latin1\";case\"base64\":case\"ascii\":case\"hex\":return r;default:if(e)return;r=(\"\"+r).toLowerCase(),e=!0}}function J5e(r){var e=q5e(r);if(typeof e!=\"string\"&&(TM.isEncoding===Ice||!Ice(r)))throw new Error(\"Unknown encoding: \"+r);return e||r}yce.StringDecoder=CE;function CE(r){this.encoding=J5e(r);var e;switch(this.encoding){case\"utf16le\":this.text=_5e,this.end=$5e,e=4;break;case\"utf8\":this.fillLast=V5e,e=4;break;case\"base64\":this.text=e6e,this.end=t6e,e=3;break;default:this.write=r6e,this.end=i6e;return}this.lastNeed=0,this.lastTotal=0,this.lastChar=TM.allocUnsafe(e)}CE.prototype.write=function(r){if(r.length===0)return\"\";var e,t;if(this.lastNeed){if(e=this.fillLast(r),e===void 0)return\"\";t=this.lastNeed,this.lastNeed=0}else t=0;return t<r.length?e?e+this.text(r,t):this.text(r,t):e||\"\"};CE.prototype.end=Z5e;CE.prototype.text=X5e;CE.prototype.fillLast=function(r){if(this.lastNeed<=r.length)return r.copy(this.lastChar,this.lastTotal-this.lastNeed,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);r.copy(this.lastChar,this.lastTotal-this.lastNeed,0,r.length),this.lastNeed-=r.length};function NM(r){return r<=127?0:r>>5===6?2:r>>4===14?3:r>>3===30?4:r>>6===2?-1:-2}function W5e(r,e,t){var i=e.length-1;if(i<t)return 0;var n=NM(e[i]);return n>=0?(n>0&&(r.lastNeed=n-1),n):--i<t||n===-2?0:(n=NM(e[i]),n>=0?(n>0&&(r.lastNeed=n-2),n):--i<t||n===-2?0:(n=NM(e[i]),n>=0?(n>0&&(n===2?n=0:r.lastNeed=n-3),n):0))}function z5e(r,e,t){if((e[0]&192)!==128)return r.lastNeed=0,\"\\uFFFD\";if(r.lastNeed>1&&e.length>1){if((e[1]&192)!==128)return r.lastNeed=1,\"\\uFFFD\";if(r.lastNeed>2&&e.length>2&&(e[2]&192)!==128)return r.lastNeed=2,\"\\uFFFD\"}}function V5e(r){var e=this.lastTotal-this.lastNeed,t=z5e(this,r,e);if(t!==void 0)return t;if(this.lastNeed<=r.length)return r.copy(this.lastChar,e,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);r.copy(this.lastChar,e,0,r.length),this.lastNeed-=r.length}function X5e(r,e){var t=W5e(this,r,e);if(!this.lastNeed)return r.toString(\"utf8\",e);this.lastTotal=t;var i=r.length-(t-this.lastNeed);return r.copy(this.lastChar,0,i),r.toString(\"utf8\",e,i)}function Z5e(r){var e=r&&r.length?this.write(r):\"\";return this.lastNeed?e+\"\\uFFFD\":e}function _5e(r,e){if((r.length-e)%2===0){var t=r.toString(\"utf16le\",e);if(t){var i=t.charCodeAt(t.length-1);if(i>=55296&&i<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=r[r.length-2],this.lastChar[1]=r[r.length-1],t.slice(0,-1)}return t}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=r[r.length-1],r.toString(\"utf16le\",e,r.length-1)}function $5e(r){var e=r&&r.length?this.write(r):\"\";if(this.lastNeed){var t=this.lastTotal-this.lastNeed;return e+this.lastChar.toString(\"utf16le\",0,t)}return e}function e6e(r,e){var t=(r.length-e)%3;return t===0?r.toString(\"base64\",e):(this.lastNeed=3-t,this.lastTotal=3,t===1?this.lastChar[0]=r[r.length-1]:(this.lastChar[0]=r[r.length-2],this.lastChar[1]=r[r.length-1]),r.toString(\"base64\",e,r.length-t))}function t6e(r){var e=r&&r.length?this.write(r):\"\";return this.lastNeed?e+this.lastChar.toString(\"base64\",0,3-this.lastNeed):e}function r6e(r){return r.toString(this.encoding)}function i6e(r){return r&&r.length?this.write(r):\"\"}});var wb=w((Abt,Qce)=>{\"use strict\";var wce=Sl().codes.ERR_STREAM_PREMATURE_CLOSE;function n6e(r){var e=!1;return function(){if(!e){e=!0;for(var t=arguments.length,i=new Array(t),n=0;n<t;n++)i[n]=arguments[n];r.apply(this,i)}}}function s6e(){}function o6e(r){return r.setHeader&&typeof r.abort==\"function\"}function Bce(r,e,t){if(typeof e==\"function\")return Bce(r,null,e);e||(e={}),t=n6e(t||s6e);var i=e.readable||e.readable!==!1&&r.readable,n=e.writable||e.writable!==!1&&r.writable,s=function(){r.writable||a()},o=r._writableState&&r._writableState.finished,a=function(){n=!1,o=!0,i||t.call(r)},l=r._readableState&&r._readableState.endEmitted,c=function(){i=!1,l=!0,n||t.call(r)},u=function(p){t.call(r,p)},g=function(){var p;if(i&&!l)return(!r._readableState||!r._readableState.ended)&&(p=new wce),t.call(r,p);if(n&&!o)return(!r._writableState||!r._writableState.ended)&&(p=new wce),t.call(r,p)},f=function(){r.req.on(\"finish\",a)};return o6e(r)?(r.on(\"complete\",a),r.on(\"abort\",g),r.req?f():r.on(\"request\",f)):n&&!r._writableState&&(r.on(\"end\",s),r.on(\"close\",s)),r.on(\"end\",c),r.on(\"finish\",a),e.error!==!1&&r.on(\"error\",u),r.on(\"close\",g),function(){r.removeListener(\"complete\",a),r.removeListener(\"abort\",g),r.removeListener(\"request\",f),r.req&&r.req.removeListener(\"finish\",a),r.removeListener(\"end\",s),r.removeListener(\"close\",s),r.removeListener(\"finish\",a),r.removeListener(\"end\",c),r.removeListener(\"error\",u),r.removeListener(\"close\",g)}}Qce.exports=Bce});var Sce=w((lbt,bce)=>{\"use strict\";var Bb;function Pl(r,e,t){return e in r?Object.defineProperty(r,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):r[e]=t,r}var a6e=wb(),Dl=Symbol(\"lastResolve\"),Ju=Symbol(\"lastReject\"),mE=Symbol(\"error\"),Qb=Symbol(\"ended\"),Wu=Symbol(\"lastPromise\"),OM=Symbol(\"handlePromise\"),zu=Symbol(\"stream\");function kl(r,e){return{value:r,done:e}}function A6e(r){var e=r[Dl];if(e!==null){var t=r[zu].read();t!==null&&(r[Wu]=null,r[Dl]=null,r[Ju]=null,e(kl(t,!1)))}}function l6e(r){process.nextTick(A6e,r)}function c6e(r,e){return function(t,i){r.then(function(){if(e[Qb]){t(kl(void 0,!0));return}e[OM](t,i)},i)}}var u6e=Object.getPrototypeOf(function(){}),g6e=Object.setPrototypeOf((Bb={get stream(){return this[zu]},next:function(){var e=this,t=this[mE];if(t!==null)return Promise.reject(t);if(this[Qb])return Promise.resolve(kl(void 0,!0));if(this[zu].destroyed)return new Promise(function(o,a){process.nextTick(function(){e[mE]?a(e[mE]):o(kl(void 0,!0))})});var i=this[Wu],n;if(i)n=new Promise(c6e(i,this));else{var s=this[zu].read();if(s!==null)return Promise.resolve(kl(s,!1));n=new Promise(this[OM])}return this[Wu]=n,n}},Pl(Bb,Symbol.asyncIterator,function(){return this}),Pl(Bb,\"return\",function(){var e=this;return new Promise(function(t,i){e[zu].destroy(null,function(n){if(n){i(n);return}t(kl(void 0,!0))})})}),Bb),u6e),f6e=function(e){var t,i=Object.create(g6e,(t={},Pl(t,zu,{value:e,writable:!0}),Pl(t,Dl,{value:null,writable:!0}),Pl(t,Ju,{value:null,writable:!0}),Pl(t,mE,{value:null,writable:!0}),Pl(t,Qb,{value:e._readableState.endEmitted,writable:!0}),Pl(t,OM,{value:function(s,o){var a=i[zu].read();a?(i[Wu]=null,i[Dl]=null,i[Ju]=null,s(kl(a,!1))):(i[Dl]=s,i[Ju]=o)},writable:!0}),t));return i[Wu]=null,a6e(e,function(n){if(n&&n.code!==\"ERR_STREAM_PREMATURE_CLOSE\"){var s=i[Ju];s!==null&&(i[Wu]=null,i[Dl]=null,i[Ju]=null,s(n)),i[mE]=n;return}var o=i[Dl];o!==null&&(i[Wu]=null,i[Dl]=null,i[Ju]=null,o(kl(void 0,!0))),i[Qb]=!0}),e.on(\"readable\",l6e.bind(null,i)),i};bce.exports=f6e});var Dce=w((cbt,Pce)=>{\"use strict\";function vce(r,e,t,i,n,s,o){try{var a=r[s](o),l=a.value}catch(c){t(c);return}a.done?e(l):Promise.resolve(l).then(i,n)}function h6e(r){return function(){var e=this,t=arguments;return new Promise(function(i,n){var s=r.apply(e,t);function o(l){vce(s,i,n,o,a,\"next\",l)}function a(l){vce(s,i,n,o,a,\"throw\",l)}o(void 0)})}}function xce(r,e){var t=Object.keys(r);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(r);e&&(i=i.filter(function(n){return Object.getOwnPropertyDescriptor(r,n).enumerable})),t.push.apply(t,i)}return t}function p6e(r){for(var e=1;e<arguments.length;e++){var t=arguments[e]!=null?arguments[e]:{};e%2?xce(Object(t),!0).forEach(function(i){d6e(r,i,t[i])}):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(t)):xce(Object(t)).forEach(function(i){Object.defineProperty(r,i,Object.getOwnPropertyDescriptor(t,i))})}return r}function d6e(r,e,t){return e in r?Object.defineProperty(r,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):r[e]=t,r}var C6e=Sl().codes.ERR_INVALID_ARG_TYPE;function m6e(r,e,t){var i;if(e&&typeof e.next==\"function\")i=e;else if(e&&e[Symbol.asyncIterator])i=e[Symbol.asyncIterator]();else if(e&&e[Symbol.iterator])i=e[Symbol.iterator]();else throw new C6e(\"iterable\",[\"Iterable\"],e);var n=new r(p6e({objectMode:!0},t)),s=!1;n._read=function(){s||(s=!0,o())};function o(){return a.apply(this,arguments)}function a(){return a=h6e(function*(){try{var l=yield i.next(),c=l.value,u=l.done;u?n.push(null):n.push(yield c)?o():s=!1}catch(g){n.destroy(g)}}),a.apply(this,arguments)}return n}Pce.exports=m6e});var RM=w((gbt,Uce)=>{\"use strict\";Uce.exports=Ut;var cp;Ut.ReadableState=Nce;var ubt=J(\"events\").EventEmitter,Fce=function(e,t){return e.listeners(t).length},IE=EM(),bb=J(\"buffer\").Buffer,E6e=global.Uint8Array||function(){};function I6e(r){return bb.from(r)}function y6e(r){return bb.isBuffer(r)||r instanceof E6e}var MM=J(\"util\"),Dt;MM&&MM.debuglog?Dt=MM.debuglog(\"stream\"):Dt=function(){};var w6e=$le(),qM=wM(),B6e=BM(),Q6e=B6e.getHighWaterMark,Sb=Sl().codes,b6e=Sb.ERR_INVALID_ARG_TYPE,S6e=Sb.ERR_STREAM_PUSH_AFTER_EOF,v6e=Sb.ERR_METHOD_NOT_IMPLEMENTED,x6e=Sb.ERR_STREAM_UNSHIFT_AFTER_END_EVENT,up,KM,UM;vl()(Ut,IE);var EE=qM.errorOrDestroy,HM=[\"error\",\"close\",\"destroy\",\"pause\",\"resume\"];function P6e(r,e,t){if(typeof r.prependListener==\"function\")return r.prependListener(e,t);!r._events||!r._events[e]?r.on(e,t):Array.isArray(r._events[e])?r._events[e].unshift(t):r._events[e]=[t,r._events[e]]}function Nce(r,e,t){cp=cp||qu(),r=r||{},typeof t!=\"boolean\"&&(t=e instanceof cp),this.objectMode=!!r.objectMode,t&&(this.objectMode=this.objectMode||!!r.readableObjectMode),this.highWaterMark=Q6e(this,r,\"readableHighWaterMark\",t),this.buffer=new w6e,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.paused=!0,this.emitClose=r.emitClose!==!1,this.autoDestroy=!!r.autoDestroy,this.destroyed=!1,this.defaultEncoding=r.defaultEncoding||\"utf8\",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,r.encoding&&(up||(up=LM().StringDecoder),this.decoder=new up(r.encoding),this.encoding=r.encoding)}function Ut(r){if(cp=cp||qu(),!(this instanceof Ut))return new Ut(r);var e=this instanceof cp;this._readableState=new Nce(r,this,e),this.readable=!0,r&&(typeof r.read==\"function\"&&(this._read=r.read),typeof r.destroy==\"function\"&&(this._destroy=r.destroy)),IE.call(this)}Object.defineProperty(Ut.prototype,\"destroyed\",{enumerable:!1,get:function(){return this._readableState===void 0?!1:this._readableState.destroyed},set:function(e){!this._readableState||(this._readableState.destroyed=e)}});Ut.prototype.destroy=qM.destroy;Ut.prototype._undestroy=qM.undestroy;Ut.prototype._destroy=function(r,e){e(r)};Ut.prototype.push=function(r,e){var t=this._readableState,i;return t.objectMode?i=!0:typeof r==\"string\"&&(e=e||t.defaultEncoding,e!==t.encoding&&(r=bb.from(r,e),e=\"\"),i=!0),Tce(this,r,e,!1,i)};Ut.prototype.unshift=function(r){return Tce(this,r,null,!0,!1)};function Tce(r,e,t,i,n){Dt(\"readableAddChunk\",e);var s=r._readableState;if(e===null)s.reading=!1,R6e(r,s);else{var o;if(n||(o=D6e(s,e)),o)EE(r,o);else if(s.objectMode||e&&e.length>0)if(typeof e!=\"string\"&&!s.objectMode&&Object.getPrototypeOf(e)!==bb.prototype&&(e=I6e(e)),i)s.endEmitted?EE(r,new x6e):GM(r,s,e,!0);else if(s.ended)EE(r,new S6e);else{if(s.destroyed)return!1;s.reading=!1,s.decoder&&!t?(e=s.decoder.write(e),s.objectMode||e.length!==0?GM(r,s,e,!1):jM(r,s)):GM(r,s,e,!1)}else i||(s.reading=!1,jM(r,s))}return!s.ended&&(s.length<s.highWaterMark||s.length===0)}function GM(r,e,t,i){e.flowing&&e.length===0&&!e.sync?(e.awaitDrain=0,r.emit(\"data\",t)):(e.length+=e.objectMode?1:t.length,i?e.buffer.unshift(t):e.buffer.push(t),e.needReadable&&vb(r)),jM(r,e)}function D6e(r,e){var t;return!y6e(e)&&typeof e!=\"string\"&&e!==void 0&&!r.objectMode&&(t=new b6e(\"chunk\",[\"string\",\"Buffer\",\"Uint8Array\"],e)),t}Ut.prototype.isPaused=function(){return this._readableState.flowing===!1};Ut.prototype.setEncoding=function(r){up||(up=LM().StringDecoder);var e=new up(r);this._readableState.decoder=e,this._readableState.encoding=this._readableState.decoder.encoding;for(var t=this._readableState.buffer.head,i=\"\";t!==null;)i+=e.write(t.data),t=t.next;return this._readableState.buffer.clear(),i!==\"\"&&this._readableState.buffer.push(i),this._readableState.length=i.length,this};var kce=1073741824;function k6e(r){return r>=kce?r=kce:(r--,r|=r>>>1,r|=r>>>2,r|=r>>>4,r|=r>>>8,r|=r>>>16,r++),r}function Rce(r,e){return r<=0||e.length===0&&e.ended?0:e.objectMode?1:r!==r?e.flowing&&e.length?e.buffer.head.data.length:e.length:(r>e.highWaterMark&&(e.highWaterMark=k6e(r)),r<=e.length?r:e.ended?e.length:(e.needReadable=!0,0))}Ut.prototype.read=function(r){Dt(\"read\",r),r=parseInt(r,10);var e=this._readableState,t=r;if(r!==0&&(e.emittedReadable=!1),r===0&&e.needReadable&&((e.highWaterMark!==0?e.length>=e.highWaterMark:e.length>0)||e.ended))return Dt(\"read: emitReadable\",e.length,e.ended),e.length===0&&e.ended?YM(this):vb(this),null;if(r=Rce(r,e),r===0&&e.ended)return e.length===0&&YM(this),null;var i=e.needReadable;Dt(\"need readable\",i),(e.length===0||e.length-r<e.highWaterMark)&&(i=!0,Dt(\"length less than watermark\",i)),e.ended||e.reading?(i=!1,Dt(\"reading or ended\",i)):i&&(Dt(\"do read\"),e.reading=!0,e.sync=!0,e.length===0&&(e.needReadable=!0),this._read(e.highWaterMark),e.sync=!1,e.reading||(r=Rce(t,e)));var n;return r>0?n=Mce(r,e):n=null,n===null?(e.needReadable=e.length<=e.highWaterMark,r=0):(e.length-=r,e.awaitDrain=0),e.length===0&&(e.ended||(e.needReadable=!0),t!==r&&e.ended&&YM(this)),n!==null&&this.emit(\"data\",n),n};function R6e(r,e){if(Dt(\"onEofChunk\"),!e.ended){if(e.decoder){var t=e.decoder.end();t&&t.length&&(e.buffer.push(t),e.length+=e.objectMode?1:t.length)}e.ended=!0,e.sync?vb(r):(e.needReadable=!1,e.emittedReadable||(e.emittedReadable=!0,Lce(r)))}}function vb(r){var e=r._readableState;Dt(\"emitReadable\",e.needReadable,e.emittedReadable),e.needReadable=!1,e.emittedReadable||(Dt(\"emitReadable\",e.flowing),e.emittedReadable=!0,process.nextTick(Lce,r))}function Lce(r){var e=r._readableState;Dt(\"emitReadable_\",e.destroyed,e.length,e.ended),!e.destroyed&&(e.length||e.ended)&&(r.emit(\"readable\"),e.emittedReadable=!1),e.needReadable=!e.flowing&&!e.ended&&e.length<=e.highWaterMark,JM(r)}function jM(r,e){e.readingMore||(e.readingMore=!0,process.nextTick(F6e,r,e))}function F6e(r,e){for(;!e.reading&&!e.ended&&(e.length<e.highWaterMark||e.flowing&&e.length===0);){var t=e.length;if(Dt(\"maybeReadMore read 0\"),r.read(0),t===e.length)break}e.readingMore=!1}Ut.prototype._read=function(r){EE(this,new v6e(\"_read()\"))};Ut.prototype.pipe=function(r,e){var t=this,i=this._readableState;switch(i.pipesCount){case 0:i.pipes=r;break;case 1:i.pipes=[i.pipes,r];break;default:i.pipes.push(r);break}i.pipesCount+=1,Dt(\"pipe count=%d opts=%j\",i.pipesCount,e);var n=(!e||e.end!==!1)&&r!==process.stdout&&r!==process.stderr,s=n?a:C;i.endEmitted?process.nextTick(s):t.once(\"end\",s),r.on(\"unpipe\",o);function o(y,B){Dt(\"onunpipe\"),y===t&&B&&B.hasUnpiped===!1&&(B.hasUnpiped=!0,u())}function a(){Dt(\"onend\"),r.end()}var l=N6e(t);r.on(\"drain\",l);var c=!1;function u(){Dt(\"cleanup\"),r.removeListener(\"close\",h),r.removeListener(\"finish\",p),r.removeListener(\"drain\",l),r.removeListener(\"error\",f),r.removeListener(\"unpipe\",o),t.removeListener(\"end\",a),t.removeListener(\"end\",C),t.removeListener(\"data\",g),c=!0,i.awaitDrain&&(!r._writableState||r._writableState.needDrain)&&l()}t.on(\"data\",g);function g(y){Dt(\"ondata\");var B=r.write(y);Dt(\"dest.write\",B),B===!1&&((i.pipesCount===1&&i.pipes===r||i.pipesCount>1&&Kce(i.pipes,r)!==-1)&&!c&&(Dt(\"false write response, pause\",i.awaitDrain),i.awaitDrain++),t.pause())}function f(y){Dt(\"onerror\",y),C(),r.removeListener(\"error\",f),Fce(r,\"error\")===0&&EE(r,y)}P6e(r,\"error\",f);function h(){r.removeListener(\"finish\",p),C()}r.once(\"close\",h);function p(){Dt(\"onfinish\"),r.removeListener(\"close\",h),C()}r.once(\"finish\",p);function C(){Dt(\"unpipe\"),t.unpipe(r)}return r.emit(\"pipe\",t),i.flowing||(Dt(\"pipe resume\"),t.resume()),r};function N6e(r){return function(){var t=r._readableState;Dt(\"pipeOnDrain\",t.awaitDrain),t.awaitDrain&&t.awaitDrain--,t.awaitDrain===0&&Fce(r,\"data\")&&(t.flowing=!0,JM(r))}}Ut.prototype.unpipe=function(r){var e=this._readableState,t={hasUnpiped:!1};if(e.pipesCount===0)return this;if(e.pipesCount===1)return r&&r!==e.pipes?this:(r||(r=e.pipes),e.pipes=null,e.pipesCount=0,e.flowing=!1,r&&r.emit(\"unpipe\",this,t),this);if(!r){var i=e.pipes,n=e.pipesCount;e.pipes=null,e.pipesCount=0,e.flowing=!1;for(var s=0;s<n;s++)i[s].emit(\"unpipe\",this,{hasUnpiped:!1});return this}var o=Kce(e.pipes,r);return o===-1?this:(e.pipes.splice(o,1),e.pipesCount-=1,e.pipesCount===1&&(e.pipes=e.pipes[0]),r.emit(\"unpipe\",this,t),this)};Ut.prototype.on=function(r,e){var t=IE.prototype.on.call(this,r,e),i=this._readableState;return r===\"data\"?(i.readableListening=this.listenerCount(\"readable\")>0,i.flowing!==!1&&this.resume()):r===\"readable\"&&!i.endEmitted&&!i.readableListening&&(i.readableListening=i.needReadable=!0,i.flowing=!1,i.emittedReadable=!1,Dt(\"on readable\",i.length,i.reading),i.length?vb(this):i.reading||process.nextTick(T6e,this)),t};Ut.prototype.addListener=Ut.prototype.on;Ut.prototype.removeListener=function(r,e){var t=IE.prototype.removeListener.call(this,r,e);return r===\"readable\"&&process.nextTick(Oce,this),t};Ut.prototype.removeAllListeners=function(r){var e=IE.prototype.removeAllListeners.apply(this,arguments);return(r===\"readable\"||r===void 0)&&process.nextTick(Oce,this),e};function Oce(r){var e=r._readableState;e.readableListening=r.listenerCount(\"readable\")>0,e.resumeScheduled&&!e.paused?e.flowing=!0:r.listenerCount(\"data\")>0&&r.resume()}function T6e(r){Dt(\"readable nexttick read 0\"),r.read(0)}Ut.prototype.resume=function(){var r=this._readableState;return r.flowing||(Dt(\"resume\"),r.flowing=!r.readableListening,L6e(this,r)),r.paused=!1,this};function L6e(r,e){e.resumeScheduled||(e.resumeScheduled=!0,process.nextTick(O6e,r,e))}function O6e(r,e){Dt(\"resume\",e.reading),e.reading||r.read(0),e.resumeScheduled=!1,r.emit(\"resume\"),JM(r),e.flowing&&!e.reading&&r.read(0)}Ut.prototype.pause=function(){return Dt(\"call pause flowing=%j\",this._readableState.flowing),this._readableState.flowing!==!1&&(Dt(\"pause\"),this._readableState.flowing=!1,this.emit(\"pause\")),this._readableState.paused=!0,this};function JM(r){var e=r._readableState;for(Dt(\"flow\",e.flowing);e.flowing&&r.read()!==null;);}Ut.prototype.wrap=function(r){var e=this,t=this._readableState,i=!1;r.on(\"end\",function(){if(Dt(\"wrapped end\"),t.decoder&&!t.ended){var o=t.decoder.end();o&&o.length&&e.push(o)}e.push(null)}),r.on(\"data\",function(o){if(Dt(\"wrapped data\"),t.decoder&&(o=t.decoder.write(o)),!(t.objectMode&&o==null)&&!(!t.objectMode&&(!o||!o.length))){var a=e.push(o);a||(i=!0,r.pause())}});for(var n in r)this[n]===void 0&&typeof r[n]==\"function\"&&(this[n]=function(a){return function(){return r[a].apply(r,arguments)}}(n));for(var s=0;s<HM.length;s++)r.on(HM[s],this.emit.bind(this,HM[s]));return this._read=function(o){Dt(\"wrapped _read\",o),i&&(i=!1,r.resume())},this};typeof Symbol==\"function\"&&(Ut.prototype[Symbol.asyncIterator]=function(){return KM===void 0&&(KM=Sce()),KM(this)});Object.defineProperty(Ut.prototype,\"readableHighWaterMark\",{enumerable:!1,get:function(){return this._readableState.highWaterMark}});Object.defineProperty(Ut.prototype,\"readableBuffer\",{enumerable:!1,get:function(){return this._readableState&&this._readableState.buffer}});Object.defineProperty(Ut.prototype,\"readableFlowing\",{enumerable:!1,get:function(){return this._readableState.flowing},set:function(e){this._readableState&&(this._readableState.flowing=e)}});Ut._fromList=Mce;Object.defineProperty(Ut.prototype,\"readableLength\",{enumerable:!1,get:function(){return this._readableState.length}});function Mce(r,e){if(e.length===0)return null;var t;return e.objectMode?t=e.buffer.shift():!r||r>=e.length?(e.decoder?t=e.buffer.join(\"\"):e.buffer.length===1?t=e.buffer.first():t=e.buffer.concat(e.length),e.buffer.clear()):t=e.buffer.consume(r,e.decoder),t}function YM(r){var e=r._readableState;Dt(\"endReadable\",e.endEmitted),e.endEmitted||(e.ended=!0,process.nextTick(M6e,e,r))}function M6e(r,e){if(Dt(\"endReadableNT\",r.endEmitted,r.length),!r.endEmitted&&r.length===0&&(r.endEmitted=!0,e.readable=!1,e.emit(\"end\"),r.autoDestroy)){var t=e._writableState;(!t||t.autoDestroy&&t.finished)&&e.destroy()}}typeof Symbol==\"function\"&&(Ut.from=function(r,e){return UM===void 0&&(UM=Dce()),UM(Ut,r,e)});function Kce(r,e){for(var t=0,i=r.length;t<i;t++)if(r[t]===e)return t;return-1}});var WM=w((fbt,Gce)=>{\"use strict\";Gce.exports=pA;var xb=Sl().codes,K6e=xb.ERR_METHOD_NOT_IMPLEMENTED,U6e=xb.ERR_MULTIPLE_CALLBACK,H6e=xb.ERR_TRANSFORM_ALREADY_TRANSFORMING,G6e=xb.ERR_TRANSFORM_WITH_LENGTH_0,Pb=qu();vl()(pA,Pb);function Y6e(r,e){var t=this._transformState;t.transforming=!1;var i=t.writecb;if(i===null)return this.emit(\"error\",new U6e);t.writechunk=null,t.writecb=null,e!=null&&this.push(e),i(r);var n=this._readableState;n.reading=!1,(n.needReadable||n.length<n.highWaterMark)&&this._read(n.highWaterMark)}function pA(r){if(!(this instanceof pA))return new pA(r);Pb.call(this,r),this._transformState={afterTransform:Y6e.bind(this),needTransform:!1,transforming:!1,writecb:null,writechunk:null,writeencoding:null},this._readableState.needReadable=!0,this._readableState.sync=!1,r&&(typeof r.transform==\"function\"&&(this._transform=r.transform),typeof r.flush==\"function\"&&(this._flush=r.flush)),this.on(\"prefinish\",j6e)}function j6e(){var r=this;typeof this._flush==\"function\"&&!this._readableState.destroyed?this._flush(function(e,t){Hce(r,e,t)}):Hce(this,null,null)}pA.prototype.push=function(r,e){return this._transformState.needTransform=!1,Pb.prototype.push.call(this,r,e)};pA.prototype._transform=function(r,e,t){t(new K6e(\"_transform()\"))};pA.prototype._write=function(r,e,t){var i=this._transformState;if(i.writecb=t,i.writechunk=r,i.writeencoding=e,!i.transforming){var n=this._readableState;(i.needTransform||n.needReadable||n.length<n.highWaterMark)&&this._read(n.highWaterMark)}};pA.prototype._read=function(r){var e=this._transformState;e.writechunk!==null&&!e.transforming?(e.transforming=!0,this._transform(e.writechunk,e.writeencoding,e.afterTransform)):e.needTransform=!0};pA.prototype._destroy=function(r,e){Pb.prototype._destroy.call(this,r,function(t){e(t)})};function Hce(r,e,t){if(e)return r.emit(\"error\",e);if(t!=null&&r.push(t),r._writableState.length)throw new G6e;if(r._transformState.transforming)throw new H6e;return r.push(null)}});var qce=w((hbt,jce)=>{\"use strict\";jce.exports=yE;var Yce=WM();vl()(yE,Yce);function yE(r){if(!(this instanceof yE))return new yE(r);Yce.call(this,r)}yE.prototype._transform=function(r,e,t){t(null,r)}});var Xce=w((pbt,Vce)=>{\"use strict\";var zM;function q6e(r){var e=!1;return function(){e||(e=!0,r.apply(void 0,arguments))}}var zce=Sl().codes,J6e=zce.ERR_MISSING_ARGS,W6e=zce.ERR_STREAM_DESTROYED;function Jce(r){if(r)throw r}function z6e(r){return r.setHeader&&typeof r.abort==\"function\"}function V6e(r,e,t,i){i=q6e(i);var n=!1;r.on(\"close\",function(){n=!0}),zM===void 0&&(zM=wb()),zM(r,{readable:e,writable:t},function(o){if(o)return i(o);n=!0,i()});var s=!1;return function(o){if(!n&&!s){if(s=!0,z6e(r))return r.abort();if(typeof r.destroy==\"function\")return r.destroy();i(o||new W6e(\"pipe\"))}}}function Wce(r){r()}function X6e(r,e){return r.pipe(e)}function Z6e(r){return!r.length||typeof r[r.length-1]!=\"function\"?Jce:r.pop()}function _6e(){for(var r=arguments.length,e=new Array(r),t=0;t<r;t++)e[t]=arguments[t];var i=Z6e(e);if(Array.isArray(e[0])&&(e=e[0]),e.length<2)throw new J6e(\"streams\");var n,s=e.map(function(o,a){var l=a<e.length-1,c=a>0;return V6e(o,l,c,function(u){n||(n=u),u&&s.forEach(Wce),!l&&(s.forEach(Wce),i(n))})});return e.reduce(X6e)}Vce.exports=_6e});var gp=w((Ms,BE)=>{var wE=J(\"stream\");process.env.READABLE_STREAM===\"disable\"&&wE?(BE.exports=wE.Readable,Object.assign(BE.exports,wE),BE.exports.Stream=wE):(Ms=BE.exports=RM(),Ms.Stream=wE||Ms,Ms.Readable=Ms,Ms.Writable=PM(),Ms.Duplex=qu(),Ms.Transform=WM(),Ms.PassThrough=qce(),Ms.finished=wb(),Ms.pipeline=Xce())});var $ce=w((dbt,_ce)=>{\"use strict\";var{Buffer:Eo}=J(\"buffer\"),Zce=Symbol.for(\"BufferList\");function fr(r){if(!(this instanceof fr))return new fr(r);fr._init.call(this,r)}fr._init=function(e){Object.defineProperty(this,Zce,{value:!0}),this._bufs=[],this.length=0,e&&this.append(e)};fr.prototype._new=function(e){return new fr(e)};fr.prototype._offset=function(e){if(e===0)return[0,0];let t=0;for(let i=0;i<this._bufs.length;i++){let n=t+this._bufs[i].length;if(e<n||i===this._bufs.length-1)return[i,e-t];t=n}};fr.prototype._reverseOffset=function(r){let e=r[0],t=r[1];for(let i=0;i<e;i++)t+=this._bufs[i].length;return t};fr.prototype.get=function(e){if(e>this.length||e<0)return;let t=this._offset(e);return this._bufs[t[0]][t[1]]};fr.prototype.slice=function(e,t){return typeof e==\"number\"&&e<0&&(e+=this.length),typeof t==\"number\"&&t<0&&(t+=this.length),this.copy(null,0,e,t)};fr.prototype.copy=function(e,t,i,n){if((typeof i!=\"number\"||i<0)&&(i=0),(typeof n!=\"number\"||n>this.length)&&(n=this.length),i>=this.length||n<=0)return e||Eo.alloc(0);let s=!!e,o=this._offset(i),a=n-i,l=a,c=s&&t||0,u=o[1];if(i===0&&n===this.length){if(!s)return this._bufs.length===1?this._bufs[0]:Eo.concat(this._bufs,this.length);for(let g=0;g<this._bufs.length;g++)this._bufs[g].copy(e,c),c+=this._bufs[g].length;return e}if(l<=this._bufs[o[0]].length-u)return s?this._bufs[o[0]].copy(e,t,u,u+l):this._bufs[o[0]].slice(u,u+l);s||(e=Eo.allocUnsafe(a));for(let g=o[0];g<this._bufs.length;g++){let f=this._bufs[g].length-u;if(l>f)this._bufs[g].copy(e,c,u),c+=f;else{this._bufs[g].copy(e,c,u,u+l),c+=f;break}l-=f,u&&(u=0)}return e.length>c?e.slice(0,c):e};fr.prototype.shallowSlice=function(e,t){if(e=e||0,t=typeof t!=\"number\"?this.length:t,e<0&&(e+=this.length),t<0&&(t+=this.length),e===t)return this._new();let i=this._offset(e),n=this._offset(t),s=this._bufs.slice(i[0],n[0]+1);return n[1]===0?s.pop():s[s.length-1]=s[s.length-1].slice(0,n[1]),i[1]!==0&&(s[0]=s[0].slice(i[1])),this._new(s)};fr.prototype.toString=function(e,t,i){return this.slice(t,i).toString(e)};fr.prototype.consume=function(e){if(e=Math.trunc(e),Number.isNaN(e)||e<=0)return this;for(;this._bufs.length;)if(e>=this._bufs[0].length)e-=this._bufs[0].length,this.length-=this._bufs[0].length,this._bufs.shift();else{this._bufs[0]=this._bufs[0].slice(e),this.length-=e;break}return this};fr.prototype.duplicate=function(){let e=this._new();for(let t=0;t<this._bufs.length;t++)e.append(this._bufs[t]);return e};fr.prototype.append=function(e){if(e==null)return this;if(e.buffer)this._appendBuffer(Eo.from(e.buffer,e.byteOffset,e.byteLength));else if(Array.isArray(e))for(let t=0;t<e.length;t++)this.append(e[t]);else if(this._isBufferList(e))for(let t=0;t<e._bufs.length;t++)this.append(e._bufs[t]);else typeof e==\"number\"&&(e=e.toString()),this._appendBuffer(Eo.from(e));return this};fr.prototype._appendBuffer=function(e){this._bufs.push(e),this.length+=e.length};fr.prototype.indexOf=function(r,e,t){if(t===void 0&&typeof e==\"string\"&&(t=e,e=void 0),typeof r==\"function\"||Array.isArray(r))throw new TypeError('The \"value\" argument must be one of type string, Buffer, BufferList, or Uint8Array.');if(typeof r==\"number\"?r=Eo.from([r]):typeof r==\"string\"?r=Eo.from(r,t):this._isBufferList(r)?r=r.slice():Array.isArray(r.buffer)?r=Eo.from(r.buffer,r.byteOffset,r.byteLength):Eo.isBuffer(r)||(r=Eo.from(r)),e=Number(e||0),isNaN(e)&&(e=0),e<0&&(e=this.length+e),e<0&&(e=0),r.length===0)return e>this.length?this.length:e;let i=this._offset(e),n=i[0],s=i[1];for(;n<this._bufs.length;n++){let o=this._bufs[n];for(;s<o.length;)if(o.length-s>=r.length){let l=o.indexOf(r,s);if(l!==-1)return this._reverseOffset([n,l]);s=o.length-r.length+1}else{let l=this._reverseOffset([n,s]);if(this._match(l,r))return l;s++}s=0}return-1};fr.prototype._match=function(r,e){if(this.length-r<e.length)return!1;for(let t=0;t<e.length;t++)if(this.get(r+t)!==e[t])return!1;return!0};(function(){let r={readDoubleBE:8,readDoubleLE:8,readFloatBE:4,readFloatLE:4,readInt32BE:4,readInt32LE:4,readUInt32BE:4,readUInt32LE:4,readInt16BE:2,readInt16LE:2,readUInt16BE:2,readUInt16LE:2,readInt8:1,readUInt8:1,readIntBE:null,readIntLE:null,readUIntBE:null,readUIntLE:null};for(let e in r)(function(t){r[t]===null?fr.prototype[t]=function(i,n){return this.slice(i,i+n)[t](0,n)}:fr.prototype[t]=function(i=0){return this.slice(i,i+r[t])[t](0)}})(e)})();fr.prototype._isBufferList=function(e){return e instanceof fr||fr.isBufferList(e)};fr.isBufferList=function(e){return e!=null&&e[Zce]};_ce.exports=fr});var eue=w((Cbt,Db)=>{\"use strict\";var VM=gp().Duplex,$6e=vl(),QE=$ce();function Wi(r){if(!(this instanceof Wi))return new Wi(r);if(typeof r==\"function\"){this._callback=r;let e=function(i){this._callback&&(this._callback(i),this._callback=null)}.bind(this);this.on(\"pipe\",function(i){i.on(\"error\",e)}),this.on(\"unpipe\",function(i){i.removeListener(\"error\",e)}),r=null}QE._init.call(this,r),VM.call(this)}$6e(Wi,VM);Object.assign(Wi.prototype,QE.prototype);Wi.prototype._new=function(e){return new Wi(e)};Wi.prototype._write=function(e,t,i){this._appendBuffer(e),typeof i==\"function\"&&i()};Wi.prototype._read=function(e){if(!this.length)return this.push(null);e=Math.min(e,this.length),this.push(this.slice(0,e)),this.consume(e)};Wi.prototype.end=function(e){VM.prototype.end.call(this,e),this._callback&&(this._callback(null,this.slice()),this._callback=null)};Wi.prototype._destroy=function(e,t){this._bufs.length=0,this.length=0,t(e)};Wi.prototype._isBufferList=function(e){return e instanceof Wi||e instanceof QE||Wi.isBufferList(e)};Wi.isBufferList=QE.isBufferList;Db.exports=Wi;Db.exports.BufferListStream=Wi;Db.exports.BufferList=QE});var _M=w(hp=>{var eVe=Buffer.alloc,tVe=\"0000000000000000000\",rVe=\"7777777777777777777\",tue=\"0\".charCodeAt(0),rue=Buffer.from(\"ustar\\0\",\"binary\"),iVe=Buffer.from(\"00\",\"binary\"),nVe=Buffer.from(\"ustar \",\"binary\"),sVe=Buffer.from(\" \\0\",\"binary\"),oVe=parseInt(\"7777\",8),bE=257,ZM=263,aVe=function(r,e,t){return typeof r!=\"number\"?t:(r=~~r,r>=e?e:r>=0||(r+=e,r>=0)?r:0)},AVe=function(r){switch(r){case 0:return\"file\";case 1:return\"link\";case 2:return\"symlink\";case 3:return\"character-device\";case 4:return\"block-device\";case 5:return\"directory\";case 6:return\"fifo\";case 7:return\"contiguous-file\";case 72:return\"pax-header\";case 55:return\"pax-global-header\";case 27:return\"gnu-long-link-path\";case 28:case 30:return\"gnu-long-path\"}return null},lVe=function(r){switch(r){case\"file\":return 0;case\"link\":return 1;case\"symlink\":return 2;case\"character-device\":return 3;case\"block-device\":return 4;case\"directory\":return 5;case\"fifo\":return 6;case\"contiguous-file\":return 7;case\"pax-header\":return 72}return 0},iue=function(r,e,t,i){for(;t<i;t++)if(r[t]===e)return t;return i},nue=function(r){for(var e=256,t=0;t<148;t++)e+=r[t];for(var i=156;i<512;i++)e+=r[i];return e},Rl=function(r,e){return r=r.toString(8),r.length>e?rVe.slice(0,e)+\" \":tVe.slice(0,e-r.length)+r+\" \"};function cVe(r){var e;if(r[0]===128)e=!0;else if(r[0]===255)e=!1;else return null;for(var t=[],i=r.length-1;i>0;i--){var n=r[i];e?t.push(n):t.push(255-n)}var s=0,o=t.length;for(i=0;i<o;i++)s+=t[i]*Math.pow(256,i);return e?s:-1*s}var Fl=function(r,e,t){if(r=r.slice(e,e+t),e=0,r[e]&128)return cVe(r);for(;e<r.length&&r[e]===32;)e++;for(var i=aVe(iue(r,32,e,r.length),r.length,r.length);e<i&&r[e]===0;)e++;return i===e?0:parseInt(r.slice(e,i).toString(),8)},fp=function(r,e,t,i){return r.slice(e,iue(r,0,e,e+t)).toString(i)},XM=function(r){var e=Buffer.byteLength(r),t=Math.floor(Math.log(e)/Math.log(10))+1;return e+t>=Math.pow(10,t)&&t++,e+t+r};hp.decodeLongPath=function(r,e){return fp(r,0,r.length,e)};hp.encodePax=function(r){var e=\"\";r.name&&(e+=XM(\" path=\"+r.name+`\n`)),r.linkname&&(e+=XM(\" linkpath=\"+r.linkname+`\n`));var t=r.pax;if(t)for(var i in t)e+=XM(\" \"+i+\"=\"+t[i]+`\n`);return Buffer.from(e)};hp.decodePax=function(r){for(var e={};r.length;){for(var t=0;t<r.length&&r[t]!==32;)t++;var i=parseInt(r.slice(0,t).toString(),10);if(!i)return e;var n=r.slice(t+1,i-1).toString(),s=n.indexOf(\"=\");if(s===-1)return e;e[n.slice(0,s)]=n.slice(s+1),r=r.slice(i)}return e};hp.encode=function(r){var e=eVe(512),t=r.name,i=\"\";if(r.typeflag===5&&t[t.length-1]!==\"/\"&&(t+=\"/\"),Buffer.byteLength(t)!==t.length)return null;for(;Buffer.byteLength(t)>100;){var n=t.indexOf(\"/\");if(n===-1)return null;i+=i?\"/\"+t.slice(0,n):t.slice(0,n),t=t.slice(n+1)}return Buffer.byteLength(t)>100||Buffer.byteLength(i)>155||r.linkname&&Buffer.byteLength(r.linkname)>100?null:(e.write(t),e.write(Rl(r.mode&oVe,6),100),e.write(Rl(r.uid,6),108),e.write(Rl(r.gid,6),116),e.write(Rl(r.size,11),124),e.write(Rl(r.mtime.getTime()/1e3|0,11),136),e[156]=tue+lVe(r.type),r.linkname&&e.write(r.linkname,157),rue.copy(e,bE),iVe.copy(e,ZM),r.uname&&e.write(r.uname,265),r.gname&&e.write(r.gname,297),e.write(Rl(r.devmajor||0,6),329),e.write(Rl(r.devminor||0,6),337),i&&e.write(i,345),e.write(Rl(nue(e),6),148),e)};hp.decode=function(r,e,t){var i=r[156]===0?0:r[156]-tue,n=fp(r,0,100,e),s=Fl(r,100,8),o=Fl(r,108,8),a=Fl(r,116,8),l=Fl(r,124,12),c=Fl(r,136,12),u=AVe(i),g=r[157]===0?null:fp(r,157,100,e),f=fp(r,265,32),h=fp(r,297,32),p=Fl(r,329,8),C=Fl(r,337,8),y=nue(r);if(y===8*32)return null;if(y!==Fl(r,148,8))throw new Error(\"Invalid tar header. Maybe the tar is corrupted or it needs to be gunzipped?\");if(rue.compare(r,bE,bE+6)===0)r[345]&&(n=fp(r,345,155,e)+\"/\"+n);else if(!(nVe.compare(r,bE,bE+6)===0&&sVe.compare(r,ZM,ZM+2)===0)){if(!t)throw new Error(\"Invalid tar header: unknown format.\")}return i===0&&n&&n[n.length-1]===\"/\"&&(i=5),{name:n,mode:s,uid:o,gid:a,size:l,mtime:new Date(1e3*c),type:u,linkname:g,uname:f,gname:h,devmajor:p,devminor:C}}});var uue=w((Ebt,cue)=>{var oue=J(\"util\"),uVe=eue(),SE=_M(),aue=gp().Writable,Aue=gp().PassThrough,lue=function(){},sue=function(r){return r&=511,r&&512-r},gVe=function(r,e){var t=new kb(r,e);return t.end(),t},fVe=function(r,e){return e.path&&(r.name=e.path),e.linkpath&&(r.linkname=e.linkpath),e.size&&(r.size=parseInt(e.size,10)),r.pax=e,r},kb=function(r,e){this._parent=r,this.offset=e,Aue.call(this,{autoDestroy:!1})};oue.inherits(kb,Aue);kb.prototype.destroy=function(r){this._parent.destroy(r)};var dA=function(r){if(!(this instanceof dA))return new dA(r);aue.call(this,r),r=r||{},this._offset=0,this._buffer=uVe(),this._missing=0,this._partial=!1,this._onparse=lue,this._header=null,this._stream=null,this._overflow=null,this._cb=null,this._locked=!1,this._destroyed=!1,this._pax=null,this._paxGlobal=null,this._gnuLongPath=null,this._gnuLongLinkPath=null;var e=this,t=e._buffer,i=function(){e._continue()},n=function(f){if(e._locked=!1,f)return e.destroy(f);e._stream||i()},s=function(){e._stream=null;var f=sue(e._header.size);f?e._parse(f,o):e._parse(512,g),e._locked||i()},o=function(){e._buffer.consume(sue(e._header.size)),e._parse(512,g),i()},a=function(){var f=e._header.size;e._paxGlobal=SE.decodePax(t.slice(0,f)),t.consume(f),s()},l=function(){var f=e._header.size;e._pax=SE.decodePax(t.slice(0,f)),e._paxGlobal&&(e._pax=Object.assign({},e._paxGlobal,e._pax)),t.consume(f),s()},c=function(){var f=e._header.size;this._gnuLongPath=SE.decodeLongPath(t.slice(0,f),r.filenameEncoding),t.consume(f),s()},u=function(){var f=e._header.size;this._gnuLongLinkPath=SE.decodeLongPath(t.slice(0,f),r.filenameEncoding),t.consume(f),s()},g=function(){var f=e._offset,h;try{h=e._header=SE.decode(t.slice(0,512),r.filenameEncoding,r.allowUnknownFormat)}catch(p){e.emit(\"error\",p)}if(t.consume(512),!h){e._parse(512,g),i();return}if(h.type===\"gnu-long-path\"){e._parse(h.size,c),i();return}if(h.type===\"gnu-long-link-path\"){e._parse(h.size,u),i();return}if(h.type===\"pax-global-header\"){e._parse(h.size,a),i();return}if(h.type===\"pax-header\"){e._parse(h.size,l),i();return}if(e._gnuLongPath&&(h.name=e._gnuLongPath,e._gnuLongPath=null),e._gnuLongLinkPath&&(h.linkname=e._gnuLongLinkPath,e._gnuLongLinkPath=null),e._pax&&(e._header=h=fVe(h,e._pax),e._pax=null),e._locked=!0,!h.size||h.type===\"directory\"){e._parse(512,g),e.emit(\"entry\",h,gVe(e,f),n);return}e._stream=new kb(e,f),e.emit(\"entry\",h,e._stream,n),e._parse(h.size,s),i()};this._onheader=g,this._parse(512,g)};oue.inherits(dA,aue);dA.prototype.destroy=function(r){this._destroyed||(this._destroyed=!0,r&&this.emit(\"error\",r),this.emit(\"close\"),this._stream&&this._stream.emit(\"close\"))};dA.prototype._parse=function(r,e){this._destroyed||(this._offset+=r,this._missing=r,e===this._onheader&&(this._partial=!1),this._onparse=e)};dA.prototype._continue=function(){if(!this._destroyed){var r=this._cb;this._cb=lue,this._overflow?this._write(this._overflow,void 0,r):r()}};dA.prototype._write=function(r,e,t){if(!this._destroyed){var i=this._stream,n=this._buffer,s=this._missing;if(r.length&&(this._partial=!0),r.length<s)return this._missing-=r.length,this._overflow=null,i?i.write(r,t):(n.append(r),t());this._cb=t,this._missing=0;var o=null;r.length>s&&(o=r.slice(s),r=r.slice(0,s)),i?i.end(r):n.append(r),this._overflow=o,this._onparse()}};dA.prototype._final=function(r){if(this._partial)return this.destroy(new Error(\"Unexpected end of data\"));r()};cue.exports=dA});var fue=w((Ibt,gue)=>{gue.exports=J(\"fs\").constants||J(\"constants\")});var mue=w((ybt,Cue)=>{var pp=fue(),hue=Pk(),Fb=vl(),hVe=Buffer.alloc,pue=gp().Readable,dp=gp().Writable,pVe=J(\"string_decoder\").StringDecoder,Rb=_M(),dVe=parseInt(\"755\",8),CVe=parseInt(\"644\",8),due=hVe(1024),e1=function(){},$M=function(r,e){e&=511,e&&r.push(due.slice(0,512-e))};function mVe(r){switch(r&pp.S_IFMT){case pp.S_IFBLK:return\"block-device\";case pp.S_IFCHR:return\"character-device\";case pp.S_IFDIR:return\"directory\";case pp.S_IFIFO:return\"fifo\";case pp.S_IFLNK:return\"symlink\"}return\"file\"}var Nb=function(r){dp.call(this),this.written=0,this._to=r,this._destroyed=!1};Fb(Nb,dp);Nb.prototype._write=function(r,e,t){if(this.written+=r.length,this._to.push(r))return t();this._to._drain=t};Nb.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit(\"close\"))};var Tb=function(){dp.call(this),this.linkname=\"\",this._decoder=new pVe(\"utf-8\"),this._destroyed=!1};Fb(Tb,dp);Tb.prototype._write=function(r,e,t){this.linkname+=this._decoder.write(r),t()};Tb.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit(\"close\"))};var vE=function(){dp.call(this),this._destroyed=!1};Fb(vE,dp);vE.prototype._write=function(r,e,t){t(new Error(\"No body allowed for this entry\"))};vE.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit(\"close\"))};var la=function(r){if(!(this instanceof la))return new la(r);pue.call(this,r),this._drain=e1,this._finalized=!1,this._finalizing=!1,this._destroyed=!1,this._stream=null};Fb(la,pue);la.prototype.entry=function(r,e,t){if(this._stream)throw new Error(\"already piping an entry\");if(!(this._finalized||this._destroyed)){typeof e==\"function\"&&(t=e,e=null),t||(t=e1);var i=this;if((!r.size||r.type===\"symlink\")&&(r.size=0),r.type||(r.type=mVe(r.mode)),r.mode||(r.mode=r.type===\"directory\"?dVe:CVe),r.uid||(r.uid=0),r.gid||(r.gid=0),r.mtime||(r.mtime=new Date),typeof e==\"string\"&&(e=Buffer.from(e)),Buffer.isBuffer(e)){r.size=e.length,this._encode(r);var n=this.push(e);return $M(i,r.size),n?process.nextTick(t):this._drain=t,new vE}if(r.type===\"symlink\"&&!r.linkname){var s=new Tb;return hue(s,function(a){if(a)return i.destroy(),t(a);r.linkname=s.linkname,i._encode(r),t()}),s}if(this._encode(r),r.type!==\"file\"&&r.type!==\"contiguous-file\")return process.nextTick(t),new vE;var o=new Nb(this);return this._stream=o,hue(o,function(a){if(i._stream=null,a)return i.destroy(),t(a);if(o.written!==r.size)return i.destroy(),t(new Error(\"size mismatch\"));$M(i,r.size),i._finalizing&&i.finalize(),t()}),o}};la.prototype.finalize=function(){if(this._stream){this._finalizing=!0;return}this._finalized||(this._finalized=!0,this.push(due),this.push(null))};la.prototype.destroy=function(r){this._destroyed||(this._destroyed=!0,r&&this.emit(\"error\",r),this.emit(\"close\"),this._stream&&this._stream.destroy&&this._stream.destroy())};la.prototype._encode=function(r){if(!r.pax){var e=Rb.encode(r);if(e){this.push(e);return}}this._encodePax(r)};la.prototype._encodePax=function(r){var e=Rb.encodePax({name:r.name,linkname:r.linkname,pax:r.pax}),t={name:\"PaxHeader\",mode:r.mode,uid:r.uid,gid:r.gid,size:e.length,mtime:r.mtime,type:\"pax-header\",linkname:r.linkname&&\"PaxHeader\",uname:r.uname,gname:r.gname,devmajor:r.devmajor,devminor:r.devminor};this.push(Rb.encode(t)),this.push(e),$M(this,e.length),t.size=r.size,t.type=r.type,this.push(Rb.encode(t))};la.prototype._read=function(r){var e=this._drain;this._drain=e1,e()};Cue.exports=la});var Eue=w(t1=>{t1.extract=uue();t1.pack=mue()});var kue=w((Ybt,Due)=>{\"use strict\";var Xu=class{constructor(e,t,i){this.__specs=e||{},Object.keys(this.__specs).forEach(n=>{if(typeof this.__specs[n]==\"string\"){let s=this.__specs[n],o=this.__specs[s];if(o){let a=o.aliases||[];a.push(n,s),o.aliases=[...new Set(a)],this.__specs[n]=o}else throw new Error(`Alias refers to invalid key: ${s} -> ${n}`)}}),this.__opts=t||{},this.__providers=xue(i.filter(n=>n!=null&&typeof n==\"object\")),this.__isFiggyPudding=!0}get(e){return a1(this,e,!0)}get[Symbol.toStringTag](){return\"FiggyPudding\"}forEach(e,t=this){for(let[i,n]of this.entries())e.call(t,n,i,this)}toJSON(){let e={};return this.forEach((t,i)=>{e[i]=t}),e}*entries(e){for(let i of Object.keys(this.__specs))yield[i,this.get(i)];let t=e||this.__opts.other;if(t){let i=new Set;for(let n of this.__providers){let s=n.entries?n.entries(t):FVe(n);for(let[o,a]of s)t(o)&&!i.has(o)&&(i.add(o),yield[o,a])}}}*[Symbol.iterator](){for(let[e,t]of this.entries())yield[e,t]}*keys(){for(let[e]of this.entries())yield e}*values(){for(let[,e]of this.entries())yield e}concat(...e){return new Proxy(new Xu(this.__specs,this.__opts,xue(this.__providers).concat(e)),Pue)}};try{let r=J(\"util\");Xu.prototype[r.inspect.custom]=function(e,t){return this[Symbol.toStringTag]+\" \"+r.inspect(this.toJSON(),t)}}catch{}function kVe(r){throw Object.assign(new Error(`invalid config key requested: ${r}`),{code:\"EBADKEY\"})}function a1(r,e,t){let i=r.__specs[e];if(t&&!i&&(!r.__opts.other||!r.__opts.other(e)))kVe(e);else{i||(i={});let n;for(let s of r.__providers){if(n=vue(e,s),n===void 0&&i.aliases&&i.aliases.length){for(let o of i.aliases)if(o!==e&&(n=vue(o,s),n!==void 0))break}if(n!==void 0)break}return n===void 0&&i.default!==void 0?typeof i.default==\"function\"?i.default(r):i.default:n}}function vue(r,e){let t;return e.__isFiggyPudding?t=a1(e,r,!1):typeof e.get==\"function\"?t=e.get(r):t=e[r],t}var Pue={has(r,e){return e in r.__specs&&a1(r,e,!1)!==void 0},ownKeys(r){return Object.keys(r.__specs)},get(r,e){return typeof e==\"symbol\"||e.slice(0,2)===\"__\"||e in Xu.prototype?r[e]:r.get(e)},set(r,e,t){if(typeof e==\"symbol\"||e.slice(0,2)===\"__\")return r[e]=t,!0;throw new Error(\"figgyPudding options cannot be modified. Use .concat() instead.\")},deleteProperty(){throw new Error(\"figgyPudding options cannot be deleted. Use .concat() and shadow them instead.\")}};Due.exports=RVe;function RVe(r,e){function t(...i){return new Proxy(new Xu(r,e,i),Pue)}return t}function xue(r){let e=[];return r.forEach(t=>e.unshift(t)),e}function FVe(r){return Object.keys(r).map(e=>[e,r[e]])}});var Nue=w((jbt,ga)=>{\"use strict\";var PE=J(\"crypto\"),NVe=kue(),TVe=J(\"stream\").Transform,Rue=[\"sha256\",\"sha384\",\"sha512\"],LVe=/^[a-z0-9+/]+(?:=?=?)$/i,OVe=/^([^-]+)-([^?]+)([?\\S*]*)$/,MVe=/^([^-]+)-([A-Za-z0-9+/=]{44,88})(\\?[\\x21-\\x7E]*)*$/,KVe=/^[\\x21-\\x7E]+$/,An=NVe({algorithms:{default:[\"sha512\"]},error:{default:!1},integrity:{},options:{default:[]},pickAlgorithm:{default:()=>WVe},Promise:{default:()=>Promise},sep:{default:\" \"},single:{default:!1},size:{},strict:{default:!1}}),Nl=class{get isHash(){return!0}constructor(e,t){t=An(t);let i=!!t.strict;this.source=e.trim();let n=this.source.match(i?MVe:OVe);if(!n||i&&!Rue.some(o=>o===n[1]))return;this.algorithm=n[1],this.digest=n[2];let s=n[3];this.options=s?s.slice(1).split(\"?\"):[]}hexDigest(){return this.digest&&Buffer.from(this.digest,\"base64\").toString(\"hex\")}toJSON(){return this.toString()}toString(e){if(e=An(e),e.strict&&!(Rue.some(i=>i===this.algorithm)&&this.digest.match(LVe)&&(this.options||[]).every(i=>i.match(KVe))))return\"\";let t=this.options&&this.options.length?`?${this.options.join(\"?\")}`:\"\";return`${this.algorithm}-${this.digest}${t}`}},Zu=class{get isIntegrity(){return!0}toJSON(){return this.toString()}toString(e){e=An(e);let t=e.sep||\" \";return e.strict&&(t=t.replace(/\\S+/g,\" \")),Object.keys(this).map(i=>this[i].map(n=>Nl.prototype.toString.call(n,e)).filter(n=>n.length).join(t)).filter(i=>i.length).join(t)}concat(e,t){t=An(t);let i=typeof e==\"string\"?e:xE(e,t);return ua(`${this.toString(t)} ${i}`,t)}hexDigest(){return ua(this,{single:!0}).hexDigest()}match(e,t){t=An(t);let i=ua(e,t),n=i.pickAlgorithm(t);return this[n]&&i[n]&&this[n].find(s=>i[n].find(o=>s.digest===o.digest))||!1}pickAlgorithm(e){e=An(e);let t=e.pickAlgorithm,i=Object.keys(this);if(!i.length)throw new Error(`No algorithms available for ${JSON.stringify(this.toString())}`);return i.reduce((n,s)=>t(n,s)||n)}};ga.exports.parse=ua;function ua(r,e){if(e=An(e),typeof r==\"string\")return A1(r,e);if(r.algorithm&&r.digest){let t=new Zu;return t[r.algorithm]=[r],A1(xE(t,e),e)}else return A1(xE(r,e),e)}function A1(r,e){return e.single?new Nl(r,e):r.trim().split(/\\s+/).reduce((t,i)=>{let n=new Nl(i,e);if(n.algorithm&&n.digest){let s=n.algorithm;t[s]||(t[s]=[]),t[s].push(n)}return t},new Zu)}ga.exports.stringify=xE;function xE(r,e){return e=An(e),r.algorithm&&r.digest?Nl.prototype.toString.call(r,e):typeof r==\"string\"?xE(ua(r,e),e):Zu.prototype.toString.call(r,e)}ga.exports.fromHex=UVe;function UVe(r,e,t){t=An(t);let i=t.options&&t.options.length?`?${t.options.join(\"?\")}`:\"\";return ua(`${e}-${Buffer.from(r,\"hex\").toString(\"base64\")}${i}`,t)}ga.exports.fromData=HVe;function HVe(r,e){e=An(e);let t=e.algorithms,i=e.options&&e.options.length?`?${e.options.join(\"?\")}`:\"\";return t.reduce((n,s)=>{let o=PE.createHash(s).update(r).digest(\"base64\"),a=new Nl(`${s}-${o}${i}`,e);if(a.algorithm&&a.digest){let l=a.algorithm;n[l]||(n[l]=[]),n[l].push(a)}return n},new Zu)}ga.exports.fromStream=GVe;function GVe(r,e){e=An(e);let t=e.Promise||Promise,i=l1(e);return new t((n,s)=>{r.pipe(i),r.on(\"error\",s),i.on(\"error\",s);let o;i.on(\"integrity\",a=>{o=a}),i.on(\"end\",()=>n(o)),i.on(\"data\",()=>{})})}ga.exports.checkData=YVe;function YVe(r,e,t){if(t=An(t),e=ua(e,t),!Object.keys(e).length){if(t.error)throw Object.assign(new Error(\"No valid integrity hashes to check against\"),{code:\"EINTEGRITY\"});return!1}let i=e.pickAlgorithm(t),n=PE.createHash(i).update(r).digest(\"base64\"),s=ua({algorithm:i,digest:n}),o=s.match(e,t);if(o||!t.error)return o;if(typeof t.size==\"number\"&&r.length!==t.size){let a=new Error(`data size mismatch when checking ${e}.\n  Wanted: ${t.size}\n  Found: ${r.length}`);throw a.code=\"EBADSIZE\",a.found=r.length,a.expected=t.size,a.sri=e,a}else{let a=new Error(`Integrity checksum failed when using ${i}: Wanted ${e}, but got ${s}. (${r.length} bytes)`);throw a.code=\"EINTEGRITY\",a.found=s,a.expected=e,a.algorithm=i,a.sri=e,a}}ga.exports.checkStream=jVe;function jVe(r,e,t){t=An(t);let i=t.Promise||Promise,n=l1(t.concat({integrity:e}));return new i((s,o)=>{r.pipe(n),r.on(\"error\",o),n.on(\"error\",o);let a;n.on(\"verified\",l=>{a=l}),n.on(\"end\",()=>s(a)),n.on(\"data\",()=>{})})}ga.exports.integrityStream=l1;function l1(r){r=An(r);let e=r.integrity&&ua(r.integrity,r),t=e&&Object.keys(e).length,i=t&&e.pickAlgorithm(r),n=t&&e[i],s=Array.from(new Set(r.algorithms.concat(i?[i]:[]))),o=s.map(PE.createHash),a=0,l=new TVe({transform(c,u,g){a+=c.length,o.forEach(f=>f.update(c,u)),g(null,c,u)}}).on(\"end\",()=>{let c=r.options&&r.options.length?`?${r.options.join(\"?\")}`:\"\",u=ua(o.map((f,h)=>`${s[h]}-${f.digest(\"base64\")}${c}`).join(\" \"),r),g=t&&u.match(e,r);if(typeof r.size==\"number\"&&a!==r.size){let f=new Error(`stream size mismatch when checking ${e}.\n  Wanted: ${r.size}\n  Found: ${a}`);f.code=\"EBADSIZE\",f.found=a,f.expected=r.size,f.sri=e,l.emit(\"error\",f)}else if(r.integrity&&!g){let f=new Error(`${e} integrity checksum failed when using ${i}: wanted ${n} but got ${u}. (${a} bytes)`);f.code=\"EINTEGRITY\",f.found=u,f.expected=n,f.algorithm=i,f.sri=e,l.emit(\"error\",f)}else l.emit(\"size\",a),l.emit(\"integrity\",u),g&&l.emit(\"verified\",g)});return l}ga.exports.create=qVe;function qVe(r){r=An(r);let e=r.algorithms,t=r.options.length?`?${r.options.join(\"?\")}`:\"\",i=e.map(PE.createHash);return{update:function(n,s){return i.forEach(o=>o.update(n,s)),this},digest:function(n){return e.reduce((o,a)=>{let l=i.shift().digest(\"base64\"),c=new Nl(`${a}-${l}${t}`,r);if(c.algorithm&&c.digest){let u=c.algorithm;o[u]||(o[u]=[]),o[u].push(c)}return o},new Zu)}}}var JVe=new Set(PE.getHashes()),Fue=[\"md5\",\"whirlpool\",\"sha1\",\"sha224\",\"sha256\",\"sha384\",\"sha512\",\"sha3\",\"sha3-256\",\"sha3-384\",\"sha3-512\",\"sha3_256\",\"sha3_384\",\"sha3_512\"].filter(r=>JVe.has(r));function WVe(r,e){return Fue.indexOf(r.toLowerCase())>=Fue.indexOf(e.toLowerCase())?r:e}});var sm={};ut(sm,{BuildType:()=>O0,Cache:()=>Rt,Configuration:()=>ye,DEFAULT_LOCK_FILENAME:()=>ok,DEFAULT_RC_FILENAME:()=>sk,FormatType:()=>xi,InstallMode:()=>ts,LightReport:()=>ra,LinkType:()=>Ef,Manifest:()=>ot,MessageName:()=>Ct,MultiFetcher:()=>Df,PackageExtensionStatus:()=>Xx,PackageExtensionType:()=>Vx,Project:()=>je,ProjectLookup:()=>ck,Report:()=>vi,ReportError:()=>at,SettingsType:()=>ak,StreamReport:()=>Ge,TAG_REGEXP:()=>Rf,TelemetryManager:()=>Sh,ThrowReport:()=>ti,VirtualFetcher:()=>Ff,Workspace:()=>bh,WorkspaceFetcher:()=>Tf,WorkspaceResolver:()=>jr,YarnVersion:()=>Tr,execUtils:()=>Cr,folderUtils:()=>Tw,formatUtils:()=>ee,hashUtils:()=>li,httpUtils:()=>Xt,miscUtils:()=>Ie,nodeUtils:()=>ws,parseMessageName:()=>LI,scriptUtils:()=>Wt,semverUtils:()=>vt,stringifyMessageName:()=>NA,structUtils:()=>P,tgzUtils:()=>mi,treeUtils:()=>es});var Cr={};ut(Cr,{EndStrategy:()=>hk,ExecError:()=>Yw,PipeError:()=>dC,execvp:()=>tk,pipevp:()=>Wo});var Wp={};ut(Wp,{AliasFS:()=>bo,CustomDir:()=>Hp,CwdFS:()=>qt,DEFAULT_COMPRESSION_LEVEL:()=>Xl,FakeFS:()=>ya,Filename:()=>xt,JailFS:()=>So,LazyFS:()=>Sg,LinkStrategy:()=>CS,NoFS:()=>jp,NodeFS:()=>$t,PortablePath:()=>Oe,PosixFS:()=>vg,ProxiedFS:()=>pi,VirtualFS:()=>Br,ZipFS:()=>Wr,ZipOpenFS:()=>Kn,constants:()=>xr,extendFs:()=>AI,normalizeLineEndings:()=>Vl,npath:()=>K,opendir:()=>tI,patchFs:()=>QS,ppath:()=>x,statUtils:()=>Op,toFilename:()=>Ur,xfs:()=>M});var xr={};ut(xr,{SAFE_TIME:()=>iK,S_IFDIR:()=>Jl,S_IFLNK:()=>zl,S_IFMT:()=>qs,S_IFREG:()=>Wl});var qs=61440,Jl=16384,Wl=32768,zl=40960,iK=456789e3;var Op={};ut(Op,{BigIntStatsEntry:()=>Bg,DEFAULT_MODE:()=>Tp,DirEntry:()=>cS,StatEntry:()=>Ia,areStatsEqual:()=>gS,clearStats:()=>WE,convertToBigIntStats:()=>zE,makeDefaultStats:()=>Lp,makeEmptyStats:()=>Tge});var uS=Pe(J(\"util\"));var Tp=33188,cS=class{constructor(){this.name=\"\";this.mode=0}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&61440)===16384}isFIFO(){return!1}isFile(){return(this.mode&61440)===32768}isSocket(){return!1}isSymbolicLink(){return(this.mode&61440)===40960}},Ia=class{constructor(){this.uid=0;this.gid=0;this.size=0;this.blksize=0;this.atimeMs=0;this.mtimeMs=0;this.ctimeMs=0;this.birthtimeMs=0;this.atime=new Date(0);this.mtime=new Date(0);this.ctime=new Date(0);this.birthtime=new Date(0);this.dev=0;this.ino=0;this.mode=Tp;this.nlink=1;this.rdev=0;this.blocks=1}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&61440)===16384}isFIFO(){return!1}isFile(){return(this.mode&61440)===32768}isSocket(){return!1}isSymbolicLink(){return(this.mode&61440)===40960}},Bg=class{constructor(){this.uid=BigInt(0);this.gid=BigInt(0);this.size=BigInt(0);this.blksize=BigInt(0);this.atimeMs=BigInt(0);this.mtimeMs=BigInt(0);this.ctimeMs=BigInt(0);this.birthtimeMs=BigInt(0);this.atimeNs=BigInt(0);this.mtimeNs=BigInt(0);this.ctimeNs=BigInt(0);this.birthtimeNs=BigInt(0);this.atime=new Date(0);this.mtime=new Date(0);this.ctime=new Date(0);this.birthtime=new Date(0);this.dev=BigInt(0);this.ino=BigInt(0);this.mode=BigInt(Tp);this.nlink=BigInt(1);this.rdev=BigInt(0);this.blocks=BigInt(1)}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&BigInt(61440))===BigInt(16384)}isFIFO(){return!1}isFile(){return(this.mode&BigInt(61440))===BigInt(32768)}isSocket(){return!1}isSymbolicLink(){return(this.mode&BigInt(61440))===BigInt(40960)}};function Lp(){return new Ia}function Tge(){return WE(Lp())}function WE(r){for(let e in r)if(Object.prototype.hasOwnProperty.call(r,e)){let t=r[e];typeof t==\"number\"?r[e]=0:typeof t==\"bigint\"?r[e]=BigInt(0):uS.types.isDate(t)&&(r[e]=new Date(0))}return r}function zE(r){let e=new Bg;for(let t in r)if(Object.prototype.hasOwnProperty.call(r,t)){let i=r[t];typeof i==\"number\"?e[t]=BigInt(i):uS.types.isDate(i)&&(e[t]=new Date(i))}return e.atimeNs=e.atimeMs*BigInt(1e6),e.mtimeNs=e.mtimeMs*BigInt(1e6),e.ctimeNs=e.ctimeMs*BigInt(1e6),e.birthtimeNs=e.birthtimeMs*BigInt(1e6),e}function gS(r,e){if(r.atimeMs!==e.atimeMs||r.birthtimeMs!==e.birthtimeMs||r.blksize!==e.blksize||r.blocks!==e.blocks||r.ctimeMs!==e.ctimeMs||r.dev!==e.dev||r.gid!==e.gid||r.ino!==e.ino||r.isBlockDevice()!==e.isBlockDevice()||r.isCharacterDevice()!==e.isCharacterDevice()||r.isDirectory()!==e.isDirectory()||r.isFIFO()!==e.isFIFO()||r.isFile()!==e.isFile()||r.isSocket()!==e.isSocket()||r.isSymbolicLink()!==e.isSymbolicLink()||r.mode!==e.mode||r.mtimeMs!==e.mtimeMs||r.nlink!==e.nlink||r.rdev!==e.rdev||r.size!==e.size||r.uid!==e.uid)return!1;let t=r,i=e;return!(t.atimeNs!==i.atimeNs||t.mtimeNs!==i.mtimeNs||t.ctimeNs!==i.ctimeNs||t.birthtimeNs!==i.birthtimeNs)}var XE=Pe(J(\"fs\"));var Mp=Pe(J(\"path\"));var Oe={root:\"/\",dot:\".\",parent:\"..\"},xt={nodeModules:\"node_modules\",manifest:\"package.json\",lockfile:\"yarn.lock\",virtual:\"__virtual__\",pnpJs:\".pnp.js\",pnpCjs:\".pnp.cjs\",rc:\".yarnrc.yml\"},K=Object.create(Mp.default),x=Object.create(Mp.default.posix);K.cwd=()=>process.cwd();x.cwd=()=>fS(process.cwd());x.resolve=(...r)=>r.length>0&&x.isAbsolute(r[0])?Mp.default.posix.resolve(...r):Mp.default.posix.resolve(x.cwd(),...r);var nK=function(r,e,t){return e=r.normalize(e),t=r.normalize(t),e===t?\".\":(e.endsWith(r.sep)||(e=e+r.sep),t.startsWith(e)?t.slice(e.length):null)};K.fromPortablePath=sK;K.toPortablePath=fS;K.contains=(r,e)=>nK(K,r,e);x.contains=(r,e)=>nK(x,r,e);var Lge=/^([a-zA-Z]:.*)$/,Oge=/^\\/\\/(\\.\\/)?(.*)$/,Mge=/^\\/([a-zA-Z]:.*)$/,Kge=/^\\/unc\\/(\\.dot\\/)?(.*)$/;function sK(r){if(process.platform!==\"win32\")return r;let e,t;if(e=r.match(Mge))r=e[1];else if(t=r.match(Kge))r=`\\\\\\\\${t[1]?\".\\\\\":\"\"}${t[2]}`;else return r;return r.replace(/\\//g,\"\\\\\")}function fS(r){if(process.platform!==\"win32\")return r;r=r.replace(/\\\\/g,\"/\");let e,t;return(e=r.match(Lge))?r=`/${e[1]}`:(t=r.match(Oge))&&(r=`/unc/${t[1]?\".dot/\":\"\"}${t[2]}`),r}function VE(r,e){return r===K?sK(e):fS(e)}function Ur(r){if(K.parse(r).dir!==\"\"||x.parse(r).dir!==\"\")throw new Error(`Invalid filename: \"${r}\"`);return r}var ZE=new Date(456789e3*1e3),CS=(t=>(t.Allow=\"allow\",t.ReadOnly=\"readOnly\",t))(CS||{});async function oK(r,e,t,i,n){let s=r.pathUtils.normalize(e),o=t.pathUtils.normalize(i),a=[],l=[],{atime:c,mtime:u}=n.stableTime?{atime:ZE,mtime:ZE}:await t.lstatPromise(o);await r.mkdirpPromise(r.pathUtils.dirname(e),{utimes:[c,u]});let g=typeof r.lutimesPromise==\"function\"?r.lutimesPromise.bind(r):r.utimesPromise.bind(r);await pS(a,l,g,r,s,t,o,{...n,didParentExist:!0});for(let f of a)await f();await Promise.all(l.map(f=>f()))}async function pS(r,e,t,i,n,s,o,a){var h,p;let l=a.didParentExist?await Uge(i,n):null,c=await s.lstatPromise(o),{atime:u,mtime:g}=a.stableTime?{atime:ZE,mtime:ZE}:c,f;switch(!0){case c.isDirectory():f=await Hge(r,e,t,i,n,l,s,o,c,a);break;case c.isFile():f=await Yge(r,e,t,i,n,l,s,o,c,a);break;case c.isSymbolicLink():f=await jge(r,e,t,i,n,l,s,o,c,a);break;default:throw new Error(`Unsupported file type (${c.mode})`)}return(f||((h=l==null?void 0:l.mtime)==null?void 0:h.getTime())!==g.getTime()||((p=l==null?void 0:l.atime)==null?void 0:p.getTime())!==u.getTime())&&(e.push(()=>t(n,u,g)),f=!0),(l===null||(l.mode&511)!==(c.mode&511))&&(e.push(()=>i.chmodPromise(n,c.mode&511)),f=!0),f}async function Uge(r,e){try{return await r.lstatPromise(e)}catch{return null}}async function Hge(r,e,t,i,n,s,o,a,l,c){if(s!==null&&!s.isDirectory())if(c.overwrite)r.push(async()=>i.removePromise(n)),s=null;else return!1;let u=!1;s===null&&(r.push(async()=>{try{await i.mkdirPromise(n,{mode:l.mode})}catch(h){if(h.code!==\"EEXIST\")throw h}}),u=!0);let g=await o.readdirPromise(a),f=c.didParentExist&&!s?{...c,didParentExist:!1}:c;if(c.stableSort)for(let h of g.sort())await pS(r,e,t,i,i.pathUtils.join(n,h),o,o.pathUtils.join(a,h),f)&&(u=!0);else(await Promise.all(g.map(async p=>{await pS(r,e,t,i,i.pathUtils.join(n,p),o,o.pathUtils.join(a,p),f)}))).some(p=>p)&&(u=!0);return u}var hS=new WeakMap;function dS(r,e,t,i,n){return async()=>{await r.linkPromise(t,e),n===\"readOnly\"&&(i.mode&=-147,await r.chmodPromise(e,i.mode))}}function Gge(r,e,t,i,n){let s=hS.get(r);return typeof s>\"u\"?async()=>{try{await r.copyFilePromise(t,e,XE.default.constants.COPYFILE_FICLONE_FORCE),hS.set(r,!0)}catch(o){if(o.code===\"ENOSYS\"||o.code===\"ENOTSUP\")hS.set(r,!1),await dS(r,e,t,i,n)();else throw o}}:s?async()=>r.copyFilePromise(t,e,XE.default.constants.COPYFILE_FICLONE_FORCE):dS(r,e,t,i,n)}async function Yge(r,e,t,i,n,s,o,a,l,c){var f;if(s!==null)if(c.overwrite)r.push(async()=>i.removePromise(n)),s=null;else return!1;let u=(f=c.linkStrategy)!=null?f:null,g=i===o?u!==null?Gge(i,n,a,l,u):async()=>i.copyFilePromise(a,n,XE.default.constants.COPYFILE_FICLONE):u!==null?dS(i,n,a,l,u):async()=>i.writeFilePromise(n,await o.readFilePromise(a));return r.push(async()=>g()),!0}async function jge(r,e,t,i,n,s,o,a,l,c){if(s!==null)if(c.overwrite)r.push(async()=>i.removePromise(n)),s=null;else return!1;return r.push(async()=>{await i.symlinkPromise(VE(i.pathUtils,await o.readlinkPromise(a)),n)}),!0}function As(r,e){return Object.assign(new Error(`${r}: ${e}`),{code:r})}function $E(r){return As(\"EBUSY\",r)}function Kp(r,e){return As(\"ENOSYS\",`${r}, ${e}`)}function xA(r){return As(\"EINVAL\",`invalid argument, ${r}`)}function Hr(r){return As(\"EBADF\",`bad file descriptor, ${r}`)}function Js(r){return As(\"ENOENT\",`no such file or directory, ${r}`)}function Qo(r){return As(\"ENOTDIR\",`not a directory, ${r}`)}function Up(r){return As(\"EISDIR\",`illegal operation on a directory, ${r}`)}function eI(r){return As(\"EEXIST\",`file already exists, ${r}`)}function un(r){return As(\"EROFS\",`read-only filesystem, ${r}`)}function aK(r){return As(\"ENOTEMPTY\",`directory not empty, ${r}`)}function AK(r){return As(\"EOPNOTSUPP\",`operation not supported, ${r}`)}function lK(){return As(\"ERR_DIR_CLOSED\",\"Directory handle was closed\")}var _E=class extends Error{constructor(t,i){super(t);this.name=\"Libzip Error\",this.code=i}};var Hp=class{constructor(e,t,i={}){this.path=e;this.nextDirent=t;this.opts=i;this.closed=!1}throwIfClosed(){if(this.closed)throw lK()}async*[Symbol.asyncIterator](){try{let e;for(;(e=await this.read())!==null;)yield e}finally{await this.close()}}read(e){let t=this.readSync();return typeof e<\"u\"?e(null,t):Promise.resolve(t)}readSync(){return this.throwIfClosed(),this.nextDirent()}close(e){return this.closeSync(),typeof e<\"u\"?e(null):Promise.resolve()}closeSync(){var e,t;this.throwIfClosed(),(t=(e=this.opts).onClose)==null||t.call(e),this.closed=!0}};function tI(r,e,t,i){let n=()=>{let s=t.shift();return typeof s>\"u\"?null:Object.assign(r.statSync(r.pathUtils.join(e,s)),{name:s})};return new Hp(e,n,i)}var cK=J(\"os\");var ya=class{constructor(e){this.pathUtils=e}async*genTraversePromise(e,{stableSort:t=!1}={}){let i=[e];for(;i.length>0;){let n=i.shift();if((await this.lstatPromise(n)).isDirectory()){let o=await this.readdirPromise(n);if(t)for(let a of o.sort())i.push(this.pathUtils.join(n,a));else throw new Error(\"Not supported\")}else yield n}}async removePromise(e,{recursive:t=!0,maxRetries:i=5}={}){let n;try{n=await this.lstatPromise(e)}catch(s){if(s.code===\"ENOENT\")return;throw s}if(n.isDirectory()){if(t){let s=await this.readdirPromise(e);await Promise.all(s.map(o=>this.removePromise(this.pathUtils.resolve(e,o))))}for(let s=0;s<=i;s++)try{await this.rmdirPromise(e);break}catch(o){if(o.code!==\"EBUSY\"&&o.code!==\"ENOTEMPTY\")throw o;s<i&&await new Promise(a=>setTimeout(a,s*100))}}else await this.unlinkPromise(e)}removeSync(e,{recursive:t=!0}={}){let i;try{i=this.lstatSync(e)}catch(n){if(n.code===\"ENOENT\")return;throw n}if(i.isDirectory()){if(t)for(let n of this.readdirSync(e))this.removeSync(this.pathUtils.resolve(e,n));this.rmdirSync(e)}else this.unlinkSync(e)}async mkdirpPromise(e,{chmod:t,utimes:i}={}){if(e=this.resolve(e),e===this.pathUtils.dirname(e))return;let n=e.split(this.pathUtils.sep),s;for(let o=2;o<=n.length;++o){let a=n.slice(0,o).join(this.pathUtils.sep);if(!this.existsSync(a)){try{await this.mkdirPromise(a)}catch(l){if(l.code===\"EEXIST\")continue;throw l}if(s!=null||(s=a),t!=null&&await this.chmodPromise(a,t),i!=null)await this.utimesPromise(a,i[0],i[1]);else{let l=await this.statPromise(this.pathUtils.dirname(a));await this.utimesPromise(a,l.atime,l.mtime)}}}return s}mkdirpSync(e,{chmod:t,utimes:i}={}){if(e=this.resolve(e),e===this.pathUtils.dirname(e))return;let n=e.split(this.pathUtils.sep),s;for(let o=2;o<=n.length;++o){let a=n.slice(0,o).join(this.pathUtils.sep);if(!this.existsSync(a)){try{this.mkdirSync(a)}catch(l){if(l.code===\"EEXIST\")continue;throw l}if(s!=null||(s=a),t!=null&&this.chmodSync(a,t),i!=null)this.utimesSync(a,i[0],i[1]);else{let l=this.statSync(this.pathUtils.dirname(a));this.utimesSync(a,l.atime,l.mtime)}}}return s}async copyPromise(e,t,{baseFs:i=this,overwrite:n=!0,stableSort:s=!1,stableTime:o=!1,linkStrategy:a=null}={}){return await oK(this,e,i,t,{overwrite:n,stableSort:s,stableTime:o,linkStrategy:a})}copySync(e,t,{baseFs:i=this,overwrite:n=!0}={}){let s=i.lstatSync(t),o=this.existsSync(e);if(s.isDirectory()){this.mkdirpSync(e);let l=i.readdirSync(t);for(let c of l)this.copySync(this.pathUtils.join(e,c),i.pathUtils.join(t,c),{baseFs:i,overwrite:n})}else if(s.isFile()){if(!o||n){o&&this.removeSync(e);let l=i.readFileSync(t);this.writeFileSync(e,l)}}else if(s.isSymbolicLink()){if(!o||n){o&&this.removeSync(e);let l=i.readlinkSync(t);this.symlinkSync(VE(this.pathUtils,l),e)}}else throw new Error(`Unsupported file type (file: ${t}, mode: 0o${s.mode.toString(8).padStart(6,\"0\")})`);let a=s.mode&511;this.chmodSync(e,a)}async changeFilePromise(e,t,i={}){return Buffer.isBuffer(t)?this.changeFileBufferPromise(e,t,i):this.changeFileTextPromise(e,t,i)}async changeFileBufferPromise(e,t,{mode:i}={}){let n=Buffer.alloc(0);try{n=await this.readFilePromise(e)}catch{}Buffer.compare(n,t)!==0&&await this.writeFilePromise(e,t,{mode:i})}async changeFileTextPromise(e,t,{automaticNewlines:i,mode:n}={}){let s=\"\";try{s=await this.readFilePromise(e,\"utf8\")}catch{}let o=i?Vl(s,t):t;s!==o&&await this.writeFilePromise(e,o,{mode:n})}changeFileSync(e,t,i={}){return Buffer.isBuffer(t)?this.changeFileBufferSync(e,t,i):this.changeFileTextSync(e,t,i)}changeFileBufferSync(e,t,{mode:i}={}){let n=Buffer.alloc(0);try{n=this.readFileSync(e)}catch{}Buffer.compare(n,t)!==0&&this.writeFileSync(e,t,{mode:i})}changeFileTextSync(e,t,{automaticNewlines:i=!1,mode:n}={}){let s=\"\";try{s=this.readFileSync(e,\"utf8\")}catch{}let o=i?Vl(s,t):t;s!==o&&this.writeFileSync(e,o,{mode:n})}async movePromise(e,t){try{await this.renamePromise(e,t)}catch(i){if(i.code===\"EXDEV\")await this.copyPromise(t,e),await this.removePromise(e);else throw i}}moveSync(e,t){try{this.renameSync(e,t)}catch(i){if(i.code===\"EXDEV\")this.copySync(t,e),this.removeSync(e);else throw i}}async lockPromise(e,t){let i=`${e}.flock`,n=1e3/60,s=Date.now(),o=null,a=async()=>{let l;try{[l]=await this.readJsonPromise(i)}catch{return Date.now()-s<500}try{return process.kill(l,0),!0}catch{return!1}};for(;o===null;)try{o=await this.openPromise(i,\"wx\")}catch(l){if(l.code===\"EEXIST\"){if(!await a())try{await this.unlinkPromise(i);continue}catch{}if(Date.now()-s<60*1e3)await new Promise(c=>setTimeout(c,n));else throw new Error(`Couldn't acquire a lock in a reasonable time (via ${i})`)}else throw l}await this.writePromise(o,JSON.stringify([process.pid]));try{return await t()}finally{try{await this.closePromise(o),await this.unlinkPromise(i)}catch{}}}async readJsonPromise(e){let t=await this.readFilePromise(e,\"utf8\");try{return JSON.parse(t)}catch(i){throw i.message+=` (in ${e})`,i}}readJsonSync(e){let t=this.readFileSync(e,\"utf8\");try{return JSON.parse(t)}catch(i){throw i.message+=` (in ${e})`,i}}async writeJsonPromise(e,t){return await this.writeFilePromise(e,`${JSON.stringify(t,null,2)}\n`)}writeJsonSync(e,t){return this.writeFileSync(e,`${JSON.stringify(t,null,2)}\n`)}async preserveTimePromise(e,t){let i=await this.lstatPromise(e),n=await t();typeof n<\"u\"&&(e=n),this.lutimesPromise?await this.lutimesPromise(e,i.atime,i.mtime):i.isSymbolicLink()||await this.utimesPromise(e,i.atime,i.mtime)}async preserveTimeSync(e,t){let i=this.lstatSync(e),n=t();typeof n<\"u\"&&(e=n),this.lutimesSync?this.lutimesSync(e,i.atime,i.mtime):i.isSymbolicLink()||this.utimesSync(e,i.atime,i.mtime)}},PA=class extends ya{constructor(){super(x)}};function qge(r){let e=r.match(/\\r?\\n/g);if(e===null)return cK.EOL;let t=e.filter(n=>n===`\\r\n`).length,i=e.length-t;return t>i?`\\r\n`:`\n`}function Vl(r,e){return e.replace(/\\r?\\n/g,qge(r))}var bg=J(\"fs\"),IS=J(\"stream\"),hK=J(\"util\"),yS=Pe(J(\"zlib\"));var uK=Pe(J(\"fs\"));var $t=class extends PA{constructor(t=uK.default){super();this.realFs=t,typeof this.realFs.lutimes<\"u\"&&(this.lutimesPromise=this.lutimesPromiseImpl,this.lutimesSync=this.lutimesSyncImpl)}getExtractHint(){return!1}getRealPath(){return Oe.root}resolve(t){return x.resolve(t)}async openPromise(t,i,n){return await new Promise((s,o)=>{this.realFs.open(K.fromPortablePath(t),i,n,this.makeCallback(s,o))})}openSync(t,i,n){return this.realFs.openSync(K.fromPortablePath(t),i,n)}async opendirPromise(t,i){return await new Promise((n,s)=>{typeof i<\"u\"?this.realFs.opendir(K.fromPortablePath(t),i,this.makeCallback(n,s)):this.realFs.opendir(K.fromPortablePath(t),this.makeCallback(n,s))}).then(n=>Object.defineProperty(n,\"path\",{value:t,configurable:!0,writable:!0}))}opendirSync(t,i){let n=typeof i<\"u\"?this.realFs.opendirSync(K.fromPortablePath(t),i):this.realFs.opendirSync(K.fromPortablePath(t));return Object.defineProperty(n,\"path\",{value:t,configurable:!0,writable:!0})}async readPromise(t,i,n=0,s=0,o=-1){return await new Promise((a,l)=>{this.realFs.read(t,i,n,s,o,(c,u)=>{c?l(c):a(u)})})}readSync(t,i,n,s,o){return this.realFs.readSync(t,i,n,s,o)}async writePromise(t,i,n,s,o){return await new Promise((a,l)=>typeof i==\"string\"?this.realFs.write(t,i,n,this.makeCallback(a,l)):this.realFs.write(t,i,n,s,o,this.makeCallback(a,l)))}writeSync(t,i,n,s,o){return typeof i==\"string\"?this.realFs.writeSync(t,i,n):this.realFs.writeSync(t,i,n,s,o)}async closePromise(t){await new Promise((i,n)=>{this.realFs.close(t,this.makeCallback(i,n))})}closeSync(t){this.realFs.closeSync(t)}createReadStream(t,i){let n=t!==null?K.fromPortablePath(t):t;return this.realFs.createReadStream(n,i)}createWriteStream(t,i){let n=t!==null?K.fromPortablePath(t):t;return this.realFs.createWriteStream(n,i)}async realpathPromise(t){return await new Promise((i,n)=>{this.realFs.realpath(K.fromPortablePath(t),{},this.makeCallback(i,n))}).then(i=>K.toPortablePath(i))}realpathSync(t){return K.toPortablePath(this.realFs.realpathSync(K.fromPortablePath(t),{}))}async existsPromise(t){return await new Promise(i=>{this.realFs.exists(K.fromPortablePath(t),i)})}accessSync(t,i){return this.realFs.accessSync(K.fromPortablePath(t),i)}async accessPromise(t,i){return await new Promise((n,s)=>{this.realFs.access(K.fromPortablePath(t),i,this.makeCallback(n,s))})}existsSync(t){return this.realFs.existsSync(K.fromPortablePath(t))}async statPromise(t,i){return await new Promise((n,s)=>{i?this.realFs.stat(K.fromPortablePath(t),i,this.makeCallback(n,s)):this.realFs.stat(K.fromPortablePath(t),this.makeCallback(n,s))})}statSync(t,i){return i?this.realFs.statSync(K.fromPortablePath(t),i):this.realFs.statSync(K.fromPortablePath(t))}async fstatPromise(t,i){return await new Promise((n,s)=>{i?this.realFs.fstat(t,i,this.makeCallback(n,s)):this.realFs.fstat(t,this.makeCallback(n,s))})}fstatSync(t,i){return i?this.realFs.fstatSync(t,i):this.realFs.fstatSync(t)}async lstatPromise(t,i){return await new Promise((n,s)=>{i?this.realFs.lstat(K.fromPortablePath(t),i,this.makeCallback(n,s)):this.realFs.lstat(K.fromPortablePath(t),this.makeCallback(n,s))})}lstatSync(t,i){return i?this.realFs.lstatSync(K.fromPortablePath(t),i):this.realFs.lstatSync(K.fromPortablePath(t))}async fchmodPromise(t,i){return await new Promise((n,s)=>{this.realFs.fchmod(t,i,this.makeCallback(n,s))})}fchmodSync(t,i){return this.realFs.fchmodSync(t,i)}async chmodPromise(t,i){return await new Promise((n,s)=>{this.realFs.chmod(K.fromPortablePath(t),i,this.makeCallback(n,s))})}chmodSync(t,i){return this.realFs.chmodSync(K.fromPortablePath(t),i)}async fchownPromise(t,i,n){return await new Promise((s,o)=>{this.realFs.fchown(t,i,n,this.makeCallback(s,o))})}fchownSync(t,i,n){return this.realFs.fchownSync(t,i,n)}async chownPromise(t,i,n){return await new Promise((s,o)=>{this.realFs.chown(K.fromPortablePath(t),i,n,this.makeCallback(s,o))})}chownSync(t,i,n){return this.realFs.chownSync(K.fromPortablePath(t),i,n)}async renamePromise(t,i){return await new Promise((n,s)=>{this.realFs.rename(K.fromPortablePath(t),K.fromPortablePath(i),this.makeCallback(n,s))})}renameSync(t,i){return this.realFs.renameSync(K.fromPortablePath(t),K.fromPortablePath(i))}async copyFilePromise(t,i,n=0){return await new Promise((s,o)=>{this.realFs.copyFile(K.fromPortablePath(t),K.fromPortablePath(i),n,this.makeCallback(s,o))})}copyFileSync(t,i,n=0){return this.realFs.copyFileSync(K.fromPortablePath(t),K.fromPortablePath(i),n)}async appendFilePromise(t,i,n){return await new Promise((s,o)=>{let a=typeof t==\"string\"?K.fromPortablePath(t):t;n?this.realFs.appendFile(a,i,n,this.makeCallback(s,o)):this.realFs.appendFile(a,i,this.makeCallback(s,o))})}appendFileSync(t,i,n){let s=typeof t==\"string\"?K.fromPortablePath(t):t;n?this.realFs.appendFileSync(s,i,n):this.realFs.appendFileSync(s,i)}async writeFilePromise(t,i,n){return await new Promise((s,o)=>{let a=typeof t==\"string\"?K.fromPortablePath(t):t;n?this.realFs.writeFile(a,i,n,this.makeCallback(s,o)):this.realFs.writeFile(a,i,this.makeCallback(s,o))})}writeFileSync(t,i,n){let s=typeof t==\"string\"?K.fromPortablePath(t):t;n?this.realFs.writeFileSync(s,i,n):this.realFs.writeFileSync(s,i)}async unlinkPromise(t){return await new Promise((i,n)=>{this.realFs.unlink(K.fromPortablePath(t),this.makeCallback(i,n))})}unlinkSync(t){return this.realFs.unlinkSync(K.fromPortablePath(t))}async utimesPromise(t,i,n){return await new Promise((s,o)=>{this.realFs.utimes(K.fromPortablePath(t),i,n,this.makeCallback(s,o))})}utimesSync(t,i,n){this.realFs.utimesSync(K.fromPortablePath(t),i,n)}async lutimesPromiseImpl(t,i,n){let s=this.realFs.lutimes;if(typeof s>\"u\")throw Kp(\"unavailable Node binding\",`lutimes '${t}'`);return await new Promise((o,a)=>{s.call(this.realFs,K.fromPortablePath(t),i,n,this.makeCallback(o,a))})}lutimesSyncImpl(t,i,n){let s=this.realFs.lutimesSync;if(typeof s>\"u\")throw Kp(\"unavailable Node binding\",`lutimes '${t}'`);s.call(this.realFs,K.fromPortablePath(t),i,n)}async mkdirPromise(t,i){return await new Promise((n,s)=>{this.realFs.mkdir(K.fromPortablePath(t),i,this.makeCallback(n,s))})}mkdirSync(t,i){return this.realFs.mkdirSync(K.fromPortablePath(t),i)}async rmdirPromise(t,i){return await new Promise((n,s)=>{i?this.realFs.rmdir(K.fromPortablePath(t),i,this.makeCallback(n,s)):this.realFs.rmdir(K.fromPortablePath(t),this.makeCallback(n,s))})}rmdirSync(t,i){return this.realFs.rmdirSync(K.fromPortablePath(t),i)}async linkPromise(t,i){return await new Promise((n,s)=>{this.realFs.link(K.fromPortablePath(t),K.fromPortablePath(i),this.makeCallback(n,s))})}linkSync(t,i){return this.realFs.linkSync(K.fromPortablePath(t),K.fromPortablePath(i))}async symlinkPromise(t,i,n){return await new Promise((s,o)=>{this.realFs.symlink(K.fromPortablePath(t.replace(/\\/+$/,\"\")),K.fromPortablePath(i),n,this.makeCallback(s,o))})}symlinkSync(t,i,n){return this.realFs.symlinkSync(K.fromPortablePath(t.replace(/\\/+$/,\"\")),K.fromPortablePath(i),n)}async readFilePromise(t,i){return await new Promise((n,s)=>{let o=typeof t==\"string\"?K.fromPortablePath(t):t;this.realFs.readFile(o,i,this.makeCallback(n,s))})}readFileSync(t,i){let n=typeof t==\"string\"?K.fromPortablePath(t):t;return this.realFs.readFileSync(n,i)}async readdirPromise(t,i){return await new Promise((n,s)=>{i!=null&&i.withFileTypes?this.realFs.readdir(K.fromPortablePath(t),{withFileTypes:!0},this.makeCallback(n,s)):this.realFs.readdir(K.fromPortablePath(t),this.makeCallback(o=>n(o),s))})}readdirSync(t,i){return i!=null&&i.withFileTypes?this.realFs.readdirSync(K.fromPortablePath(t),{withFileTypes:!0}):this.realFs.readdirSync(K.fromPortablePath(t))}async readlinkPromise(t){return await new Promise((i,n)=>{this.realFs.readlink(K.fromPortablePath(t),this.makeCallback(i,n))}).then(i=>K.toPortablePath(i))}readlinkSync(t){return K.toPortablePath(this.realFs.readlinkSync(K.fromPortablePath(t)))}async truncatePromise(t,i){return await new Promise((n,s)=>{this.realFs.truncate(K.fromPortablePath(t),i,this.makeCallback(n,s))})}truncateSync(t,i){return this.realFs.truncateSync(K.fromPortablePath(t),i)}async ftruncatePromise(t,i){return await new Promise((n,s)=>{this.realFs.ftruncate(t,i,this.makeCallback(n,s))})}ftruncateSync(t,i){return this.realFs.ftruncateSync(t,i)}watch(t,i,n){return this.realFs.watch(K.fromPortablePath(t),i,n)}watchFile(t,i,n){return this.realFs.watchFile(K.fromPortablePath(t),i,n)}unwatchFile(t,i){return this.realFs.unwatchFile(K.fromPortablePath(t),i)}makeCallback(t,i){return(n,s)=>{n?i(n):t(s)}}};var fK=J(\"events\");function gK(r,e){if(r!==e)throw new Error(`Invalid StatWatcher status: expected '${e}', got '${r}'`)}var Qg=class extends fK.EventEmitter{constructor(t,i,{bigint:n=!1}={}){super();this.status=\"ready\";this.changeListeners=new Map;this.startTimeout=null;this.fakeFs=t,this.path=i,this.bigint=n,this.lastStats=this.stat()}static create(t,i,n){let s=new Qg(t,i,n);return s.start(),s}start(){gK(this.status,\"ready\"),this.status=\"running\",this.startTimeout=setTimeout(()=>{this.startTimeout=null,this.fakeFs.existsSync(this.path)||this.emit(\"change\",this.lastStats,this.lastStats)},3)}stop(){gK(this.status,\"running\"),this.status=\"stopped\",this.startTimeout!==null&&(clearTimeout(this.startTimeout),this.startTimeout=null),this.emit(\"stop\")}stat(){try{return this.fakeFs.statSync(this.path,{bigint:this.bigint})}catch{let i=this.bigint?new Bg:new Ia;return WE(i)}}makeInterval(t){let i=setInterval(()=>{let n=this.stat(),s=this.lastStats;gS(n,s)||(this.lastStats=n,this.emit(\"change\",n,s))},t.interval);return t.persistent?i:i.unref()}registerChangeListener(t,i){this.addListener(\"change\",t),this.changeListeners.set(t,this.makeInterval(i))}unregisterChangeListener(t){this.removeListener(\"change\",t);let i=this.changeListeners.get(t);typeof i<\"u\"&&clearInterval(i),this.changeListeners.delete(t)}unregisterAllChangeListeners(){for(let t of this.changeListeners.keys())this.unregisterChangeListener(t)}hasChangeListeners(){return this.changeListeners.size>0}ref(){for(let t of this.changeListeners.values())t.ref();return this}unref(){for(let t of this.changeListeners.values())t.unref();return this}};var rI=new WeakMap;function iI(r,e,t,i){let n,s,o,a;switch(typeof t){case\"function\":n=!1,s=!0,o=5007,a=t;break;default:({bigint:n=!1,persistent:s=!0,interval:o=5007}=t),a=i;break}let l=rI.get(r);typeof l>\"u\"&&rI.set(r,l=new Map);let c=l.get(e);return typeof c>\"u\"&&(c=Qg.create(r,e,{bigint:n}),l.set(e,c)),c.registerChangeListener(a,{persistent:s,interval:o}),c}function Gp(r,e,t){let i=rI.get(r);if(typeof i>\"u\")return;let n=i.get(e);typeof n>\"u\"||(typeof t>\"u\"?n.unregisterAllChangeListeners():n.unregisterChangeListener(t),n.hasChangeListeners()||(n.stop(),i.delete(e)))}function Yp(r){let e=rI.get(r);if(!(typeof e>\"u\"))for(let t of e.keys())Gp(r,t)}var Xl=\"mixed\";function Jge(r){if(typeof r==\"string\"&&String(+r)===r)return+r;if(typeof r==\"number\"&&Number.isFinite(r))return r<0?Date.now()/1e3:r;if(hK.types.isDate(r))return r.getTime()/1e3;throw new Error(\"Invalid time\")}function ES(){return Buffer.from([80,75,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])}var Wr=class extends PA{constructor(t,i){super();this.lzSource=null;this.listings=new Map;this.entries=new Map;this.fileSources=new Map;this.fds=new Map;this.nextFd=0;this.ready=!1;this.readOnly=!1;this.libzip=i.libzip;let n=i;if(this.level=typeof n.level<\"u\"?n.level:Xl,t!=null||(t=ES()),typeof t==\"string\"){let{baseFs:a=new $t}=n;this.baseFs=a,this.path=t}else this.path=null,this.baseFs=null;if(i.stats)this.stats=i.stats;else if(typeof t==\"string\")try{this.stats=this.baseFs.statSync(t)}catch(a){if(a.code===\"ENOENT\"&&n.create)this.stats=Lp();else throw a}else this.stats=Lp();let s=this.libzip.malloc(4);try{let a=0;if(typeof t==\"string\"&&n.create&&(a|=this.libzip.ZIP_CREATE|this.libzip.ZIP_TRUNCATE),i.readOnly&&(a|=this.libzip.ZIP_RDONLY,this.readOnly=!0),typeof t==\"string\")this.zip=this.libzip.open(K.fromPortablePath(t),a,s);else{let l=this.allocateUnattachedSource(t);try{this.zip=this.libzip.openFromSource(l,a,s),this.lzSource=l}catch(c){throw this.libzip.source.free(l),c}}if(this.zip===0){let l=this.libzip.struct.errorS();throw this.libzip.error.initWithCode(l,this.libzip.getValue(s,\"i32\")),this.makeLibzipError(l)}}finally{this.libzip.free(s)}this.listings.set(Oe.root,new Set);let o=this.libzip.getNumEntries(this.zip,0);for(let a=0;a<o;++a){let l=this.libzip.getName(this.zip,a,0);if(x.isAbsolute(l))continue;let c=x.resolve(Oe.root,l);this.registerEntry(c,a),l.endsWith(\"/\")&&this.registerListing(c)}if(this.symlinkCount=this.libzip.ext.countSymlinks(this.zip),this.symlinkCount===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));this.ready=!0}makeLibzipError(t){let i=this.libzip.struct.errorCodeZip(t),n=this.libzip.error.strerror(t),s=new _E(n,this.libzip.errors[i]);if(i===this.libzip.errors.ZIP_ER_CHANGED)throw new Error(`Assertion failed: Unexpected libzip error: ${s.message}`);return s}getExtractHint(t){for(let i of this.entries.keys()){let n=this.pathUtils.extname(i);if(t.relevantExtensions.has(n))return!0}return!1}getAllFiles(){return Array.from(this.entries.keys())}getRealPath(){if(!this.path)throw new Error(\"ZipFS don't have real paths when loaded from a buffer\");return this.path}getBufferAndClose(){if(this.prepareClose(),!this.lzSource)throw new Error(\"ZipFS was not created from a Buffer\");if(this.entries.size===0)return this.discardAndClose(),ES();try{if(this.libzip.source.keep(this.lzSource),this.libzip.close(this.zip)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));if(this.libzip.source.open(this.lzSource)===-1)throw this.makeLibzipError(this.libzip.source.error(this.lzSource));if(this.libzip.source.seek(this.lzSource,0,0,this.libzip.SEEK_END)===-1)throw this.makeLibzipError(this.libzip.source.error(this.lzSource));let t=this.libzip.source.tell(this.lzSource);if(t===-1)throw this.makeLibzipError(this.libzip.source.error(this.lzSource));if(this.libzip.source.seek(this.lzSource,0,0,this.libzip.SEEK_SET)===-1)throw this.makeLibzipError(this.libzip.source.error(this.lzSource));let i=this.libzip.malloc(t);if(!i)throw new Error(\"Couldn't allocate enough memory\");try{let n=this.libzip.source.read(this.lzSource,i,t);if(n===-1)throw this.makeLibzipError(this.libzip.source.error(this.lzSource));if(n<t)throw new Error(\"Incomplete read\");if(n>t)throw new Error(\"Overread\");let s=this.libzip.HEAPU8.subarray(i,i+t);return Buffer.from(s)}finally{this.libzip.free(i)}}finally{this.libzip.source.close(this.lzSource),this.libzip.source.free(this.lzSource),this.ready=!1}}prepareClose(){if(!this.ready)throw $E(\"archive closed, close\");Yp(this)}saveAndClose(){if(!this.path||!this.baseFs)throw new Error(\"ZipFS cannot be saved and must be discarded when loaded from a buffer\");if(this.prepareClose(),this.readOnly){this.discardAndClose();return}let t=this.baseFs.existsSync(this.path)||this.stats.mode===Tp?void 0:this.stats.mode;if(this.entries.size===0)this.discardAndClose(),this.baseFs.writeFileSync(this.path,ES(),{mode:t});else{if(this.libzip.close(this.zip)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));typeof t<\"u\"&&this.baseFs.chmodSync(this.path,t)}this.ready=!1}discardAndClose(){this.prepareClose(),this.libzip.discard(this.zip),this.ready=!1}resolve(t){return x.resolve(Oe.root,t)}async openPromise(t,i,n){return this.openSync(t,i,n)}openSync(t,i,n){let s=this.nextFd++;return this.fds.set(s,{cursor:0,p:t}),s}hasOpenFileHandles(){return!!this.fds.size}async opendirPromise(t,i){return this.opendirSync(t,i)}opendirSync(t,i={}){let n=this.resolveFilename(`opendir '${t}'`,t);if(!this.entries.has(n)&&!this.listings.has(n))throw Js(`opendir '${t}'`);let s=this.listings.get(n);if(!s)throw Qo(`opendir '${t}'`);let o=[...s],a=this.openSync(n,\"r\");return tI(this,n,o,{onClose:()=>{this.closeSync(a)}})}async readPromise(t,i,n,s,o){return this.readSync(t,i,n,s,o)}readSync(t,i,n=0,s=i.byteLength,o=-1){let a=this.fds.get(t);if(typeof a>\"u\")throw Hr(\"read\");let l=o===-1||o===null?a.cursor:o,c=this.readFileSync(a.p);c.copy(i,n,l,l+s);let u=Math.max(0,Math.min(c.length-l,s));return(o===-1||o===null)&&(a.cursor+=u),u}async writePromise(t,i,n,s,o){return typeof i==\"string\"?this.writeSync(t,i,o):this.writeSync(t,i,n,s,o)}writeSync(t,i,n,s,o){throw typeof this.fds.get(t)>\"u\"?Hr(\"read\"):new Error(\"Unimplemented\")}async closePromise(t){return this.closeSync(t)}closeSync(t){if(typeof this.fds.get(t)>\"u\")throw Hr(\"read\");this.fds.delete(t)}createReadStream(t,{encoding:i}={}){if(t===null)throw new Error(\"Unimplemented\");let n=this.openSync(t,\"r\"),s=Object.assign(new IS.PassThrough({emitClose:!0,autoDestroy:!0,destroy:(a,l)=>{clearImmediate(o),this.closeSync(n),l(a)}}),{close(){s.destroy()},bytesRead:0,path:t}),o=setImmediate(async()=>{try{let a=await this.readFilePromise(t,i);s.bytesRead=a.length,s.end(a)}catch(a){s.destroy(a)}});return s}createWriteStream(t,{encoding:i}={}){if(this.readOnly)throw un(`open '${t}'`);if(t===null)throw new Error(\"Unimplemented\");let n=[],s=this.openSync(t,\"w\"),o=Object.assign(new IS.PassThrough({autoDestroy:!0,emitClose:!0,destroy:(a,l)=>{try{a?l(a):(this.writeFileSync(t,Buffer.concat(n),i),l(null))}catch(c){l(c)}finally{this.closeSync(s)}}}),{bytesWritten:0,path:t,close(){o.destroy()}});return o.on(\"data\",a=>{let l=Buffer.from(a);o.bytesWritten+=l.length,n.push(l)}),o}async realpathPromise(t){return this.realpathSync(t)}realpathSync(t){let i=this.resolveFilename(`lstat '${t}'`,t);if(!this.entries.has(i)&&!this.listings.has(i))throw Js(`lstat '${t}'`);return i}async existsPromise(t){return this.existsSync(t)}existsSync(t){if(!this.ready)throw $E(`archive closed, existsSync '${t}'`);if(this.symlinkCount===0){let n=x.resolve(Oe.root,t);return this.entries.has(n)||this.listings.has(n)}let i;try{i=this.resolveFilename(`stat '${t}'`,t,void 0,!1)}catch{return!1}return i===void 0?!1:this.entries.has(i)||this.listings.has(i)}async accessPromise(t,i){return this.accessSync(t,i)}accessSync(t,i=bg.constants.F_OK){let n=this.resolveFilename(`access '${t}'`,t);if(!this.entries.has(n)&&!this.listings.has(n))throw Js(`access '${t}'`);if(this.readOnly&&i&bg.constants.W_OK)throw un(`access '${t}'`)}async statPromise(t,i={bigint:!1}){return i.bigint?this.statSync(t,{bigint:!0}):this.statSync(t)}statSync(t,i={bigint:!1,throwIfNoEntry:!0}){let n=this.resolveFilename(`stat '${t}'`,t,void 0,i.throwIfNoEntry);if(n!==void 0){if(!this.entries.has(n)&&!this.listings.has(n)){if(i.throwIfNoEntry===!1)return;throw Js(`stat '${t}'`)}if(t[t.length-1]===\"/\"&&!this.listings.has(n))throw Qo(`stat '${t}'`);return this.statImpl(`stat '${t}'`,n,i)}}async fstatPromise(t,i){return this.fstatSync(t,i)}fstatSync(t,i){let n=this.fds.get(t);if(typeof n>\"u\")throw Hr(\"fstatSync\");let{p:s}=n,o=this.resolveFilename(`stat '${s}'`,s);if(!this.entries.has(o)&&!this.listings.has(o))throw Js(`stat '${s}'`);if(s[s.length-1]===\"/\"&&!this.listings.has(o))throw Qo(`stat '${s}'`);return this.statImpl(`fstat '${s}'`,o,i)}async lstatPromise(t,i={bigint:!1}){return i.bigint?this.lstatSync(t,{bigint:!0}):this.lstatSync(t)}lstatSync(t,i={bigint:!1,throwIfNoEntry:!0}){let n=this.resolveFilename(`lstat '${t}'`,t,!1,i.throwIfNoEntry);if(n!==void 0){if(!this.entries.has(n)&&!this.listings.has(n)){if(i.throwIfNoEntry===!1)return;throw Js(`lstat '${t}'`)}if(t[t.length-1]===\"/\"&&!this.listings.has(n))throw Qo(`lstat '${t}'`);return this.statImpl(`lstat '${t}'`,n,i)}}statImpl(t,i,n={}){let s=this.entries.get(i);if(typeof s<\"u\"){let o=this.libzip.struct.statS();if(this.libzip.statIndex(this.zip,s,0,0,o)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));let l=this.stats.uid,c=this.stats.gid,u=this.libzip.struct.statSize(o)>>>0,g=512,f=Math.ceil(u/g),h=(this.libzip.struct.statMtime(o)>>>0)*1e3,p=h,C=h,y=h,B=new Date(p),v=new Date(C),D=new Date(y),T=new Date(h),H=this.listings.has(i)?16384:this.isSymbolicLink(s)?40960:32768,j=H===16384?493:420,$=H|this.getUnixMode(s,j)&511,V=this.libzip.struct.statCrc(o),W=Object.assign(new Ia,{uid:l,gid:c,size:u,blksize:g,blocks:f,atime:B,birthtime:v,ctime:D,mtime:T,atimeMs:p,birthtimeMs:C,ctimeMs:y,mtimeMs:h,mode:$,crc:V});return n.bigint===!0?zE(W):W}if(this.listings.has(i)){let o=this.stats.uid,a=this.stats.gid,l=0,c=512,u=0,g=this.stats.mtimeMs,f=this.stats.mtimeMs,h=this.stats.mtimeMs,p=this.stats.mtimeMs,C=new Date(g),y=new Date(f),B=new Date(h),v=new Date(p),D=16877,T=0,H=Object.assign(new Ia,{uid:o,gid:a,size:l,blksize:c,blocks:u,atime:C,birthtime:y,ctime:B,mtime:v,atimeMs:g,birthtimeMs:f,ctimeMs:h,mtimeMs:p,mode:D,crc:T});return n.bigint===!0?zE(H):H}throw new Error(\"Unreachable\")}getUnixMode(t,i){if(this.libzip.file.getExternalAttributes(this.zip,t,0,0,this.libzip.uint08S,this.libzip.uint32S)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.libzip.getValue(this.libzip.uint08S,\"i8\")>>>0!==this.libzip.ZIP_OPSYS_UNIX?i:this.libzip.getValue(this.libzip.uint32S,\"i32\")>>>16}registerListing(t){let i=this.listings.get(t);if(i)return i;this.registerListing(x.dirname(t)).add(x.basename(t));let s=new Set;return this.listings.set(t,s),s}registerEntry(t,i){this.registerListing(x.dirname(t)).add(x.basename(t)),this.entries.set(t,i)}unregisterListing(t){this.listings.delete(t);let i=this.listings.get(x.dirname(t));i==null||i.delete(x.basename(t))}unregisterEntry(t){this.unregisterListing(t);let i=this.entries.get(t);this.entries.delete(t),!(typeof i>\"u\")&&(this.fileSources.delete(i),this.isSymbolicLink(i)&&this.symlinkCount--)}deleteEntry(t,i){if(this.unregisterEntry(t),this.libzip.delete(this.zip,i)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}resolveFilename(t,i,n=!0,s=!0){if(!this.ready)throw $E(`archive closed, ${t}`);let o=x.resolve(Oe.root,i);if(o===\"/\")return Oe.root;let a=this.entries.get(o);if(n&&a!==void 0)if(this.symlinkCount!==0&&this.isSymbolicLink(a)){let l=this.getFileSource(a).toString();return this.resolveFilename(t,x.resolve(x.dirname(o),l),!0,s)}else return o;for(;;){let l=this.resolveFilename(t,x.dirname(o),!0,s);if(l===void 0)return l;let c=this.listings.has(l),u=this.entries.has(l);if(!c&&!u){if(s===!1)return;throw Js(t)}if(!c)throw Qo(t);if(o=x.resolve(l,x.basename(o)),!n||this.symlinkCount===0)break;let g=this.libzip.name.locate(this.zip,o.slice(1),0);if(g===-1)break;if(this.isSymbolicLink(g)){let f=this.getFileSource(g).toString();o=x.resolve(x.dirname(o),f)}else break}return o}allocateBuffer(t){Buffer.isBuffer(t)||(t=Buffer.from(t));let i=this.libzip.malloc(t.byteLength);if(!i)throw new Error(\"Couldn't allocate enough memory\");return new Uint8Array(this.libzip.HEAPU8.buffer,i,t.byteLength).set(t),{buffer:i,byteLength:t.byteLength}}allocateUnattachedSource(t){let i=this.libzip.struct.errorS(),{buffer:n,byteLength:s}=this.allocateBuffer(t),o=this.libzip.source.fromUnattachedBuffer(n,s,0,1,i);if(o===0)throw this.libzip.free(i),this.makeLibzipError(i);return o}allocateSource(t){let{buffer:i,byteLength:n}=this.allocateBuffer(t),s=this.libzip.source.fromBuffer(this.zip,i,n,0,1);if(s===0)throw this.libzip.free(i),this.makeLibzipError(this.libzip.getError(this.zip));return s}setFileSource(t,i){let n=Buffer.isBuffer(i)?i:Buffer.from(i),s=x.relative(Oe.root,t),o=this.allocateSource(i);try{let a=this.libzip.file.add(this.zip,s,o,this.libzip.ZIP_FL_OVERWRITE);if(a===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));if(this.level!==\"mixed\"){let l=this.level===0?this.libzip.ZIP_CM_STORE:this.libzip.ZIP_CM_DEFLATE;if(this.libzip.file.setCompression(this.zip,a,0,l,this.level)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}return this.fileSources.set(a,n),a}catch(a){throw this.libzip.source.free(o),a}}isSymbolicLink(t){if(this.symlinkCount===0)return!1;if(this.libzip.file.getExternalAttributes(this.zip,t,0,0,this.libzip.uint08S,this.libzip.uint32S)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.libzip.getValue(this.libzip.uint08S,\"i8\")>>>0!==this.libzip.ZIP_OPSYS_UNIX?!1:(this.libzip.getValue(this.libzip.uint32S,\"i32\")>>>16&61440)===40960}getFileSource(t,i={asyncDecompress:!1}){let n=this.fileSources.get(t);if(typeof n<\"u\")return n;let s=this.libzip.struct.statS();if(this.libzip.statIndex(this.zip,t,0,0,s)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));let a=this.libzip.struct.statCompSize(s),l=this.libzip.struct.statCompMethod(s),c=this.libzip.malloc(a);try{let u=this.libzip.fopenIndex(this.zip,t,0,this.libzip.ZIP_FL_COMPRESSED);if(u===0)throw this.makeLibzipError(this.libzip.getError(this.zip));try{let g=this.libzip.fread(u,c,a,0);if(g===-1)throw this.makeLibzipError(this.libzip.file.getError(u));if(g<a)throw new Error(\"Incomplete read\");if(g>a)throw new Error(\"Overread\");let f=this.libzip.HEAPU8.subarray(c,c+a),h=Buffer.from(f);if(l===0)return this.fileSources.set(t,h),h;if(i.asyncDecompress)return new Promise((p,C)=>{yS.default.inflateRaw(h,(y,B)=>{y?C(y):(this.fileSources.set(t,B),p(B))})});{let p=yS.default.inflateRawSync(h);return this.fileSources.set(t,p),p}}finally{this.libzip.fclose(u)}}finally{this.libzip.free(c)}}async fchmodPromise(t,i){return this.chmodPromise(this.fdToPath(t,\"fchmod\"),i)}fchmodSync(t,i){return this.chmodSync(this.fdToPath(t,\"fchmodSync\"),i)}async chmodPromise(t,i){return this.chmodSync(t,i)}chmodSync(t,i){if(this.readOnly)throw un(`chmod '${t}'`);i&=493;let n=this.resolveFilename(`chmod '${t}'`,t,!1),s=this.entries.get(n);if(typeof s>\"u\")throw new Error(`Assertion failed: The entry should have been registered (${n})`);let a=this.getUnixMode(s,32768)&-512|i;if(this.libzip.file.setExternalAttributes(this.zip,s,0,0,this.libzip.ZIP_OPSYS_UNIX,a<<16)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}async fchownPromise(t,i,n){return this.chownPromise(this.fdToPath(t,\"fchown\"),i,n)}fchownSync(t,i,n){return this.chownSync(this.fdToPath(t,\"fchownSync\"),i,n)}async chownPromise(t,i,n){return this.chownSync(t,i,n)}chownSync(t,i,n){throw new Error(\"Unimplemented\")}async renamePromise(t,i){return this.renameSync(t,i)}renameSync(t,i){throw new Error(\"Unimplemented\")}async copyFilePromise(t,i,n){let{indexSource:s,indexDest:o,resolvedDestP:a}=this.prepareCopyFile(t,i,n),l=await this.getFileSource(s,{asyncDecompress:!0}),c=this.setFileSource(a,l);c!==o&&this.registerEntry(a,c)}copyFileSync(t,i,n=0){let{indexSource:s,indexDest:o,resolvedDestP:a}=this.prepareCopyFile(t,i,n),l=this.getFileSource(s),c=this.setFileSource(a,l);c!==o&&this.registerEntry(a,c)}prepareCopyFile(t,i,n=0){if(this.readOnly)throw un(`copyfile '${t} -> '${i}'`);if((n&bg.constants.COPYFILE_FICLONE_FORCE)!==0)throw Kp(\"unsupported clone operation\",`copyfile '${t}' -> ${i}'`);let s=this.resolveFilename(`copyfile '${t} -> ${i}'`,t),o=this.entries.get(s);if(typeof o>\"u\")throw xA(`copyfile '${t}' -> '${i}'`);let a=this.resolveFilename(`copyfile '${t}' -> ${i}'`,i),l=this.entries.get(a);if((n&(bg.constants.COPYFILE_EXCL|bg.constants.COPYFILE_FICLONE_FORCE))!==0&&typeof l<\"u\")throw eI(`copyfile '${t}' -> '${i}'`);return{indexSource:o,resolvedDestP:a,indexDest:l}}async appendFilePromise(t,i,n){if(this.readOnly)throw un(`open '${t}'`);return typeof n>\"u\"?n={flag:\"a\"}:typeof n==\"string\"?n={flag:\"a\",encoding:n}:typeof n.flag>\"u\"&&(n={flag:\"a\",...n}),this.writeFilePromise(t,i,n)}appendFileSync(t,i,n={}){if(this.readOnly)throw un(`open '${t}'`);return typeof n>\"u\"?n={flag:\"a\"}:typeof n==\"string\"?n={flag:\"a\",encoding:n}:typeof n.flag>\"u\"&&(n={flag:\"a\",...n}),this.writeFileSync(t,i,n)}fdToPath(t,i){var s;let n=(s=this.fds.get(t))==null?void 0:s.p;if(typeof n>\"u\")throw Hr(i);return n}async writeFilePromise(t,i,n){let{encoding:s,mode:o,index:a,resolvedP:l}=this.prepareWriteFile(t,n);a!==void 0&&typeof n==\"object\"&&n.flag&&n.flag.includes(\"a\")&&(i=Buffer.concat([await this.getFileSource(a,{asyncDecompress:!0}),Buffer.from(i)])),s!==null&&(i=i.toString(s));let c=this.setFileSource(l,i);c!==a&&this.registerEntry(l,c),o!==null&&await this.chmodPromise(l,o)}writeFileSync(t,i,n){let{encoding:s,mode:o,index:a,resolvedP:l}=this.prepareWriteFile(t,n);a!==void 0&&typeof n==\"object\"&&n.flag&&n.flag.includes(\"a\")&&(i=Buffer.concat([this.getFileSource(a),Buffer.from(i)])),s!==null&&(i=i.toString(s));let c=this.setFileSource(l,i);c!==a&&this.registerEntry(l,c),o!==null&&this.chmodSync(l,o)}prepareWriteFile(t,i){if(typeof t==\"number\"&&(t=this.fdToPath(t,\"read\")),this.readOnly)throw un(`open '${t}'`);let n=this.resolveFilename(`open '${t}'`,t);if(this.listings.has(n))throw Up(`open '${t}'`);let s=null,o=null;typeof i==\"string\"?s=i:typeof i==\"object\"&&({encoding:s=null,mode:o=null}=i);let a=this.entries.get(n);return{encoding:s,mode:o,resolvedP:n,index:a}}async unlinkPromise(t){return this.unlinkSync(t)}unlinkSync(t){if(this.readOnly)throw un(`unlink '${t}'`);let i=this.resolveFilename(`unlink '${t}'`,t);if(this.listings.has(i))throw Up(`unlink '${t}'`);let n=this.entries.get(i);if(typeof n>\"u\")throw xA(`unlink '${t}'`);this.deleteEntry(i,n)}async utimesPromise(t,i,n){return this.utimesSync(t,i,n)}utimesSync(t,i,n){if(this.readOnly)throw un(`utimes '${t}'`);let s=this.resolveFilename(`utimes '${t}'`,t);this.utimesImpl(s,n)}async lutimesPromise(t,i,n){return this.lutimesSync(t,i,n)}lutimesSync(t,i,n){if(this.readOnly)throw un(`lutimes '${t}'`);let s=this.resolveFilename(`utimes '${t}'`,t,!1);this.utimesImpl(s,n)}utimesImpl(t,i){this.listings.has(t)&&(this.entries.has(t)||this.hydrateDirectory(t));let n=this.entries.get(t);if(n===void 0)throw new Error(\"Unreachable\");if(this.libzip.file.setMtime(this.zip,n,0,Jge(i),0)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}async mkdirPromise(t,i){return this.mkdirSync(t,i)}mkdirSync(t,{mode:i=493,recursive:n=!1}={}){if(n)return this.mkdirpSync(t,{chmod:i});if(this.readOnly)throw un(`mkdir '${t}'`);let s=this.resolveFilename(`mkdir '${t}'`,t);if(this.entries.has(s)||this.listings.has(s))throw eI(`mkdir '${t}'`);this.hydrateDirectory(s),this.chmodSync(s,i)}async rmdirPromise(t,i){return this.rmdirSync(t,i)}rmdirSync(t,{recursive:i=!1}={}){if(this.readOnly)throw un(`rmdir '${t}'`);if(i){this.removeSync(t);return}let n=this.resolveFilename(`rmdir '${t}'`,t),s=this.listings.get(n);if(!s)throw Qo(`rmdir '${t}'`);if(s.size>0)throw aK(`rmdir '${t}'`);let o=this.entries.get(n);if(typeof o>\"u\")throw xA(`rmdir '${t}'`);this.deleteEntry(t,o)}hydrateDirectory(t){let i=this.libzip.dir.add(this.zip,x.relative(Oe.root,t));if(i===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.registerListing(t),this.registerEntry(t,i),i}async linkPromise(t,i){return this.linkSync(t,i)}linkSync(t,i){throw AK(`link '${t}' -> '${i}'`)}async symlinkPromise(t,i){return this.symlinkSync(t,i)}symlinkSync(t,i){if(this.readOnly)throw un(`symlink '${t}' -> '${i}'`);let n=this.resolveFilename(`symlink '${t}' -> '${i}'`,i);if(this.listings.has(n))throw Up(`symlink '${t}' -> '${i}'`);if(this.entries.has(n))throw eI(`symlink '${t}' -> '${i}'`);let s=this.setFileSource(n,t);if(this.registerEntry(n,s),this.libzip.file.setExternalAttributes(this.zip,s,0,0,this.libzip.ZIP_OPSYS_UNIX,41471<<16)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));this.symlinkCount+=1}async readFilePromise(t,i){typeof i==\"object\"&&(i=i?i.encoding:void 0);let n=await this.readFileBuffer(t,{asyncDecompress:!0});return i?n.toString(i):n}readFileSync(t,i){typeof i==\"object\"&&(i=i?i.encoding:void 0);let n=this.readFileBuffer(t);return i?n.toString(i):n}readFileBuffer(t,i={asyncDecompress:!1}){typeof t==\"number\"&&(t=this.fdToPath(t,\"read\"));let n=this.resolveFilename(`open '${t}'`,t);if(!this.entries.has(n)&&!this.listings.has(n))throw Js(`open '${t}'`);if(t[t.length-1]===\"/\"&&!this.listings.has(n))throw Qo(`open '${t}'`);if(this.listings.has(n))throw Up(\"read\");let s=this.entries.get(n);if(s===void 0)throw new Error(\"Unreachable\");return this.getFileSource(s,i)}async readdirPromise(t,i){return this.readdirSync(t,i)}readdirSync(t,i){let n=this.resolveFilename(`scandir '${t}'`,t);if(!this.entries.has(n)&&!this.listings.has(n))throw Js(`scandir '${t}'`);let s=this.listings.get(n);if(!s)throw Qo(`scandir '${t}'`);let o=[...s];return i!=null&&i.withFileTypes?o.map(a=>Object.assign(this.statImpl(\"lstat\",x.join(t,a)),{name:a})):o}async readlinkPromise(t){let i=this.prepareReadlink(t);return(await this.getFileSource(i,{asyncDecompress:!0})).toString()}readlinkSync(t){let i=this.prepareReadlink(t);return this.getFileSource(i).toString()}prepareReadlink(t){let i=this.resolveFilename(`readlink '${t}'`,t,!1);if(!this.entries.has(i)&&!this.listings.has(i))throw Js(`readlink '${t}'`);if(t[t.length-1]===\"/\"&&!this.listings.has(i))throw Qo(`open '${t}'`);if(this.listings.has(i))throw xA(`readlink '${t}'`);let n=this.entries.get(i);if(n===void 0)throw new Error(\"Unreachable\");if(!this.isSymbolicLink(n))throw xA(`readlink '${t}'`);return n}async truncatePromise(t,i=0){let n=this.resolveFilename(`open '${t}'`,t),s=this.entries.get(n);if(typeof s>\"u\")throw xA(`open '${t}'`);let o=await this.getFileSource(s,{asyncDecompress:!0}),a=Buffer.alloc(i,0);return o.copy(a),await this.writeFilePromise(t,a)}truncateSync(t,i=0){let n=this.resolveFilename(`open '${t}'`,t),s=this.entries.get(n);if(typeof s>\"u\")throw xA(`open '${t}'`);let o=this.getFileSource(s),a=Buffer.alloc(i,0);return o.copy(a),this.writeFileSync(t,a)}async ftruncatePromise(t,i){return this.truncatePromise(this.fdToPath(t,\"ftruncate\"),i)}ftruncateSync(t,i){return this.truncateSync(this.fdToPath(t,\"ftruncateSync\"),i)}watch(t,i,n){let s;switch(typeof i){case\"function\":case\"string\":case\"undefined\":s=!0;break;default:({persistent:s=!0}=i);break}if(!s)return{on:()=>{},close:()=>{}};let o=setInterval(()=>{},24*60*60*1e3);return{on:()=>{},close:()=>{clearInterval(o)}}}watchFile(t,i,n){let s=x.resolve(Oe.root,t);return iI(this,s,i,n)}unwatchFile(t,i){let n=x.resolve(Oe.root,t);return Gp(this,n,i)}};var pi=class extends ya{getExtractHint(e){return this.baseFs.getExtractHint(e)}resolve(e){return this.mapFromBase(this.baseFs.resolve(this.mapToBase(e)))}getRealPath(){return this.mapFromBase(this.baseFs.getRealPath())}async openPromise(e,t,i){return this.baseFs.openPromise(this.mapToBase(e),t,i)}openSync(e,t,i){return this.baseFs.openSync(this.mapToBase(e),t,i)}async opendirPromise(e,t){return Object.assign(await this.baseFs.opendirPromise(this.mapToBase(e),t),{path:e})}opendirSync(e,t){return Object.assign(this.baseFs.opendirSync(this.mapToBase(e),t),{path:e})}async readPromise(e,t,i,n,s){return await this.baseFs.readPromise(e,t,i,n,s)}readSync(e,t,i,n,s){return this.baseFs.readSync(e,t,i,n,s)}async writePromise(e,t,i,n,s){return typeof t==\"string\"?await this.baseFs.writePromise(e,t,i):await this.baseFs.writePromise(e,t,i,n,s)}writeSync(e,t,i,n,s){return typeof t==\"string\"?this.baseFs.writeSync(e,t,i):this.baseFs.writeSync(e,t,i,n,s)}async closePromise(e){return this.baseFs.closePromise(e)}closeSync(e){this.baseFs.closeSync(e)}createReadStream(e,t){return this.baseFs.createReadStream(e!==null?this.mapToBase(e):e,t)}createWriteStream(e,t){return this.baseFs.createWriteStream(e!==null?this.mapToBase(e):e,t)}async realpathPromise(e){return this.mapFromBase(await this.baseFs.realpathPromise(this.mapToBase(e)))}realpathSync(e){return this.mapFromBase(this.baseFs.realpathSync(this.mapToBase(e)))}async existsPromise(e){return this.baseFs.existsPromise(this.mapToBase(e))}existsSync(e){return this.baseFs.existsSync(this.mapToBase(e))}accessSync(e,t){return this.baseFs.accessSync(this.mapToBase(e),t)}async accessPromise(e,t){return this.baseFs.accessPromise(this.mapToBase(e),t)}async statPromise(e,t){return this.baseFs.statPromise(this.mapToBase(e),t)}statSync(e,t){return this.baseFs.statSync(this.mapToBase(e),t)}async fstatPromise(e,t){return this.baseFs.fstatPromise(e,t)}fstatSync(e,t){return this.baseFs.fstatSync(e,t)}lstatPromise(e,t){return this.baseFs.lstatPromise(this.mapToBase(e),t)}lstatSync(e,t){return this.baseFs.lstatSync(this.mapToBase(e),t)}async fchmodPromise(e,t){return this.baseFs.fchmodPromise(e,t)}fchmodSync(e,t){return this.baseFs.fchmodSync(e,t)}async chmodPromise(e,t){return this.baseFs.chmodPromise(this.mapToBase(e),t)}chmodSync(e,t){return this.baseFs.chmodSync(this.mapToBase(e),t)}async fchownPromise(e,t,i){return this.baseFs.fchownPromise(e,t,i)}fchownSync(e,t,i){return this.baseFs.fchownSync(e,t,i)}async chownPromise(e,t,i){return this.baseFs.chownPromise(this.mapToBase(e),t,i)}chownSync(e,t,i){return this.baseFs.chownSync(this.mapToBase(e),t,i)}async renamePromise(e,t){return this.baseFs.renamePromise(this.mapToBase(e),this.mapToBase(t))}renameSync(e,t){return this.baseFs.renameSync(this.mapToBase(e),this.mapToBase(t))}async copyFilePromise(e,t,i=0){return this.baseFs.copyFilePromise(this.mapToBase(e),this.mapToBase(t),i)}copyFileSync(e,t,i=0){return this.baseFs.copyFileSync(this.mapToBase(e),this.mapToBase(t),i)}async appendFilePromise(e,t,i){return this.baseFs.appendFilePromise(this.fsMapToBase(e),t,i)}appendFileSync(e,t,i){return this.baseFs.appendFileSync(this.fsMapToBase(e),t,i)}async writeFilePromise(e,t,i){return this.baseFs.writeFilePromise(this.fsMapToBase(e),t,i)}writeFileSync(e,t,i){return this.baseFs.writeFileSync(this.fsMapToBase(e),t,i)}async unlinkPromise(e){return this.baseFs.unlinkPromise(this.mapToBase(e))}unlinkSync(e){return this.baseFs.unlinkSync(this.mapToBase(e))}async utimesPromise(e,t,i){return this.baseFs.utimesPromise(this.mapToBase(e),t,i)}utimesSync(e,t,i){return this.baseFs.utimesSync(this.mapToBase(e),t,i)}async mkdirPromise(e,t){return this.baseFs.mkdirPromise(this.mapToBase(e),t)}mkdirSync(e,t){return this.baseFs.mkdirSync(this.mapToBase(e),t)}async rmdirPromise(e,t){return this.baseFs.rmdirPromise(this.mapToBase(e),t)}rmdirSync(e,t){return this.baseFs.rmdirSync(this.mapToBase(e),t)}async linkPromise(e,t){return this.baseFs.linkPromise(this.mapToBase(e),this.mapToBase(t))}linkSync(e,t){return this.baseFs.linkSync(this.mapToBase(e),this.mapToBase(t))}async symlinkPromise(e,t,i){let n=this.mapToBase(t);if(this.pathUtils.isAbsolute(e))return this.baseFs.symlinkPromise(this.mapToBase(e),n,i);let s=this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(t),e)),o=this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(n),s);return this.baseFs.symlinkPromise(o,n,i)}symlinkSync(e,t,i){let n=this.mapToBase(t);if(this.pathUtils.isAbsolute(e))return this.baseFs.symlinkSync(this.mapToBase(e),n,i);let s=this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(t),e)),o=this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(n),s);return this.baseFs.symlinkSync(o,n,i)}async readFilePromise(e,t){return t===\"utf8\"?this.baseFs.readFilePromise(this.fsMapToBase(e),t):this.baseFs.readFilePromise(this.fsMapToBase(e),t)}readFileSync(e,t){return t===\"utf8\"?this.baseFs.readFileSync(this.fsMapToBase(e),t):this.baseFs.readFileSync(this.fsMapToBase(e),t)}async readdirPromise(e,t){return this.baseFs.readdirPromise(this.mapToBase(e),t)}readdirSync(e,t){return this.baseFs.readdirSync(this.mapToBase(e),t)}async readlinkPromise(e){return this.mapFromBase(await this.baseFs.readlinkPromise(this.mapToBase(e)))}readlinkSync(e){return this.mapFromBase(this.baseFs.readlinkSync(this.mapToBase(e)))}async truncatePromise(e,t){return this.baseFs.truncatePromise(this.mapToBase(e),t)}truncateSync(e,t){return this.baseFs.truncateSync(this.mapToBase(e),t)}async ftruncatePromise(e,t){return this.baseFs.ftruncatePromise(e,t)}ftruncateSync(e,t){return this.baseFs.ftruncateSync(e,t)}watch(e,t,i){return this.baseFs.watch(this.mapToBase(e),t,i)}watchFile(e,t,i){return this.baseFs.watchFile(this.mapToBase(e),t,i)}unwatchFile(e,t){return this.baseFs.unwatchFile(this.mapToBase(e),t)}fsMapToBase(e){return typeof e==\"number\"?e:this.mapToBase(e)}};var bo=class extends pi{constructor(t,{baseFs:i,pathUtils:n}){super(n);this.target=t,this.baseFs=i}getRealPath(){return this.target}getBaseFs(){return this.baseFs}mapFromBase(t){return t}mapToBase(t){return t}};var qt=class extends pi{constructor(t,{baseFs:i=new $t}={}){super(x);this.target=this.pathUtils.normalize(t),this.baseFs=i}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.target)}resolve(t){return this.pathUtils.isAbsolute(t)?x.normalize(t):this.baseFs.resolve(x.join(this.target,t))}mapFromBase(t){return t}mapToBase(t){return this.pathUtils.isAbsolute(t)?t:this.pathUtils.join(this.target,t)}};var pK=Oe.root,So=class extends pi{constructor(t,{baseFs:i=new $t}={}){super(x);this.target=this.pathUtils.resolve(Oe.root,t),this.baseFs=i}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.pathUtils.relative(Oe.root,this.target))}getTarget(){return this.target}getBaseFs(){return this.baseFs}mapToBase(t){let i=this.pathUtils.normalize(t);if(this.pathUtils.isAbsolute(t))return this.pathUtils.resolve(this.target,this.pathUtils.relative(pK,t));if(i.match(/^\\.\\.\\/?/))throw new Error(`Resolving this path (${t}) would escape the jail`);return this.pathUtils.resolve(this.target,t)}mapFromBase(t){return this.pathUtils.resolve(pK,this.pathUtils.relative(this.target,t))}};var Sg=class extends pi{constructor(t,i){super(i);this.instance=null;this.factory=t}get baseFs(){return this.instance||(this.instance=this.factory()),this.instance}set baseFs(t){this.instance=t}mapFromBase(t){return t}mapToBase(t){return t}};var Ze=()=>Object.assign(new Error(\"ENOSYS: unsupported filesystem access\"),{code:\"ENOSYS\"}),wS=class extends ya{constructor(){super(x)}getExtractHint(){throw Ze()}getRealPath(){throw Ze()}resolve(){throw Ze()}async openPromise(){throw Ze()}openSync(){throw Ze()}async opendirPromise(){throw Ze()}opendirSync(){throw Ze()}async readPromise(){throw Ze()}readSync(){throw Ze()}async writePromise(){throw Ze()}writeSync(){throw Ze()}async closePromise(){throw Ze()}closeSync(){throw Ze()}createWriteStream(){throw Ze()}createReadStream(){throw Ze()}async realpathPromise(){throw Ze()}realpathSync(){throw Ze()}async readdirPromise(){throw Ze()}readdirSync(){throw Ze()}async existsPromise(e){throw Ze()}existsSync(e){throw Ze()}async accessPromise(){throw Ze()}accessSync(){throw Ze()}async statPromise(){throw Ze()}statSync(){throw Ze()}async fstatPromise(e){throw Ze()}fstatSync(e){throw Ze()}async lstatPromise(e){throw Ze()}lstatSync(e){throw Ze()}async fchmodPromise(){throw Ze()}fchmodSync(){throw Ze()}async chmodPromise(){throw Ze()}chmodSync(){throw Ze()}async fchownPromise(){throw Ze()}fchownSync(){throw Ze()}async chownPromise(){throw Ze()}chownSync(){throw Ze()}async mkdirPromise(){throw Ze()}mkdirSync(){throw Ze()}async rmdirPromise(){throw Ze()}rmdirSync(){throw Ze()}async linkPromise(){throw Ze()}linkSync(){throw Ze()}async symlinkPromise(){throw Ze()}symlinkSync(){throw Ze()}async renamePromise(){throw Ze()}renameSync(){throw Ze()}async copyFilePromise(){throw Ze()}copyFileSync(){throw Ze()}async appendFilePromise(){throw Ze()}appendFileSync(){throw Ze()}async writeFilePromise(){throw Ze()}writeFileSync(){throw Ze()}async unlinkPromise(){throw Ze()}unlinkSync(){throw Ze()}async utimesPromise(){throw Ze()}utimesSync(){throw Ze()}async readFilePromise(){throw Ze()}readFileSync(){throw Ze()}async readlinkPromise(){throw Ze()}readlinkSync(){throw Ze()}async truncatePromise(){throw Ze()}truncateSync(){throw Ze()}async ftruncatePromise(e,t){throw Ze()}ftruncateSync(e,t){throw Ze()}watch(){throw Ze()}watchFile(){throw Ze()}unwatchFile(){throw Ze()}},jp=wS;jp.instance=new wS;var vg=class extends pi{constructor(t){super(K);this.baseFs=t}mapFromBase(t){return K.fromPortablePath(t)}mapToBase(t){return K.toPortablePath(t)}};var Wge=/^[0-9]+$/,BS=/^(\\/(?:[^/]+\\/)*?(?:\\$\\$virtual|__virtual__))((?:\\/((?:[^/]+-)?[a-f0-9]+)(?:\\/([^/]+))?)?((?:\\/.*)?))$/,zge=/^([^/]+-)?[a-f0-9]+$/,Br=class extends pi{constructor({baseFs:t=new $t}={}){super(x);this.baseFs=t}static makeVirtualPath(t,i,n){if(x.basename(t)!==\"__virtual__\")throw new Error('Assertion failed: Virtual folders must be named \"__virtual__\"');if(!x.basename(i).match(zge))throw new Error(\"Assertion failed: Virtual components must be ended by an hexadecimal hash\");let o=x.relative(x.dirname(t),n).split(\"/\"),a=0;for(;a<o.length&&o[a]===\"..\";)a+=1;let l=o.slice(a);return x.join(t,i,String(a),...l)}static resolveVirtual(t){let i=t.match(BS);if(!i||!i[3]&&i[5])return t;let n=x.dirname(i[1]);if(!i[3]||!i[4])return n;if(!Wge.test(i[4]))return t;let o=Number(i[4]),a=\"../\".repeat(o),l=i[5]||\".\";return Br.resolveVirtual(x.join(n,a,l))}getExtractHint(t){return this.baseFs.getExtractHint(t)}getRealPath(){return this.baseFs.getRealPath()}realpathSync(t){let i=t.match(BS);if(!i)return this.baseFs.realpathSync(t);if(!i[5])return t;let n=this.baseFs.realpathSync(this.mapToBase(t));return Br.makeVirtualPath(i[1],i[3],n)}async realpathPromise(t){let i=t.match(BS);if(!i)return await this.baseFs.realpathPromise(t);if(!i[5])return t;let n=await this.baseFs.realpathPromise(this.mapToBase(t));return Br.makeVirtualPath(i[1],i[3],n)}mapToBase(t){if(t===\"\")return t;if(this.pathUtils.isAbsolute(t))return Br.resolveVirtual(t);let i=Br.resolveVirtual(this.baseFs.resolve(Oe.dot)),n=Br.resolveVirtual(this.baseFs.resolve(t));return x.relative(i,n)||Oe.dot}mapFromBase(t){return t}};var qp=J(\"fs\");var gn=4278190080,Vi=704643072,dK=(r,e)=>{let t=r.indexOf(e);if(t<=0)return null;let i=t;for(;t>=0&&(i=t+e.length,r[i]!==x.sep);){if(r[t-1]===x.sep)return null;t=r.indexOf(e,i)}return r.length>i&&r[i]!==x.sep?null:r.slice(0,i)},Kn=class extends PA{constructor({libzip:t,baseFs:i=new $t,filter:n=null,maxOpenFiles:s=1/0,readOnlyArchives:o=!1,useCache:a=!0,maxAge:l=5e3,fileExtensions:c=null}){super();this.fdMap=new Map;this.nextFd=3;this.isZip=new Set;this.notZip=new Set;this.realPaths=new Map;this.limitOpenFilesTimeout=null;this.libzipFactory=typeof t!=\"function\"?()=>t:t,this.baseFs=i,this.zipInstances=a?new Map:null,this.filter=n,this.maxOpenFiles=s,this.readOnlyArchives=o,this.maxAge=l,this.fileExtensions=c}static async openPromise(t,i){let n=new Kn(i);try{return await t(n)}finally{n.saveAndClose()}}get libzip(){return typeof this.libzipInstance>\"u\"&&(this.libzipInstance=this.libzipFactory()),this.libzipInstance}getExtractHint(t){return this.baseFs.getExtractHint(t)}getRealPath(){return this.baseFs.getRealPath()}saveAndClose(){if(Yp(this),this.zipInstances)for(let[t,{zipFs:i}]of this.zipInstances.entries())i.saveAndClose(),this.zipInstances.delete(t)}discardAndClose(){if(Yp(this),this.zipInstances)for(let[t,{zipFs:i}]of this.zipInstances.entries())i.discardAndClose(),this.zipInstances.delete(t)}resolve(t){return this.baseFs.resolve(t)}remapFd(t,i){let n=this.nextFd++|Vi;return this.fdMap.set(n,[t,i]),n}async openPromise(t,i,n){return await this.makeCallPromise(t,async()=>await this.baseFs.openPromise(t,i,n),async(s,{subPath:o})=>this.remapFd(s,await s.openPromise(o,i,n)))}openSync(t,i,n){return this.makeCallSync(t,()=>this.baseFs.openSync(t,i,n),(s,{subPath:o})=>this.remapFd(s,s.openSync(o,i,n)))}async opendirPromise(t,i){return await this.makeCallPromise(t,async()=>await this.baseFs.opendirPromise(t,i),async(n,{subPath:s})=>await n.opendirPromise(s,i),{requireSubpath:!1})}opendirSync(t,i){return this.makeCallSync(t,()=>this.baseFs.opendirSync(t,i),(n,{subPath:s})=>n.opendirSync(s,i),{requireSubpath:!1})}async readPromise(t,i,n,s,o){if((t&gn)!==Vi)return await this.baseFs.readPromise(t,i,n,s,o);let a=this.fdMap.get(t);if(typeof a>\"u\")throw Hr(\"read\");let[l,c]=a;return await l.readPromise(c,i,n,s,o)}readSync(t,i,n,s,o){if((t&gn)!==Vi)return this.baseFs.readSync(t,i,n,s,o);let a=this.fdMap.get(t);if(typeof a>\"u\")throw Hr(\"readSync\");let[l,c]=a;return l.readSync(c,i,n,s,o)}async writePromise(t,i,n,s,o){if((t&gn)!==Vi)return typeof i==\"string\"?await this.baseFs.writePromise(t,i,n):await this.baseFs.writePromise(t,i,n,s,o);let a=this.fdMap.get(t);if(typeof a>\"u\")throw Hr(\"write\");let[l,c]=a;return typeof i==\"string\"?await l.writePromise(c,i,n):await l.writePromise(c,i,n,s,o)}writeSync(t,i,n,s,o){if((t&gn)!==Vi)return typeof i==\"string\"?this.baseFs.writeSync(t,i,n):this.baseFs.writeSync(t,i,n,s,o);let a=this.fdMap.get(t);if(typeof a>\"u\")throw Hr(\"writeSync\");let[l,c]=a;return typeof i==\"string\"?l.writeSync(c,i,n):l.writeSync(c,i,n,s,o)}async closePromise(t){if((t&gn)!==Vi)return await this.baseFs.closePromise(t);let i=this.fdMap.get(t);if(typeof i>\"u\")throw Hr(\"close\");this.fdMap.delete(t);let[n,s]=i;return await n.closePromise(s)}closeSync(t){if((t&gn)!==Vi)return this.baseFs.closeSync(t);let i=this.fdMap.get(t);if(typeof i>\"u\")throw Hr(\"closeSync\");this.fdMap.delete(t);let[n,s]=i;return n.closeSync(s)}createReadStream(t,i){return t===null?this.baseFs.createReadStream(t,i):this.makeCallSync(t,()=>this.baseFs.createReadStream(t,i),(n,{archivePath:s,subPath:o})=>{let a=n.createReadStream(o,i);return a.path=K.fromPortablePath(this.pathUtils.join(s,o)),a})}createWriteStream(t,i){return t===null?this.baseFs.createWriteStream(t,i):this.makeCallSync(t,()=>this.baseFs.createWriteStream(t,i),(n,{subPath:s})=>n.createWriteStream(s,i))}async realpathPromise(t){return await this.makeCallPromise(t,async()=>await this.baseFs.realpathPromise(t),async(i,{archivePath:n,subPath:s})=>{let o=this.realPaths.get(n);return typeof o>\"u\"&&(o=await this.baseFs.realpathPromise(n),this.realPaths.set(n,o)),this.pathUtils.join(o,this.pathUtils.relative(Oe.root,await i.realpathPromise(s)))})}realpathSync(t){return this.makeCallSync(t,()=>this.baseFs.realpathSync(t),(i,{archivePath:n,subPath:s})=>{let o=this.realPaths.get(n);return typeof o>\"u\"&&(o=this.baseFs.realpathSync(n),this.realPaths.set(n,o)),this.pathUtils.join(o,this.pathUtils.relative(Oe.root,i.realpathSync(s)))})}async existsPromise(t){return await this.makeCallPromise(t,async()=>await this.baseFs.existsPromise(t),async(i,{subPath:n})=>await i.existsPromise(n))}existsSync(t){return this.makeCallSync(t,()=>this.baseFs.existsSync(t),(i,{subPath:n})=>i.existsSync(n))}async accessPromise(t,i){return await this.makeCallPromise(t,async()=>await this.baseFs.accessPromise(t,i),async(n,{subPath:s})=>await n.accessPromise(s,i))}accessSync(t,i){return this.makeCallSync(t,()=>this.baseFs.accessSync(t,i),(n,{subPath:s})=>n.accessSync(s,i))}async statPromise(t,i){return await this.makeCallPromise(t,async()=>await this.baseFs.statPromise(t,i),async(n,{subPath:s})=>await n.statPromise(s,i))}statSync(t,i){return this.makeCallSync(t,()=>this.baseFs.statSync(t,i),(n,{subPath:s})=>n.statSync(s,i))}async fstatPromise(t,i){if((t&gn)!==Vi)return this.baseFs.fstatPromise(t,i);let n=this.fdMap.get(t);if(typeof n>\"u\")throw Hr(\"fstat\");let[s,o]=n;return s.fstatPromise(o,i)}fstatSync(t,i){if((t&gn)!==Vi)return this.baseFs.fstatSync(t,i);let n=this.fdMap.get(t);if(typeof n>\"u\")throw Hr(\"fstatSync\");let[s,o]=n;return s.fstatSync(o,i)}async lstatPromise(t,i){return await this.makeCallPromise(t,async()=>await this.baseFs.lstatPromise(t,i),async(n,{subPath:s})=>await n.lstatPromise(s,i))}lstatSync(t,i){return this.makeCallSync(t,()=>this.baseFs.lstatSync(t,i),(n,{subPath:s})=>n.lstatSync(s,i))}async fchmodPromise(t,i){if((t&gn)!==Vi)return this.baseFs.fchmodPromise(t,i);let n=this.fdMap.get(t);if(typeof n>\"u\")throw Hr(\"fchmod\");let[s,o]=n;return s.fchmodPromise(o,i)}fchmodSync(t,i){if((t&gn)!==Vi)return this.baseFs.fchmodSync(t,i);let n=this.fdMap.get(t);if(typeof n>\"u\")throw Hr(\"fchmodSync\");let[s,o]=n;return s.fchmodSync(o,i)}async chmodPromise(t,i){return await this.makeCallPromise(t,async()=>await this.baseFs.chmodPromise(t,i),async(n,{subPath:s})=>await n.chmodPromise(s,i))}chmodSync(t,i){return this.makeCallSync(t,()=>this.baseFs.chmodSync(t,i),(n,{subPath:s})=>n.chmodSync(s,i))}async fchownPromise(t,i,n){if((t&gn)!==Vi)return this.baseFs.fchownPromise(t,i,n);let s=this.fdMap.get(t);if(typeof s>\"u\")throw Hr(\"fchown\");let[o,a]=s;return o.fchownPromise(a,i,n)}fchownSync(t,i,n){if((t&gn)!==Vi)return this.baseFs.fchownSync(t,i,n);let s=this.fdMap.get(t);if(typeof s>\"u\")throw Hr(\"fchownSync\");let[o,a]=s;return o.fchownSync(a,i,n)}async chownPromise(t,i,n){return await this.makeCallPromise(t,async()=>await this.baseFs.chownPromise(t,i,n),async(s,{subPath:o})=>await s.chownPromise(o,i,n))}chownSync(t,i,n){return this.makeCallSync(t,()=>this.baseFs.chownSync(t,i,n),(s,{subPath:o})=>s.chownSync(o,i,n))}async renamePromise(t,i){return await this.makeCallPromise(t,async()=>await this.makeCallPromise(i,async()=>await this.baseFs.renamePromise(t,i),async()=>{throw Object.assign(new Error(\"EEXDEV: cross-device link not permitted\"),{code:\"EEXDEV\"})}),async(n,{subPath:s})=>await this.makeCallPromise(i,async()=>{throw Object.assign(new Error(\"EEXDEV: cross-device link not permitted\"),{code:\"EEXDEV\"})},async(o,{subPath:a})=>{if(n!==o)throw Object.assign(new Error(\"EEXDEV: cross-device link not permitted\"),{code:\"EEXDEV\"});return await n.renamePromise(s,a)}))}renameSync(t,i){return this.makeCallSync(t,()=>this.makeCallSync(i,()=>this.baseFs.renameSync(t,i),()=>{throw Object.assign(new Error(\"EEXDEV: cross-device link not permitted\"),{code:\"EEXDEV\"})}),(n,{subPath:s})=>this.makeCallSync(i,()=>{throw Object.assign(new Error(\"EEXDEV: cross-device link not permitted\"),{code:\"EEXDEV\"})},(o,{subPath:a})=>{if(n!==o)throw Object.assign(new Error(\"EEXDEV: cross-device link not permitted\"),{code:\"EEXDEV\"});return n.renameSync(s,a)}))}async copyFilePromise(t,i,n=0){let s=async(o,a,l,c)=>{if((n&qp.constants.COPYFILE_FICLONE_FORCE)!==0)throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${a}' -> ${c}'`),{code:\"EXDEV\"});if(n&qp.constants.COPYFILE_EXCL&&await this.existsPromise(a))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${a}' -> '${c}'`),{code:\"EEXIST\"});let u;try{u=await o.readFilePromise(a)}catch{throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${a}' -> '${c}'`),{code:\"EINVAL\"})}await l.writeFilePromise(c,u)};return await this.makeCallPromise(t,async()=>await this.makeCallPromise(i,async()=>await this.baseFs.copyFilePromise(t,i,n),async(o,{subPath:a})=>await s(this.baseFs,t,o,a)),async(o,{subPath:a})=>await this.makeCallPromise(i,async()=>await s(o,a,this.baseFs,i),async(l,{subPath:c})=>o!==l?await s(o,a,l,c):await o.copyFilePromise(a,c,n)))}copyFileSync(t,i,n=0){let s=(o,a,l,c)=>{if((n&qp.constants.COPYFILE_FICLONE_FORCE)!==0)throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${a}' -> ${c}'`),{code:\"EXDEV\"});if(n&qp.constants.COPYFILE_EXCL&&this.existsSync(a))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${a}' -> '${c}'`),{code:\"EEXIST\"});let u;try{u=o.readFileSync(a)}catch{throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${a}' -> '${c}'`),{code:\"EINVAL\"})}l.writeFileSync(c,u)};return this.makeCallSync(t,()=>this.makeCallSync(i,()=>this.baseFs.copyFileSync(t,i,n),(o,{subPath:a})=>s(this.baseFs,t,o,a)),(o,{subPath:a})=>this.makeCallSync(i,()=>s(o,a,this.baseFs,i),(l,{subPath:c})=>o!==l?s(o,a,l,c):o.copyFileSync(a,c,n)))}async appendFilePromise(t,i,n){return await this.makeCallPromise(t,async()=>await this.baseFs.appendFilePromise(t,i,n),async(s,{subPath:o})=>await s.appendFilePromise(o,i,n))}appendFileSync(t,i,n){return this.makeCallSync(t,()=>this.baseFs.appendFileSync(t,i,n),(s,{subPath:o})=>s.appendFileSync(o,i,n))}async writeFilePromise(t,i,n){return await this.makeCallPromise(t,async()=>await this.baseFs.writeFilePromise(t,i,n),async(s,{subPath:o})=>await s.writeFilePromise(o,i,n))}writeFileSync(t,i,n){return this.makeCallSync(t,()=>this.baseFs.writeFileSync(t,i,n),(s,{subPath:o})=>s.writeFileSync(o,i,n))}async unlinkPromise(t){return await this.makeCallPromise(t,async()=>await this.baseFs.unlinkPromise(t),async(i,{subPath:n})=>await i.unlinkPromise(n))}unlinkSync(t){return this.makeCallSync(t,()=>this.baseFs.unlinkSync(t),(i,{subPath:n})=>i.unlinkSync(n))}async utimesPromise(t,i,n){return await this.makeCallPromise(t,async()=>await this.baseFs.utimesPromise(t,i,n),async(s,{subPath:o})=>await s.utimesPromise(o,i,n))}utimesSync(t,i,n){return this.makeCallSync(t,()=>this.baseFs.utimesSync(t,i,n),(s,{subPath:o})=>s.utimesSync(o,i,n))}async mkdirPromise(t,i){return await this.makeCallPromise(t,async()=>await this.baseFs.mkdirPromise(t,i),async(n,{subPath:s})=>await n.mkdirPromise(s,i))}mkdirSync(t,i){return this.makeCallSync(t,()=>this.baseFs.mkdirSync(t,i),(n,{subPath:s})=>n.mkdirSync(s,i))}async rmdirPromise(t,i){return await this.makeCallPromise(t,async()=>await this.baseFs.rmdirPromise(t,i),async(n,{subPath:s})=>await n.rmdirPromise(s,i))}rmdirSync(t,i){return this.makeCallSync(t,()=>this.baseFs.rmdirSync(t,i),(n,{subPath:s})=>n.rmdirSync(s,i))}async linkPromise(t,i){return await this.makeCallPromise(i,async()=>await this.baseFs.linkPromise(t,i),async(n,{subPath:s})=>await n.linkPromise(t,s))}linkSync(t,i){return this.makeCallSync(i,()=>this.baseFs.linkSync(t,i),(n,{subPath:s})=>n.linkSync(t,s))}async symlinkPromise(t,i,n){return await this.makeCallPromise(i,async()=>await this.baseFs.symlinkPromise(t,i,n),async(s,{subPath:o})=>await s.symlinkPromise(t,o))}symlinkSync(t,i,n){return this.makeCallSync(i,()=>this.baseFs.symlinkSync(t,i,n),(s,{subPath:o})=>s.symlinkSync(t,o))}async readFilePromise(t,i){return this.makeCallPromise(t,async()=>{switch(i){case\"utf8\":return await this.baseFs.readFilePromise(t,i);default:return await this.baseFs.readFilePromise(t,i)}},async(n,{subPath:s})=>await n.readFilePromise(s,i))}readFileSync(t,i){return this.makeCallSync(t,()=>{switch(i){case\"utf8\":return this.baseFs.readFileSync(t,i);default:return this.baseFs.readFileSync(t,i)}},(n,{subPath:s})=>n.readFileSync(s,i))}async readdirPromise(t,i){return await this.makeCallPromise(t,async()=>await this.baseFs.readdirPromise(t,i),async(n,{subPath:s})=>await n.readdirPromise(s,i),{requireSubpath:!1})}readdirSync(t,i){return this.makeCallSync(t,()=>this.baseFs.readdirSync(t,i),(n,{subPath:s})=>n.readdirSync(s,i),{requireSubpath:!1})}async readlinkPromise(t){return await this.makeCallPromise(t,async()=>await this.baseFs.readlinkPromise(t),async(i,{subPath:n})=>await i.readlinkPromise(n))}readlinkSync(t){return this.makeCallSync(t,()=>this.baseFs.readlinkSync(t),(i,{subPath:n})=>i.readlinkSync(n))}async truncatePromise(t,i){return await this.makeCallPromise(t,async()=>await this.baseFs.truncatePromise(t,i),async(n,{subPath:s})=>await n.truncatePromise(s,i))}truncateSync(t,i){return this.makeCallSync(t,()=>this.baseFs.truncateSync(t,i),(n,{subPath:s})=>n.truncateSync(s,i))}async ftruncatePromise(t,i){if((t&gn)!==Vi)return this.baseFs.ftruncatePromise(t,i);let n=this.fdMap.get(t);if(typeof n>\"u\")throw Hr(\"ftruncate\");let[s,o]=n;return s.ftruncatePromise(o,i)}ftruncateSync(t,i){if((t&gn)!==Vi)return this.baseFs.ftruncateSync(t,i);let n=this.fdMap.get(t);if(typeof n>\"u\")throw Hr(\"ftruncateSync\");let[s,o]=n;return s.ftruncateSync(o,i)}watch(t,i,n){return this.makeCallSync(t,()=>this.baseFs.watch(t,i,n),(s,{subPath:o})=>s.watch(o,i,n))}watchFile(t,i,n){return this.makeCallSync(t,()=>this.baseFs.watchFile(t,i,n),()=>iI(this,t,i,n))}unwatchFile(t,i){return this.makeCallSync(t,()=>this.baseFs.unwatchFile(t,i),()=>Gp(this,t,i))}async makeCallPromise(t,i,n,{requireSubpath:s=!0}={}){if(typeof t!=\"string\")return await i();let o=this.resolve(t),a=this.findZip(o);return a?s&&a.subPath===\"/\"?await i():await this.getZipPromise(a.archivePath,async l=>await n(l,a)):await i()}makeCallSync(t,i,n,{requireSubpath:s=!0}={}){if(typeof t!=\"string\")return i();let o=this.resolve(t),a=this.findZip(o);return!a||s&&a.subPath===\"/\"?i():this.getZipSync(a.archivePath,l=>n(l,a))}findZip(t){if(this.filter&&!this.filter.test(t))return null;let i=\"\";for(;;){let n=t.substring(i.length),s;if(!this.fileExtensions)s=dK(n,\".zip\");else for(let o of this.fileExtensions)if(s=dK(n,o),s)break;if(!s)return null;if(i=this.pathUtils.join(i,s),this.isZip.has(i)===!1){if(this.notZip.has(i))continue;try{if(!this.baseFs.lstatSync(i).isFile()){this.notZip.add(i);continue}}catch{return null}this.isZip.add(i)}return{archivePath:i,subPath:this.pathUtils.join(Oe.root,t.substring(i.length))}}}limitOpenFiles(t){if(this.zipInstances===null)return;let i=Date.now(),n=i+this.maxAge,s=t===null?0:this.zipInstances.size-t;for(let[o,{zipFs:a,expiresAt:l,refCount:c}]of this.zipInstances.entries())if(!(c!==0||a.hasOpenFileHandles())){if(i>=l){a.saveAndClose(),this.zipInstances.delete(o),s-=1;continue}else if(t===null||s<=0){n=l;break}a.saveAndClose(),this.zipInstances.delete(o),s-=1}this.limitOpenFilesTimeout===null&&(t===null&&this.zipInstances.size>0||t!==null)&&(this.limitOpenFilesTimeout=setTimeout(()=>{this.limitOpenFilesTimeout=null,this.limitOpenFiles(null)},n-i).unref())}async getZipPromise(t,i){let n=async()=>({baseFs:this.baseFs,libzip:this.libzip,readOnly:this.readOnlyArchives,stats:await this.baseFs.statPromise(t)});if(this.zipInstances){let s=this.zipInstances.get(t);if(!s){let o=await n();s=this.zipInstances.get(t),s||(s={zipFs:new Wr(t,o),expiresAt:0,refCount:0})}this.zipInstances.delete(t),this.limitOpenFiles(this.maxOpenFiles-1),this.zipInstances.set(t,s),s.expiresAt=Date.now()+this.maxAge,s.refCount+=1;try{return await i(s.zipFs)}finally{s.refCount-=1}}else{let s=new Wr(t,await n());try{return await i(s)}finally{s.saveAndClose()}}}getZipSync(t,i){let n=()=>({baseFs:this.baseFs,libzip:this.libzip,readOnly:this.readOnlyArchives,stats:this.baseFs.statSync(t)});if(this.zipInstances){let s=this.zipInstances.get(t);return s||(s={zipFs:new Wr(t,n()),expiresAt:0,refCount:0}),this.zipInstances.delete(t),this.limitOpenFiles(this.maxOpenFiles-1),this.zipInstances.set(t,s),s.expiresAt=Date.now()+this.maxAge,i(s.zipFs)}else{let s=new Wr(t,n());try{return i(s)}finally{s.saveAndClose()}}}};var Pg=J(\"util\");var sI=J(\"url\"),CK=J(\"util\");var nI=class extends pi{constructor(t){super(K);this.baseFs=t}mapFromBase(t){return t}mapToBase(t){if(typeof t==\"string\")return t;if(t instanceof sI.URL)return(0,sI.fileURLToPath)(t);if(Buffer.isBuffer(t)){let i=t.toString();if(Buffer.byteLength(i)!==t.byteLength)throw new Error(\"Non-utf8 buffers are not supported at the moment. Please upvote the following issue if you encounter this error: https://github.com/yarnpkg/berry/issues/4942\");return i}throw new Error(`Unsupported path type: ${(0,CK.inspect)(t)}`)}};var mK=J(\"readline\"),Fi=Symbol(\"kBaseFs\"),wa=Symbol(\"kFd\"),DA=Symbol(\"kClosePromise\"),oI=Symbol(\"kCloseResolve\"),aI=Symbol(\"kCloseReject\"),xg=Symbol(\"kRefs\"),Ws=Symbol(\"kRef\"),zs=Symbol(\"kUnref\"),Vge,Xge,Zge,_ge,Jp=class{constructor(e,t){this[Vge]=1;this[Xge]=void 0;this[Zge]=void 0;this[_ge]=void 0;this[Fi]=t,this[wa]=e}get fd(){return this[wa]}async appendFile(e,t){var i;try{this[Ws](this.appendFile);let n=(i=typeof t==\"string\"?t:t==null?void 0:t.encoding)!=null?i:void 0;return await this[Fi].appendFilePromise(this.fd,e,n?{encoding:n}:void 0)}finally{this[zs]()}}async chown(e,t){try{return this[Ws](this.chown),await this[Fi].fchownPromise(this.fd,e,t)}finally{this[zs]()}}async chmod(e){try{return this[Ws](this.chmod),await this[Fi].fchmodPromise(this.fd,e)}finally{this[zs]()}}createReadStream(e){return this[Fi].createReadStream(null,{...e,fd:this.fd})}createWriteStream(e){return this[Fi].createWriteStream(null,{...e,fd:this.fd})}datasync(){throw new Error(\"Method not implemented.\")}sync(){throw new Error(\"Method not implemented.\")}async read(e,t,i,n){var s,o,a;try{this[Ws](this.read);let l;return Buffer.isBuffer(e)?l=e:(e!=null||(e={}),l=(s=e.buffer)!=null?s:Buffer.alloc(16384),t=e.offset||0,i=(o=e.length)!=null?o:l.byteLength,n=(a=e.position)!=null?a:null),t!=null||(t=0),i!=null||(i=0),i===0?{bytesRead:i,buffer:l}:{bytesRead:await this[Fi].readPromise(this.fd,l,t,i,n),buffer:l}}finally{this[zs]()}}async readFile(e){var t;try{this[Ws](this.readFile);let i=(t=typeof e==\"string\"?e:e==null?void 0:e.encoding)!=null?t:void 0;return await this[Fi].readFilePromise(this.fd,i)}finally{this[zs]()}}readLines(e){return(0,mK.createInterface)({input:this.createReadStream(e),crlfDelay:1/0})}async stat(e){try{return this[Ws](this.stat),await this[Fi].fstatPromise(this.fd,e)}finally{this[zs]()}}async truncate(e){try{return this[Ws](this.truncate),await this[Fi].ftruncatePromise(this.fd,e)}finally{this[zs]()}}utimes(e,t){throw new Error(\"Method not implemented.\")}async writeFile(e,t){var i;try{this[Ws](this.writeFile);let n=(i=typeof t==\"string\"?t:t==null?void 0:t.encoding)!=null?i:void 0;await this[Fi].writeFilePromise(this.fd,e,n)}finally{this[zs]()}}async write(...e){try{if(this[Ws](this.write),ArrayBuffer.isView(e[0])){let[t,i,n,s]=e;return{bytesWritten:await this[Fi].writePromise(this.fd,t,i!=null?i:void 0,n!=null?n:void 0,s!=null?s:void 0),buffer:t}}else{let[t,i,n]=e;return{bytesWritten:await this[Fi].writePromise(this.fd,t,i,n),buffer:t}}}finally{this[zs]()}}async writev(e,t){try{this[Ws](this.writev);let i=0;if(typeof t<\"u\")for(let n of e){let s=await this.write(n,void 0,void 0,t);i+=s.bytesWritten,t+=s.bytesWritten}else for(let n of e){let s=await this.write(n);i+=s.bytesWritten}return{buffers:e,bytesWritten:i}}finally{this[zs]()}}readv(e,t){throw new Error(\"Method not implemented.\")}close(){if(this[wa]===-1)return Promise.resolve();if(this[DA])return this[DA];if(this[xg]--,this[xg]===0){let e=this[wa];this[wa]=-1,this[DA]=this[Fi].closePromise(e).finally(()=>{this[DA]=void 0})}else this[DA]=new Promise((e,t)=>{this[oI]=e,this[aI]=t}).finally(()=>{this[DA]=void 0,this[aI]=void 0,this[oI]=void 0});return this[DA]}[(Fi,wa,Vge=xg,Xge=DA,Zge=oI,_ge=aI,Ws)](e){if(this[wa]===-1){let t=new Error(\"file closed\");throw t.code=\"EBADF\",t.syscall=e.name,t}this[xg]++}[zs](){if(this[xg]--,this[xg]===0){let e=this[wa];this[wa]=-1,this[Fi].closePromise(e).then(this[oI],this[aI])}}};var $ge=new Set([\"accessSync\",\"appendFileSync\",\"createReadStream\",\"createWriteStream\",\"chmodSync\",\"fchmodSync\",\"chownSync\",\"fchownSync\",\"closeSync\",\"copyFileSync\",\"linkSync\",\"lstatSync\",\"fstatSync\",\"lutimesSync\",\"mkdirSync\",\"openSync\",\"opendirSync\",\"readlinkSync\",\"readFileSync\",\"readdirSync\",\"readlinkSync\",\"realpathSync\",\"renameSync\",\"rmdirSync\",\"statSync\",\"symlinkSync\",\"truncateSync\",\"ftruncateSync\",\"unlinkSync\",\"unwatchFile\",\"utimesSync\",\"watch\",\"watchFile\",\"writeFileSync\",\"writeSync\"]),EK=new Set([\"accessPromise\",\"appendFilePromise\",\"fchmodPromise\",\"chmodPromise\",\"fchownPromise\",\"chownPromise\",\"closePromise\",\"copyFilePromise\",\"linkPromise\",\"fstatPromise\",\"lstatPromise\",\"lutimesPromise\",\"mkdirPromise\",\"openPromise\",\"opendirPromise\",\"readdirPromise\",\"realpathPromise\",\"readFilePromise\",\"readdirPromise\",\"readlinkPromise\",\"renamePromise\",\"rmdirPromise\",\"statPromise\",\"symlinkPromise\",\"truncatePromise\",\"ftruncatePromise\",\"unlinkPromise\",\"utimesPromise\",\"writeFilePromise\",\"writeSync\"]);function QS(r,e){e=new nI(e);let t=(i,n,s)=>{let o=i[n];i[n]=s,typeof(o==null?void 0:o[Pg.promisify.custom])<\"u\"&&(s[Pg.promisify.custom]=o[Pg.promisify.custom])};{t(r,\"exists\",(i,...n)=>{let o=typeof n[n.length-1]==\"function\"?n.pop():()=>{};process.nextTick(()=>{e.existsPromise(i).then(a=>{o(a)},()=>{o(!1)})})}),t(r,\"read\",(...i)=>{let[n,s,o,a,l,c]=i;if(i.length<=3){let u={};i.length<3?c=i[1]:(u=i[1],c=i[2]),{buffer:s=Buffer.alloc(16384),offset:o=0,length:a=s.byteLength,position:l}=u}if(o==null&&(o=0),a|=0,a===0){process.nextTick(()=>{c(null,0,s)});return}l==null&&(l=-1),process.nextTick(()=>{e.readPromise(n,s,o,a,l).then(u=>{c(null,u,s)},u=>{c(u,0,s)})})});for(let i of EK){let n=i.replace(/Promise$/,\"\");if(typeof r[n]>\"u\")continue;let s=e[i];if(typeof s>\"u\")continue;t(r,n,(...a)=>{let c=typeof a[a.length-1]==\"function\"?a.pop():()=>{};process.nextTick(()=>{s.apply(e,a).then(u=>{c(null,u)},u=>{c(u)})})})}r.realpath.native=r.realpath}{t(r,\"existsSync\",i=>{try{return e.existsSync(i)}catch{return!1}}),t(r,\"readSync\",(...i)=>{let[n,s,o,a,l]=i;return i.length<=3&&({offset:o=0,length:a=s.byteLength,position:l}=i[2]||{}),o==null&&(o=0),a|=0,a===0?0:(l==null&&(l=-1),e.readSync(n,s,o,a,l))});for(let i of $ge){let n=i;if(typeof r[n]>\"u\")continue;let s=e[i];typeof s>\"u\"||t(r,n,s.bind(e))}r.realpathSync.native=r.realpathSync}{let i=process.emitWarning;process.emitWarning=()=>{};let n;try{n=r.promises}finally{process.emitWarning=i}if(typeof n<\"u\"){for(let s of EK){let o=s.replace(/Promise$/,\"\");if(typeof n[o]>\"u\")continue;let a=e[s];typeof a>\"u\"||s!==\"open\"&&t(n,o,(l,...c)=>l instanceof Jp?l[o].apply(l,c):a.call(e,l,...c))}t(n,\"open\",async(...s)=>{let o=await e.openPromise(...s);return new Jp(o,e)})}}r.read[Pg.promisify.custom]=async(i,n,...s)=>({bytesRead:await e.readPromise(i,n,...s),buffer:n}),r.write[Pg.promisify.custom]=async(i,n,...s)=>({bytesWritten:await e.writePromise(i,n,...s),buffer:n})}function AI(r,e){let t=Object.create(r);return QS(t,e),t}var wK=Pe(J(\"os\"));function IK(r){let e=Math.ceil(Math.random()*4294967296).toString(16).padStart(8,\"0\");return`${r}${e}`}var Vs=new Set,bS=null;function yK(){if(bS)return bS;let r=K.toPortablePath(wK.default.tmpdir()),e=M.realpathSync(r);return process.once(\"exit\",()=>{M.rmtempSync()}),bS={tmpdir:r,realTmpdir:e}}var M=Object.assign(new $t,{detachTemp(r){Vs.delete(r)},mktempSync(r){let{tmpdir:e,realTmpdir:t}=yK();for(;;){let i=IK(\"xfs-\");try{this.mkdirSync(x.join(e,i))}catch(s){if(s.code===\"EEXIST\")continue;throw s}let n=x.join(t,i);if(Vs.add(n),typeof r>\"u\")return n;try{return r(n)}finally{if(Vs.has(n)){Vs.delete(n);try{this.removeSync(n)}catch{}}}}},async mktempPromise(r){let{tmpdir:e,realTmpdir:t}=yK();for(;;){let i=IK(\"xfs-\");try{await this.mkdirPromise(x.join(e,i))}catch(s){if(s.code===\"EEXIST\")continue;throw s}let n=x.join(t,i);if(Vs.add(n),typeof r>\"u\")return n;try{return await r(n)}finally{if(Vs.has(n)){Vs.delete(n);try{await this.removePromise(n)}catch{}}}}},async rmtempPromise(){await Promise.all(Array.from(Vs.values()).map(async r=>{try{await M.removePromise(r,{maxRetries:0}),Vs.delete(r)}catch{}}))},rmtempSync(){for(let r of Vs)try{M.removeSync(r),Vs.delete(r)}catch{}}});var fk=Pe(TS());var td={};ut(td,{parseResolution:()=>hI,parseShell:()=>uI,parseSyml:()=>yi,stringifyArgument:()=>KS,stringifyArgumentSegment:()=>US,stringifyArithmeticExpression:()=>fI,stringifyCommand:()=>MS,stringifyCommandChain:()=>Fg,stringifyCommandChainThen:()=>OS,stringifyCommandLine:()=>gI,stringifyCommandLineThen:()=>LS,stringifyEnvSegment:()=>cI,stringifyRedirectArgument:()=>zp,stringifyResolution:()=>pI,stringifyShell:()=>Rg,stringifyShellLine:()=>Rg,stringifySyml:()=>Qa,stringifyValueArgument:()=>_l});var gU=Pe(uU());function uI(r,e={isGlobPattern:()=>!1}){try{return(0,gU.parse)(r,e)}catch(t){throw t.location&&(t.message=t.message.replace(/(\\.)?$/,` (line ${t.location.start.line}, column ${t.location.start.column})$1`)),t}}function Rg(r,{endSemicolon:e=!1}={}){return r.map(({command:t,type:i},n)=>`${gI(t)}${i===\";\"?n!==r.length-1||e?\";\":\"\":\" &\"}`).join(\" \")}function gI(r){return`${Fg(r.chain)}${r.then?` ${LS(r.then)}`:\"\"}`}function LS(r){return`${r.type} ${gI(r.line)}`}function Fg(r){return`${MS(r)}${r.then?` ${OS(r.then)}`:\"\"}`}function OS(r){return`${r.type} ${Fg(r.chain)}`}function MS(r){switch(r.type){case\"command\":return`${r.envs.length>0?`${r.envs.map(e=>cI(e)).join(\" \")} `:\"\"}${r.args.map(e=>KS(e)).join(\" \")}`;case\"subshell\":return`(${Rg(r.subshell)})${r.args.length>0?` ${r.args.map(e=>zp(e)).join(\" \")}`:\"\"}`;case\"group\":return`{ ${Rg(r.group,{endSemicolon:!0})} }${r.args.length>0?` ${r.args.map(e=>zp(e)).join(\" \")}`:\"\"}`;case\"envs\":return r.envs.map(e=>cI(e)).join(\" \");default:throw new Error(`Unsupported command type:  \"${r.type}\"`)}}function cI(r){return`${r.name}=${r.args[0]?_l(r.args[0]):\"\"}`}function KS(r){switch(r.type){case\"redirection\":return zp(r);case\"argument\":return _l(r);default:throw new Error(`Unsupported argument type: \"${r.type}\"`)}}function zp(r){return`${r.subtype} ${r.args.map(e=>_l(e)).join(\" \")}`}function _l(r){return r.segments.map(e=>US(e)).join(\"\")}function US(r){let e=(i,n)=>n?`\"${i}\"`:i,t=i=>i===\"\"?'\"\"':i.match(/[(){}<>$|&; \\t\"']/)?`$'${i.replace(/\\\\/g,\"\\\\\\\\\").replace(/'/g,\"\\\\'\").replace(/\\f/g,\"\\\\f\").replace(/\\n/g,\"\\\\n\").replace(/\\r/g,\"\\\\r\").replace(/\\t/g,\"\\\\t\").replace(/\\v/g,\"\\\\v\").replace(/\\0/g,\"\\\\0\")}'`:i;switch(r.type){case\"text\":return t(r.text);case\"glob\":return r.pattern;case\"shell\":return e(`\\${${Rg(r.shell)}}`,r.quoted);case\"variable\":return e(typeof r.defaultValue>\"u\"?typeof r.alternativeValue>\"u\"?`\\${${r.name}}`:r.alternativeValue.length===0?`\\${${r.name}:+}`:`\\${${r.name}:+${r.alternativeValue.map(i=>_l(i)).join(\" \")}}`:r.defaultValue.length===0?`\\${${r.name}:-}`:`\\${${r.name}:-${r.defaultValue.map(i=>_l(i)).join(\" \")}}`,r.quoted);case\"arithmetic\":return`$(( ${fI(r.arithmetic)} ))`;default:throw new Error(`Unsupported argument segment type: \"${r.type}\"`)}}function fI(r){let e=n=>{switch(n){case\"addition\":return\"+\";case\"subtraction\":return\"-\";case\"multiplication\":return\"*\";case\"division\":return\"/\";default:throw new Error(`Can't extract operator from arithmetic expression of type \"${n}\"`)}},t=(n,s)=>s?`( ${n} )`:n,i=n=>t(fI(n),![\"number\",\"variable\"].includes(n.type));switch(r.type){case\"number\":return String(r.value);case\"variable\":return r.name;default:return`${i(r.left)} ${e(r.type)} ${i(r.right)}`}}var pU=Pe(hU());function hI(r){let e=r.match(/^\\*{1,2}\\/(.*)/);if(e)throw new Error(`The override for '${r}' includes a glob pattern. Glob patterns have been removed since their behaviours don't match what you'd expect. Set the override to '${e[1]}' instead.`);try{return(0,pU.parse)(r)}catch(t){throw t.location&&(t.message=t.message.replace(/(\\.)?$/,` (line ${t.location.start.line}, column ${t.location.start.column})$1`)),t}}function pI(r){let e=\"\";return r.from&&(e+=r.from.fullName,r.from.description&&(e+=`@${r.from.description}`),e+=\"/\"),e+=r.descriptor.fullName,r.descriptor.description&&(e+=`@${r.descriptor.description}`),e}var vI=Pe(sH()),cH=Pe(aH()),Ade=/^(?![-?:,\\][{}#&*!|>'\"%@` \\t\\r\\n]).([ \\t]*(?![,\\][{}:# \\t\\r\\n]).)*$/,AH=[\"__metadata\",\"version\",\"resolution\",\"dependencies\",\"peerDependencies\",\"dependenciesMeta\",\"peerDependenciesMeta\",\"binaries\"],SI=class{constructor(e){this.data=e}};function lH(r){return r.match(Ade)?r:JSON.stringify(r)}function uH(r){return typeof r>\"u\"?!0:typeof r==\"object\"&&r!==null?Object.keys(r).every(e=>uH(r[e])):!1}function $S(r,e,t){if(r===null)return`null\n`;if(typeof r==\"number\"||typeof r==\"boolean\")return`${r.toString()}\n`;if(typeof r==\"string\")return`${lH(r)}\n`;if(Array.isArray(r)){if(r.length===0)return`[]\n`;let i=\"  \".repeat(e);return`\n${r.map(s=>`${i}- ${$S(s,e+1,!1)}`).join(\"\")}`}if(typeof r==\"object\"&&r){let i,n;r instanceof SI?(i=r.data,n=!1):(i=r,n=!0);let s=\"  \".repeat(e),o=Object.keys(i);n&&o.sort((l,c)=>{let u=AH.indexOf(l),g=AH.indexOf(c);return u===-1&&g===-1?l<c?-1:l>c?1:0:u!==-1&&g===-1?-1:u===-1&&g!==-1?1:u-g});let a=o.filter(l=>!uH(i[l])).map((l,c)=>{let u=i[l],g=lH(l),f=$S(u,e+1,!0),h=c>0||t?s:\"\",p=g.length>1024?`? ${g}\n${h}:`:`${g}:`,C=f.startsWith(`\n`)?f:` ${f}`;return`${h}${p}${C}`}).join(e===0?`\n`:\"\")||`\n`;return t?`\n${a}`:`${a}`}throw new Error(`Unsupported value type (${r})`)}function Qa(r){try{let e=$S(r,0,!1);return e!==`\n`?e:\"\"}catch(e){throw e.location&&(e.message=e.message.replace(/(\\.)?$/,` (line ${e.location.start.line}, column ${e.location.start.column})$1`)),e}}Qa.PreserveOrdering=SI;function lde(r){return r.endsWith(`\n`)||(r+=`\n`),(0,cH.parse)(r)}var cde=/^(#.*(\\r?\\n))*?#\\s+yarn\\s+lockfile\\s+v1\\r?\\n/i;function ude(r){if(cde.test(r))return lde(r);let e=(0,vI.safeLoad)(r,{schema:vI.FAILSAFE_SCHEMA,json:!0});if(e==null)return{};if(typeof e!=\"object\")throw new Error(`Expected an indexed object, got a ${typeof e} instead. Does your file follow Yaml's rules?`);if(Array.isArray(e))throw new Error(\"Expected an indexed object, got an array instead. Does your file follow Yaml's rules?\");return e}function yi(r){return ude(r)}var dz=Pe(fH()),Kw=Pe(Ac());var ud={};ut(ud,{Builtins:()=>hv,Cli:()=>Gn,Command:()=>ve,Option:()=>z,UsageError:()=>be,formatMarkdownish:()=>Ti});var tv=\"\u0001\",wi=\"\\0\";var rv=/^(-h|--help)(?:=([0-9]+))?$/,xI=/^(--[a-z]+(?:-[a-z]+)*|-[a-zA-Z]+)$/,CH=/^-[a-zA-Z]{2,}$/,iv=/^([^=]+)=([\\s\\S]*)$/,nv=process.env.DEBUG_CLI===\"1\";var be=class extends Error{constructor(e){super(e),this.clipanion={type:\"usage\"},this.name=\"UsageError\"}},Hg=class extends Error{constructor(e,t){if(super(),this.input=e,this.candidates=t,this.clipanion={type:\"none\"},this.name=\"UnknownSyntaxError\",this.candidates.length===0)this.message=\"Command not found, but we're not sure what's the alternative.\";else if(this.candidates.every(i=>i.reason!==null&&i.reason===t[0].reason)){let[{reason:i}]=this.candidates;this.message=`${i}\n\n${this.candidates.map(({usage:n})=>`$ ${n}`).join(`\n`)}`}else if(this.candidates.length===1){let[{usage:i}]=this.candidates;this.message=`Command not found; did you mean:\n\n$ ${i}\n${sv(e)}`}else this.message=`Command not found; did you mean one of:\n\n${this.candidates.map(({usage:i},n)=>`${`${n}.`.padStart(4)} ${i}`).join(`\n`)}\n\n${sv(e)}`}},PI=class extends Error{constructor(e,t){super(),this.input=e,this.usages=t,this.clipanion={type:\"none\"},this.name=\"AmbiguousSyntaxError\",this.message=`Cannot find which to pick amongst the following alternatives:\n\n${this.usages.map((i,n)=>`${`${n}.`.padStart(4)} ${i}`).join(`\n`)}\n\n${sv(e)}`}},sv=r=>`While running ${r.filter(e=>e!==wi).map(e=>{let t=JSON.stringify(e);return e.match(/\\s/)||e.length===0||t!==`\"${e}\"`?t:e}).join(\" \")}`;var rd=Symbol(\"clipanion/isOption\");function Xi(r){return{...r,[rd]:!0}}function Po(r,e){return typeof r>\"u\"?[r,e]:typeof r==\"object\"&&r!==null&&!Array.isArray(r)?[void 0,r]:[r,e]}function DI(r,e=!1){let t=r.replace(/^\\.: /,\"\");return e&&(t=t[0].toLowerCase()+t.slice(1)),t}function id(r,e){return e.length===1?new be(`${r}: ${DI(e[0],!0)}`):new be(`${r}:\n${e.map(t=>`\n- ${DI(t)}`).join(\"\")}`)}function nd(r,e,t){if(typeof t>\"u\")return e;let i=[],n=[],s=a=>{let l=e;return e=a,s.bind(null,l)};if(!t(e,{errors:i,coercions:n,coercion:s}))throw id(`Invalid value for ${r}`,i);for(let[,a]of n)a();return e}var ve=class{constructor(){this.help=!1}static Usage(e){return e}async catch(e){throw e}async validateAndExecute(){let t=this.constructor.schema;if(Array.isArray(t)){let{isDict:n,isUnknown:s,applyCascade:o}=await Promise.resolve().then(()=>(ls(),hn)),a=o(n(s()),t),l=[],c=[];if(!a(this,{errors:l,coercions:c}))throw id(\"Invalid option schema\",l);for(let[,g]of c)g()}else if(t!=null)throw new Error(\"Invalid command schema\");let i=await this.execute();return typeof i<\"u\"?i:0}};ve.isOption=rd;ve.Default=[];var Av=Array(80).fill(\"\\u2501\");for(let r=0;r<=24;++r)Av[Av.length-r]=`\\x1B[38;5;${232+r}m\\u2501`;var lv={header:r=>`\\x1B[1m\\u2501\\u2501\\u2501 ${r}${r.length<80-5?` ${Av.slice(r.length+5).join(\"\")}`:\":\"}\\x1B[0m`,bold:r=>`\\x1B[1m${r}\\x1B[22m`,error:r=>`\\x1B[31m\\x1B[1m${r}\\x1B[22m\\x1B[39m`,code:r=>`\\x1B[36m${r}\\x1B[39m`},vH={header:r=>r,bold:r=>r,error:r=>r,code:r=>r};function zde(r){let e=r.split(`\n`),t=e.filter(n=>n.match(/\\S/)),i=t.length>0?t.reduce((n,s)=>Math.min(n,s.length-s.trimStart().length),Number.MAX_VALUE):0;return e.map(n=>n.slice(i).trimRight()).join(`\n`)}function Ti(r,{format:e,paragraphs:t}){return r=r.replace(/\\r\\n?/g,`\n`),r=zde(r),r=r.replace(/^\\n+|\\n+$/g,\"\"),r=r.replace(/^(\\s*)-([^\\n]*?)\\n+/gm,`$1-$2\n\n`),r=r.replace(/\\n(\\n)?\\n*/g,\"$1\"),t&&(r=r.split(/\\n/).map(i=>{let n=i.match(/^\\s*[*-][\\t ]+(.*)/);if(!n)return i.match(/(.{1,80})(?: |$)/g).join(`\n`);let s=i.length-i.trimStart().length;return n[1].match(new RegExp(`(.{1,${78-s}})(?: |$)`,\"g\")).map((o,a)=>\" \".repeat(s)+(a===0?\"- \":\"  \")+o).join(`\n`)}).join(`\n\n`)),r=r.replace(/(`+)((?:.|[\\n])*?)\\1/g,(i,n,s)=>e.code(n+s+n)),r=r.replace(/(\\*\\*)((?:.|[\\n])*?)\\1/g,(i,n,s)=>e.bold(n+s+n)),r?`${r}\n`:\"\"}var fv=Pe(J(\"tty\"),1);function pn(r){nv&&console.log(r)}var xH={candidateUsage:null,requiredOptions:[],errorMessage:null,ignoreOptions:!1,path:[],positionals:[],options:[],remainder:null,selectedIndex:-1};function PH(){return{nodes:[_i(),_i(),_i()]}}function Vde(r){let e=PH(),t=[],i=e.nodes.length;for(let n of r){t.push(i);for(let s=0;s<n.nodes.length;++s)RH(s)||e.nodes.push(nCe(n.nodes[s],i));i+=n.nodes.length-2}for(let n of t)Gg(e,0,n);return e}function Xs(r,e){return r.nodes.push(e),r.nodes.length-1}function Xde(r){let e=new Set,t=i=>{if(e.has(i))return;e.add(i);let n=r.nodes[i];for(let o of Object.values(n.statics))for(let{to:a}of o)t(a);for(let[,{to:o}]of n.dynamics)t(o);for(let{to:o}of n.shortcuts)t(o);let s=new Set(n.shortcuts.map(({to:o})=>o));for(;n.shortcuts.length>0;){let{to:o}=n.shortcuts.shift(),a=r.nodes[o];for(let[l,c]of Object.entries(a.statics)){let u=Object.prototype.hasOwnProperty.call(n.statics,l)?n.statics[l]:n.statics[l]=[];for(let g of c)u.some(({to:f})=>g.to===f)||u.push(g)}for(let[l,c]of a.dynamics)n.dynamics.some(([u,{to:g}])=>l===u&&c.to===g)||n.dynamics.push([l,c]);for(let l of a.shortcuts)s.has(l.to)||(n.shortcuts.push(l),s.add(l.to))}};t(0)}function Zde(r,{prefix:e=\"\"}={}){if(nv){pn(`${e}Nodes are:`);for(let t=0;t<r.nodes.length;++t)pn(`${e}  ${t}: ${JSON.stringify(r.nodes[t])}`)}}function DH(r,e,t=!1){pn(`Running a vm on ${JSON.stringify(e)}`);let i=[{node:0,state:{candidateUsage:null,requiredOptions:[],errorMessage:null,ignoreOptions:!1,options:[],path:[],positionals:[],remainder:null,selectedIndex:null}}];Zde(r,{prefix:\"  \"});let n=[tv,...e];for(let s=0;s<n.length;++s){let o=n[s];pn(`  Processing ${JSON.stringify(o)}`);let a=[];for(let{node:l,state:c}of i){pn(`    Current node is ${l}`);let u=r.nodes[l];if(l===2){a.push({node:l,state:c});continue}console.assert(u.shortcuts.length===0,\"Shortcuts should have been eliminated by now\");let g=Object.prototype.hasOwnProperty.call(u.statics,o);if(!t||s<n.length-1||g)if(g){let f=u.statics[o];for(let{to:h,reducer:p}of f)a.push({node:h,state:typeof p<\"u\"?RI(uv,p,c,o):c}),pn(`      Static transition to ${h} found`)}else pn(\"      No static transition found\");else{let f=!1;for(let h of Object.keys(u.statics))if(!!h.startsWith(o)){if(o===h)for(let{to:p,reducer:C}of u.statics[h])a.push({node:p,state:typeof C<\"u\"?RI(uv,C,c,o):c}),pn(`      Static transition to ${p} found`);else for(let{to:p}of u.statics[h])a.push({node:p,state:{...c,remainder:h.slice(o.length)}}),pn(`      Static transition to ${p} found (partial match)`);f=!0}f||pn(\"      No partial static transition found\")}if(o!==wi)for(let[f,{to:h,reducer:p}]of u.dynamics)RI(NI,f,c,o)&&(a.push({node:h,state:typeof p<\"u\"?RI(uv,p,c,o):c}),pn(`      Dynamic transition to ${h} found (via ${f})`))}if(a.length===0&&o===wi&&e.length===1)return[{node:0,state:xH}];if(a.length===0)throw new Hg(e,i.filter(({node:l})=>l!==2).map(({state:l})=>({usage:l.candidateUsage,reason:null})));if(a.every(({node:l})=>l===2))throw new Hg(e,a.map(({state:l})=>({usage:l.candidateUsage,reason:l.errorMessage})));i=tCe(a)}if(i.length>0){pn(\"  Results:\");for(let s of i)pn(`    - ${s.node} -> ${JSON.stringify(s.state)}`)}else pn(\"  No results\");return i}function _de(r,e){if(e.selectedIndex!==null)return!0;if(Object.prototype.hasOwnProperty.call(r.statics,wi)){for(let{to:t}of r.statics[wi])if(t===1)return!0}return!1}function $de(r,e,t){let i=t&&e.length>0?[\"\"]:[],n=DH(r,e,t),s=[],o=new Set,a=(l,c,u=!0)=>{let g=[c];for(;g.length>0;){let h=g;g=[];for(let p of h){let C=r.nodes[p],y=Object.keys(C.statics);for(let B of Object.keys(C.statics)){let v=y[0];for(let{to:D,reducer:T}of C.statics[v])T===\"pushPath\"&&(u||l.push(v),g.push(D))}}u=!1}let f=JSON.stringify(l);o.has(f)||(s.push(l),o.add(f))};for(let{node:l,state:c}of n){if(c.remainder!==null){a([c.remainder],l);continue}let u=r.nodes[l],g=_de(u,c);for(let[f,h]of Object.entries(u.statics))(g&&f!==wi||!f.startsWith(\"-\")&&h.some(({reducer:p})=>p===\"pushPath\"))&&a([...i,f],l);if(!!g)for(let[f,{to:h}]of u.dynamics){if(h===2)continue;let p=sCe(f,c);if(p!==null)for(let C of p)a([...i,C],l)}}return[...s].sort()}function eCe(r,e){let t=DH(r,[...e,wi]);return rCe(e,t.map(({state:i})=>i))}function tCe(r){let e=0;for(let{state:t}of r)t.path.length>e&&(e=t.path.length);return r.filter(({state:t})=>t.path.length===e)}function rCe(r,e){let t=e.filter(g=>g.selectedIndex!==null);if(t.length===0)throw new Error;let i=t.filter(g=>g.requiredOptions.every(f=>f.some(h=>g.options.find(p=>p.name===h))));if(i.length===0)throw new Hg(r,t.map(g=>({usage:g.candidateUsage,reason:null})));let n=0;for(let g of i)g.path.length>n&&(n=g.path.length);let s=i.filter(g=>g.path.length===n),o=g=>g.positionals.filter(({extra:f})=>!f).length+g.options.length,a=s.map(g=>({state:g,positionalCount:o(g)})),l=0;for(let{positionalCount:g}of a)g>l&&(l=g);let c=a.filter(({positionalCount:g})=>g===l).map(({state:g})=>g),u=iCe(c);if(u.length>1)throw new PI(r,u.map(g=>g.candidateUsage));return u[0]}function iCe(r){let e=[],t=[];for(let i of r)i.selectedIndex===-1?t.push(i):e.push(i);return t.length>0&&e.push({...xH,path:kH(...t.map(i=>i.path)),options:t.reduce((i,n)=>i.concat(n.options),[])}),e}function kH(r,e,...t){return e===void 0?Array.from(r):kH(r.filter((i,n)=>i===e[n]),...t)}function _i(){return{dynamics:[],shortcuts:[],statics:{}}}function RH(r){return r===1||r===2}function cv(r,e=0){return{to:RH(r.to)?r.to:r.to>2?r.to+e-2:r.to+e,reducer:r.reducer}}function nCe(r,e=0){let t=_i();for(let[i,n]of r.dynamics)t.dynamics.push([i,cv(n,e)]);for(let i of r.shortcuts)t.shortcuts.push(cv(i,e));for(let[i,n]of Object.entries(r.statics))t.statics[i]=n.map(s=>cv(s,e));return t}function Bi(r,e,t,i,n){r.nodes[e].dynamics.push([t,{to:i,reducer:n}])}function Gg(r,e,t,i){r.nodes[e].shortcuts.push({to:t,reducer:i})}function ba(r,e,t,i,n){(Object.prototype.hasOwnProperty.call(r.nodes[e].statics,t)?r.nodes[e].statics[t]:r.nodes[e].statics[t]=[]).push({to:i,reducer:n})}function RI(r,e,t,i){if(Array.isArray(e)){let[n,...s]=e;return r[n](t,i,...s)}else return r[e](t,i)}function sCe(r,e){let t=Array.isArray(r)?NI[r[0]]:NI[r];if(typeof t.suggest>\"u\")return null;let i=Array.isArray(r)?r.slice(1):[];return t.suggest(e,...i)}var NI={always:()=>!0,isOptionLike:(r,e)=>!r.ignoreOptions&&e!==\"-\"&&e.startsWith(\"-\"),isNotOptionLike:(r,e)=>r.ignoreOptions||e===\"-\"||!e.startsWith(\"-\"),isOption:(r,e,t,i)=>!r.ignoreOptions&&e===t,isBatchOption:(r,e,t)=>!r.ignoreOptions&&CH.test(e)&&[...e.slice(1)].every(i=>t.includes(`-${i}`)),isBoundOption:(r,e,t,i)=>{let n=e.match(iv);return!r.ignoreOptions&&!!n&&xI.test(n[1])&&t.includes(n[1])&&i.filter(s=>s.names.includes(n[1])).every(s=>s.allowBinding)},isNegatedOption:(r,e,t)=>!r.ignoreOptions&&e===`--no-${t.slice(2)}`,isHelp:(r,e)=>!r.ignoreOptions&&rv.test(e),isUnsupportedOption:(r,e,t)=>!r.ignoreOptions&&e.startsWith(\"-\")&&xI.test(e)&&!t.includes(e),isInvalidOption:(r,e)=>!r.ignoreOptions&&e.startsWith(\"-\")&&!xI.test(e)};NI.isOption.suggest=(r,e,t=!0)=>t?null:[e];var uv={setCandidateState:(r,e,t)=>({...r,...t}),setSelectedIndex:(r,e,t)=>({...r,selectedIndex:t}),pushBatch:(r,e)=>({...r,options:r.options.concat([...e.slice(1)].map(t=>({name:`-${t}`,value:!0})))}),pushBound:(r,e)=>{let[,t,i]=e.match(iv);return{...r,options:r.options.concat({name:t,value:i})}},pushPath:(r,e)=>({...r,path:r.path.concat(e)}),pushPositional:(r,e)=>({...r,positionals:r.positionals.concat({value:e,extra:!1})}),pushExtra:(r,e)=>({...r,positionals:r.positionals.concat({value:e,extra:!0})}),pushExtraNoLimits:(r,e)=>({...r,positionals:r.positionals.concat({value:e,extra:Hn})}),pushTrue:(r,e,t=e)=>({...r,options:r.options.concat({name:e,value:!0})}),pushFalse:(r,e,t=e)=>({...r,options:r.options.concat({name:t,value:!1})}),pushUndefined:(r,e)=>({...r,options:r.options.concat({name:e,value:void 0})}),pushStringValue:(r,e)=>{var t;let i={...r,options:[...r.options]},n=r.options[r.options.length-1];return n.value=((t=n.value)!==null&&t!==void 0?t:[]).concat([e]),i},setStringValue:(r,e)=>{let t={...r,options:[...r.options]},i=r.options[r.options.length-1];return i.value=e,t},inhibateOptions:r=>({...r,ignoreOptions:!0}),useHelp:(r,e,t)=>{let[,,i]=e.match(rv);return typeof i<\"u\"?{...r,options:[{name:\"-c\",value:String(t)},{name:\"-i\",value:i}]}:{...r,options:[{name:\"-c\",value:String(t)}]}},setError:(r,e,t)=>e===wi?{...r,errorMessage:`${t}.`}:{...r,errorMessage:`${t} (\"${e}\").`},setOptionArityError:(r,e)=>{let t=r.options[r.options.length-1];return{...r,errorMessage:`Not enough arguments to option ${t.name}.`}}},Hn=Symbol(),gv=class{constructor(e,t){this.allOptionNames=[],this.arity={leading:[],trailing:[],extra:[],proxy:!1},this.options=[],this.paths=[],this.cliIndex=e,this.cliOpts=t}addPath(e){this.paths.push(e)}setArity({leading:e=this.arity.leading,trailing:t=this.arity.trailing,extra:i=this.arity.extra,proxy:n=this.arity.proxy}){Object.assign(this.arity,{leading:e,trailing:t,extra:i,proxy:n})}addPositional({name:e=\"arg\",required:t=!0}={}){if(!t&&this.arity.extra===Hn)throw new Error(\"Optional parameters cannot be declared when using .rest() or .proxy()\");if(!t&&this.arity.trailing.length>0)throw new Error(\"Optional parameters cannot be declared after the required trailing positional arguments\");!t&&this.arity.extra!==Hn?this.arity.extra.push(e):this.arity.extra!==Hn&&this.arity.extra.length===0?this.arity.leading.push(e):this.arity.trailing.push(e)}addRest({name:e=\"arg\",required:t=0}={}){if(this.arity.extra===Hn)throw new Error(\"Infinite lists cannot be declared multiple times in the same command\");if(this.arity.trailing.length>0)throw new Error(\"Infinite lists cannot be declared after the required trailing positional arguments\");for(let i=0;i<t;++i)this.addPositional({name:e});this.arity.extra=Hn}addProxy({required:e=0}={}){this.addRest({required:e}),this.arity.proxy=!0}addOption({names:e,description:t,arity:i=0,hidden:n=!1,required:s=!1,allowBinding:o=!0}){if(!o&&i>1)throw new Error(\"The arity cannot be higher than 1 when the option only supports the --arg=value syntax\");if(!Number.isInteger(i))throw new Error(`The arity must be an integer, got ${i}`);if(i<0)throw new Error(`The arity must be positive, got ${i}`);this.allOptionNames.push(...e),this.options.push({names:e,description:t,arity:i,hidden:n,required:s,allowBinding:o})}setContext(e){this.context=e}usage({detailed:e=!0,inlineOptions:t=!0}={}){let i=[this.cliOpts.binaryName],n=[];if(this.paths.length>0&&i.push(...this.paths[0]),e){for(let{names:o,arity:a,hidden:l,description:c,required:u}of this.options){if(l)continue;let g=[];for(let h=0;h<a;++h)g.push(` #${h}`);let f=`${o.join(\",\")}${g.join(\"\")}`;!t&&c?n.push({definition:f,description:c,required:u}):i.push(u?`<${f}>`:`[${f}]`)}i.push(...this.arity.leading.map(o=>`<${o}>`)),this.arity.extra===Hn?i.push(\"...\"):i.push(...this.arity.extra.map(o=>`[${o}]`)),i.push(...this.arity.trailing.map(o=>`<${o}>`))}return{usage:i.join(\" \"),options:n}}compile(){if(typeof this.context>\"u\")throw new Error(\"Assertion failed: No context attached\");let e=PH(),t=0,i=this.usage().usage,n=this.options.filter(a=>a.required).map(a=>a.names);t=Xs(e,_i()),ba(e,0,tv,t,[\"setCandidateState\",{candidateUsage:i,requiredOptions:n}]);let s=this.arity.proxy?\"always\":\"isNotOptionLike\",o=this.paths.length>0?this.paths:[[]];for(let a of o){let l=t;if(a.length>0){let f=Xs(e,_i());Gg(e,l,f),this.registerOptions(e,f),l=f}for(let f=0;f<a.length;++f){let h=Xs(e,_i());ba(e,l,a[f],h,\"pushPath\"),l=h}if(this.arity.leading.length>0||!this.arity.proxy){let f=Xs(e,_i());Bi(e,l,\"isHelp\",f,[\"useHelp\",this.cliIndex]),ba(e,f,wi,1,[\"setSelectedIndex\",-1]),this.registerOptions(e,l)}this.arity.leading.length>0&&ba(e,l,wi,2,[\"setError\",\"Not enough positional arguments\"]);let c=l;for(let f=0;f<this.arity.leading.length;++f){let h=Xs(e,_i());this.arity.proxy||this.registerOptions(e,h),(this.arity.trailing.length>0||f+1!==this.arity.leading.length)&&ba(e,h,wi,2,[\"setError\",\"Not enough positional arguments\"]),Bi(e,c,\"isNotOptionLike\",h,\"pushPositional\"),c=h}let u=c;if(this.arity.extra===Hn||this.arity.extra.length>0){let f=Xs(e,_i());if(Gg(e,c,f),this.arity.extra===Hn){let h=Xs(e,_i());this.arity.proxy||this.registerOptions(e,h),Bi(e,c,s,h,\"pushExtraNoLimits\"),Bi(e,h,s,h,\"pushExtraNoLimits\"),Gg(e,h,f)}else for(let h=0;h<this.arity.extra.length;++h){let p=Xs(e,_i());this.arity.proxy||this.registerOptions(e,p),Bi(e,u,s,p,\"pushExtra\"),Gg(e,p,f),u=p}u=f}this.arity.trailing.length>0&&ba(e,u,wi,2,[\"setError\",\"Not enough positional arguments\"]);let g=u;for(let f=0;f<this.arity.trailing.length;++f){let h=Xs(e,_i());this.arity.proxy||this.registerOptions(e,h),f+1<this.arity.trailing.length&&ba(e,h,wi,2,[\"setError\",\"Not enough positional arguments\"]),Bi(e,g,\"isNotOptionLike\",h,\"pushPositional\"),g=h}Bi(e,g,s,2,[\"setError\",\"Extraneous positional argument\"]),ba(e,g,wi,1,[\"setSelectedIndex\",this.cliIndex])}return{machine:e,context:this.context}}registerOptions(e,t){Bi(e,t,[\"isOption\",\"--\"],t,\"inhibateOptions\"),Bi(e,t,[\"isBatchOption\",this.allOptionNames],t,\"pushBatch\"),Bi(e,t,[\"isBoundOption\",this.allOptionNames,this.options],t,\"pushBound\"),Bi(e,t,[\"isUnsupportedOption\",this.allOptionNames],2,[\"setError\",\"Unsupported option name\"]),Bi(e,t,[\"isInvalidOption\"],2,[\"setError\",\"Invalid option name\"]);for(let i of this.options){let n=i.names.reduce((s,o)=>o.length>s.length?o:s,\"\");if(i.arity===0)for(let s of i.names)Bi(e,t,[\"isOption\",s,i.hidden||s!==n],t,\"pushTrue\"),s.startsWith(\"--\")&&!s.startsWith(\"--no-\")&&Bi(e,t,[\"isNegatedOption\",s],t,[\"pushFalse\",s]);else{let s=Xs(e,_i());for(let o of i.names)Bi(e,t,[\"isOption\",o,i.hidden||o!==n],s,\"pushUndefined\");for(let o=0;o<i.arity;++o){let a=Xs(e,_i());ba(e,s,wi,2,\"setOptionArityError\"),Bi(e,s,\"isOptionLike\",2,\"setOptionArityError\");let l=i.arity===1?\"setStringValue\":\"pushStringValue\";Bi(e,s,\"isNotOptionLike\",a,l),s=a}Gg(e,s,t)}}}},jg=class{constructor({binaryName:e=\"...\"}={}){this.builders=[],this.opts={binaryName:e}}static build(e,t={}){return new jg(t).commands(e).compile()}getBuilderByIndex(e){if(!(e>=0&&e<this.builders.length))throw new Error(`Assertion failed: Out-of-bound command index (${e})`);return this.builders[e]}commands(e){for(let t of e)t(this.command());return this}command(){let e=new gv(this.builders.length,this.opts);return this.builders.push(e),e}compile(){let e=[],t=[];for(let n of this.builders){let{machine:s,context:o}=n.compile();e.push(s),t.push(o)}let i=Vde(e);return Xde(i),{machine:i,contexts:t,process:n=>eCe(i,n),suggest:(n,s)=>$de(i,n,s)}}};var qg=class extends ve{constructor(e){super(),this.contexts=e,this.commands=[]}static from(e,t){let i=new qg(t);i.path=e.path;for(let n of e.options)switch(n.name){case\"-c\":i.commands.push(Number(n.value));break;case\"-i\":i.index=Number(n.value);break}return i}async execute(){let e=this.commands;if(typeof this.index<\"u\"&&this.index>=0&&this.index<e.length&&(e=[e[this.index]]),e.length===0)this.context.stdout.write(this.cli.usage());else if(e.length===1)this.context.stdout.write(this.cli.usage(this.contexts[e[0]].commandClass,{detailed:!0}));else if(e.length>1){this.context.stdout.write(`Multiple commands match your selection:\n`),this.context.stdout.write(`\n`);let t=0;for(let i of this.commands)this.context.stdout.write(this.cli.usage(this.contexts[i].commandClass,{prefix:`${t++}. `.padStart(5)}));this.context.stdout.write(`\n`),this.context.stdout.write(`Run again with -h=<index> to see the longer details of any of those commands.\n`)}}};var FH=Symbol(\"clipanion/errorCommand\");function oCe(){return process.env.FORCE_COLOR===\"0\"?1:process.env.FORCE_COLOR===\"1\"||typeof process.stdout<\"u\"&&process.stdout.isTTY?8:1}var Gn=class{constructor({binaryLabel:e,binaryName:t=\"...\",binaryVersion:i,enableCapture:n=!1,enableColors:s}={}){this.registrations=new Map,this.builder=new jg({binaryName:t}),this.binaryLabel=e,this.binaryName=t,this.binaryVersion=i,this.enableCapture=n,this.enableColors=s}static from(e,t={}){let i=new Gn(t);for(let n of e)i.register(n);return i}register(e){var t;let i=new Map,n=new e;for(let l in n){let c=n[l];typeof c==\"object\"&&c!==null&&c[ve.isOption]&&i.set(l,c)}let s=this.builder.command(),o=s.cliIndex,a=(t=e.paths)!==null&&t!==void 0?t:n.paths;if(typeof a<\"u\")for(let l of a)s.addPath(l);this.registrations.set(e,{specs:i,builder:s,index:o});for(let[l,{definition:c}]of i.entries())c(s,l);s.setContext({commandClass:e})}process(e){let{contexts:t,process:i}=this.builder.compile(),n=i(e);switch(n.selectedIndex){case-1:return qg.from(n,t);default:{let{commandClass:s}=t[n.selectedIndex],o=this.registrations.get(s);if(typeof o>\"u\")throw new Error(\"Assertion failed: Expected the command class to have been registered.\");let a=new s;a.path=n.path;try{for(let[l,{transformer:c}]of o.specs.entries())a[l]=c(o.builder,l,n);return a}catch(l){throw l[FH]=a,l}}break}}async run(e,t){var i;let n,s={...Gn.defaultContext,...t},o=(i=this.enableColors)!==null&&i!==void 0?i:s.colorDepth>1;if(!Array.isArray(e))n=e;else try{n=this.process(e)}catch(c){return s.stdout.write(this.error(c,{colored:o})),1}if(n.help)return s.stdout.write(this.usage(n,{colored:o,detailed:!0})),0;n.context=s,n.cli={binaryLabel:this.binaryLabel,binaryName:this.binaryName,binaryVersion:this.binaryVersion,enableCapture:this.enableCapture,enableColors:this.enableColors,definitions:()=>this.definitions(),error:(c,u)=>this.error(c,u),format:c=>this.format(c),process:c=>this.process(c),run:(c,u)=>this.run(c,{...s,...u}),usage:(c,u)=>this.usage(c,u)};let a=this.enableCapture?aCe(s):TH,l;try{l=await a(()=>n.validateAndExecute().catch(c=>n.catch(c).then(()=>0)))}catch(c){return s.stdout.write(this.error(c,{colored:o,command:n})),1}return l}async runExit(e,t){process.exitCode=await this.run(e,t)}suggest(e,t){let{suggest:i}=this.builder.compile();return i(e,t)}definitions({colored:e=!1}={}){let t=[];for(let[i,{index:n}]of this.registrations){if(typeof i.usage>\"u\")continue;let{usage:s}=this.getUsageByIndex(n,{detailed:!1}),{usage:o,options:a}=this.getUsageByIndex(n,{detailed:!0,inlineOptions:!1}),l=typeof i.usage.category<\"u\"?Ti(i.usage.category,{format:this.format(e),paragraphs:!1}):void 0,c=typeof i.usage.description<\"u\"?Ti(i.usage.description,{format:this.format(e),paragraphs:!1}):void 0,u=typeof i.usage.details<\"u\"?Ti(i.usage.details,{format:this.format(e),paragraphs:!0}):void 0,g=typeof i.usage.examples<\"u\"?i.usage.examples.map(([f,h])=>[Ti(f,{format:this.format(e),paragraphs:!1}),h.replace(/\\$0/g,this.binaryName)]):void 0;t.push({path:s,usage:o,category:l,description:c,details:u,examples:g,options:a})}return t}usage(e=null,{colored:t,detailed:i=!1,prefix:n=\"$ \"}={}){var s;if(e===null){for(let l of this.registrations.keys()){let c=l.paths,u=typeof l.usage<\"u\";if(!c||c.length===0||c.length===1&&c[0].length===0||((s=c==null?void 0:c.some(h=>h.length===0))!==null&&s!==void 0?s:!1))if(e){e=null;break}else e=l;else if(u){e=null;continue}}e&&(i=!0)}let o=e!==null&&e instanceof ve?e.constructor:e,a=\"\";if(o)if(i){let{description:l=\"\",details:c=\"\",examples:u=[]}=o.usage||{};l!==\"\"&&(a+=Ti(l,{format:this.format(t),paragraphs:!1}).replace(/^./,h=>h.toUpperCase()),a+=`\n`),(c!==\"\"||u.length>0)&&(a+=`${this.format(t).header(\"Usage\")}\n`,a+=`\n`);let{usage:g,options:f}=this.getUsageByRegistration(o,{inlineOptions:!1});if(a+=`${this.format(t).bold(n)}${g}\n`,f.length>0){a+=`\n`,a+=`${lv.header(\"Options\")}\n`;let h=f.reduce((p,C)=>Math.max(p,C.definition.length),0);a+=`\n`;for(let{definition:p,description:C}of f)a+=`  ${this.format(t).bold(p.padEnd(h))}    ${Ti(C,{format:this.format(t),paragraphs:!1})}`}if(c!==\"\"&&(a+=`\n`,a+=`${this.format(t).header(\"Details\")}\n`,a+=`\n`,a+=Ti(c,{format:this.format(t),paragraphs:!0})),u.length>0){a+=`\n`,a+=`${this.format(t).header(\"Examples\")}\n`;for(let[h,p]of u)a+=`\n`,a+=Ti(h,{format:this.format(t),paragraphs:!1}),a+=`${p.replace(/^/m,`  ${this.format(t).bold(n)}`).replace(/\\$0/g,this.binaryName)}\n`}}else{let{usage:l}=this.getUsageByRegistration(o);a+=`${this.format(t).bold(n)}${l}\n`}else{let l=new Map;for(let[f,{index:h}]of this.registrations.entries()){if(typeof f.usage>\"u\")continue;let p=typeof f.usage.category<\"u\"?Ti(f.usage.category,{format:this.format(t),paragraphs:!1}):null,C=l.get(p);typeof C>\"u\"&&l.set(p,C=[]);let{usage:y}=this.getUsageByIndex(h);C.push({commandClass:f,usage:y})}let c=Array.from(l.keys()).sort((f,h)=>f===null?-1:h===null?1:f.localeCompare(h,\"en\",{usage:\"sort\",caseFirst:\"upper\"})),u=typeof this.binaryLabel<\"u\",g=typeof this.binaryVersion<\"u\";u||g?(u&&g?a+=`${this.format(t).header(`${this.binaryLabel} - ${this.binaryVersion}`)}\n\n`:u?a+=`${this.format(t).header(`${this.binaryLabel}`)}\n`:a+=`${this.format(t).header(`${this.binaryVersion}`)}\n`,a+=`  ${this.format(t).bold(n)}${this.binaryName} <command>\n`):a+=`${this.format(t).bold(n)}${this.binaryName} <command>\n`;for(let f of c){let h=l.get(f).slice().sort((C,y)=>C.usage.localeCompare(y.usage,\"en\",{usage:\"sort\",caseFirst:\"upper\"})),p=f!==null?f.trim():\"General commands\";a+=`\n`,a+=`${this.format(t).header(`${p}`)}\n`;for(let{commandClass:C,usage:y}of h){let B=C.usage.description||\"undocumented\";a+=`\n`,a+=`  ${this.format(t).bold(y)}\n`,a+=`    ${Ti(B,{format:this.format(t),paragraphs:!1})}`}}a+=`\n`,a+=Ti(\"You can also print more details about any of these commands by calling them with the `-h,--help` flag right after the command name.\",{format:this.format(t),paragraphs:!0})}return a}error(e,t){var i,{colored:n,command:s=(i=e[FH])!==null&&i!==void 0?i:null}=t===void 0?{}:t;e instanceof Error||(e=new Error(`Execution failed with a non-error rejection (rejected value: ${JSON.stringify(e)})`));let o=\"\",a=e.name.replace(/([a-z])([A-Z])/g,\"$1 $2\");a===\"Error\"&&(a=\"Internal Error\"),o+=`${this.format(n).error(a)}: ${e.message}\n`;let l=e.clipanion;return typeof l<\"u\"?l.type===\"usage\"&&(o+=`\n`,o+=this.usage(s)):e.stack&&(o+=`${e.stack.replace(/^.*\\n/,\"\")}\n`),o}format(e){var t;return((t=e!=null?e:this.enableColors)!==null&&t!==void 0?t:Gn.defaultContext.colorDepth>1)?lv:vH}getUsageByRegistration(e,t){let i=this.registrations.get(e);if(typeof i>\"u\")throw new Error(\"Assertion failed: Unregistered command\");return this.getUsageByIndex(i.index,t)}getUsageByIndex(e,t){return this.builder.getBuilderByIndex(e).usage(t)}};Gn.defaultContext={stdin:process.stdin,stdout:process.stdout,stderr:process.stderr,colorDepth:\"getColorDepth\"in fv.default.WriteStream.prototype?fv.default.WriteStream.prototype.getColorDepth():oCe()};var NH;function aCe(r){let e=NH;if(typeof e>\"u\"){if(r.stdout===process.stdout&&r.stderr===process.stderr)return TH;let{AsyncLocalStorage:t}=J(\"async_hooks\");e=NH=new t;let i=process.stdout._write;process.stdout._write=function(s,o,a){let l=e.getStore();return typeof l>\"u\"?i.call(this,s,o,a):l.stdout.write(s,o,a)};let n=process.stderr._write;process.stderr._write=function(s,o,a){let l=e.getStore();return typeof l>\"u\"?n.call(this,s,o,a):l.stderr.write(s,o,a)}}return t=>e.run(r,t)}function TH(r){return r()}var hv={};ut(hv,{DefinitionsCommand:()=>Ad,HelpCommand:()=>ld,VersionCommand:()=>cd});var Ad=class extends ve{async execute(){this.context.stdout.write(`${JSON.stringify(this.cli.definitions(),null,2)}\n`)}};Ad.paths=[[\"--clipanion=definitions\"]];var ld=class extends ve{async execute(){this.context.stdout.write(this.cli.usage())}};ld.paths=[[\"-h\"],[\"--help\"]];var cd=class extends ve{async execute(){var e;this.context.stdout.write(`${(e=this.cli.binaryVersion)!==null&&e!==void 0?e:\"<unknown>\"}\n`)}};cd.paths=[[\"-v\"],[\"--version\"]];var z={};ut(z,{Array:()=>LH,Boolean:()=>OH,Counter:()=>MH,Proxy:()=>KH,Rest:()=>UH,String:()=>HH,applyValidator:()=>nd,cleanValidationError:()=>DI,formatError:()=>id,isOptionSymbol:()=>rd,makeCommandOption:()=>Xi,rerouteArguments:()=>Po});function LH(r,e,t){let[i,n]=Po(e,t!=null?t:{}),{arity:s=1}=n,o=r.split(\",\"),a=new Set(o);return Xi({definition(l){l.addOption({names:o,arity:s,hidden:n==null?void 0:n.hidden,description:n==null?void 0:n.description,required:n.required})},transformer(l,c,u){let g=typeof i<\"u\"?[...i]:void 0;for(let{name:f,value:h}of u.options)!a.has(f)||(g=g!=null?g:[],g.push(h));return g}})}function OH(r,e,t){let[i,n]=Po(e,t!=null?t:{}),s=r.split(\",\"),o=new Set(s);return Xi({definition(a){a.addOption({names:s,allowBinding:!1,arity:0,hidden:n.hidden,description:n.description,required:n.required})},transformer(a,l,c){let u=i;for(let{name:g,value:f}of c.options)!o.has(g)||(u=f);return u}})}function MH(r,e,t){let[i,n]=Po(e,t!=null?t:{}),s=r.split(\",\"),o=new Set(s);return Xi({definition(a){a.addOption({names:s,allowBinding:!1,arity:0,hidden:n.hidden,description:n.description,required:n.required})},transformer(a,l,c){let u=i;for(let{name:g,value:f}of c.options)!o.has(g)||(u!=null||(u=0),f?u+=1:u=0);return u}})}function KH(r={}){return Xi({definition(e,t){var i;e.addProxy({name:(i=r.name)!==null&&i!==void 0?i:t,required:r.required})},transformer(e,t,i){return i.positionals.map(({value:n})=>n)}})}function UH(r={}){return Xi({definition(e,t){var i;e.addRest({name:(i=r.name)!==null&&i!==void 0?i:t,required:r.required})},transformer(e,t,i){let n=o=>{let a=i.positionals[o];return a.extra===Hn||a.extra===!1&&o<e.arity.leading.length},s=0;for(;s<i.positionals.length&&n(s);)s+=1;return i.positionals.splice(0,s).map(({value:o})=>o)}})}function ACe(r,e,t){let[i,n]=Po(e,t!=null?t:{}),{arity:s=1}=n,o=r.split(\",\"),a=new Set(o);return Xi({definition(l){l.addOption({names:o,arity:n.tolerateBoolean?0:s,hidden:n.hidden,description:n.description,required:n.required})},transformer(l,c,u){let g,f=i;for(let{name:h,value:p}of u.options)!a.has(h)||(g=h,f=p);return typeof f==\"string\"?nd(g!=null?g:c,f,n.validator):f}})}function lCe(r={}){let{required:e=!0}=r;return Xi({definition(t,i){var n;t.addPositional({name:(n=r.name)!==null&&n!==void 0?n:i,required:r.required})},transformer(t,i,n){var s;for(let o=0;o<n.positionals.length;++o){if(n.positionals[o].extra===Hn||e&&n.positionals[o].extra===!0||!e&&n.positionals[o].extra===!1)continue;let[a]=n.positionals.splice(o,1);return nd((s=r.name)!==null&&s!==void 0?s:i,a.value,r.validator)}}})}function HH(r,...e){return typeof r==\"string\"?ACe(r,...e):lCe(r)}var Cz=Pe(Jg()),nk=J(\"stream\");var Ct=(se=>(se[se.UNNAMED=0]=\"UNNAMED\",se[se.EXCEPTION=1]=\"EXCEPTION\",se[se.MISSING_PEER_DEPENDENCY=2]=\"MISSING_PEER_DEPENDENCY\",se[se.CYCLIC_DEPENDENCIES=3]=\"CYCLIC_DEPENDENCIES\",se[se.DISABLED_BUILD_SCRIPTS=4]=\"DISABLED_BUILD_SCRIPTS\",se[se.BUILD_DISABLED=5]=\"BUILD_DISABLED\",se[se.SOFT_LINK_BUILD=6]=\"SOFT_LINK_BUILD\",se[se.MUST_BUILD=7]=\"MUST_BUILD\",se[se.MUST_REBUILD=8]=\"MUST_REBUILD\",se[se.BUILD_FAILED=9]=\"BUILD_FAILED\",se[se.RESOLVER_NOT_FOUND=10]=\"RESOLVER_NOT_FOUND\",se[se.FETCHER_NOT_FOUND=11]=\"FETCHER_NOT_FOUND\",se[se.LINKER_NOT_FOUND=12]=\"LINKER_NOT_FOUND\",se[se.FETCH_NOT_CACHED=13]=\"FETCH_NOT_CACHED\",se[se.YARN_IMPORT_FAILED=14]=\"YARN_IMPORT_FAILED\",se[se.REMOTE_INVALID=15]=\"REMOTE_INVALID\",se[se.REMOTE_NOT_FOUND=16]=\"REMOTE_NOT_FOUND\",se[se.RESOLUTION_PACK=17]=\"RESOLUTION_PACK\",se[se.CACHE_CHECKSUM_MISMATCH=18]=\"CACHE_CHECKSUM_MISMATCH\",se[se.UNUSED_CACHE_ENTRY=19]=\"UNUSED_CACHE_ENTRY\",se[se.MISSING_LOCKFILE_ENTRY=20]=\"MISSING_LOCKFILE_ENTRY\",se[se.WORKSPACE_NOT_FOUND=21]=\"WORKSPACE_NOT_FOUND\",se[se.TOO_MANY_MATCHING_WORKSPACES=22]=\"TOO_MANY_MATCHING_WORKSPACES\",se[se.CONSTRAINTS_MISSING_DEPENDENCY=23]=\"CONSTRAINTS_MISSING_DEPENDENCY\",se[se.CONSTRAINTS_INCOMPATIBLE_DEPENDENCY=24]=\"CONSTRAINTS_INCOMPATIBLE_DEPENDENCY\",se[se.CONSTRAINTS_EXTRANEOUS_DEPENDENCY=25]=\"CONSTRAINTS_EXTRANEOUS_DEPENDENCY\",se[se.CONSTRAINTS_INVALID_DEPENDENCY=26]=\"CONSTRAINTS_INVALID_DEPENDENCY\",se[se.CANT_SUGGEST_RESOLUTIONS=27]=\"CANT_SUGGEST_RESOLUTIONS\",se[se.FROZEN_LOCKFILE_EXCEPTION=28]=\"FROZEN_LOCKFILE_EXCEPTION\",se[se.CROSS_DRIVE_VIRTUAL_LOCAL=29]=\"CROSS_DRIVE_VIRTUAL_LOCAL\",se[se.FETCH_FAILED=30]=\"FETCH_FAILED\",se[se.DANGEROUS_NODE_MODULES=31]=\"DANGEROUS_NODE_MODULES\",se[se.NODE_GYP_INJECTED=32]=\"NODE_GYP_INJECTED\",se[se.AUTHENTICATION_NOT_FOUND=33]=\"AUTHENTICATION_NOT_FOUND\",se[se.INVALID_CONFIGURATION_KEY=34]=\"INVALID_CONFIGURATION_KEY\",se[se.NETWORK_ERROR=35]=\"NETWORK_ERROR\",se[se.LIFECYCLE_SCRIPT=36]=\"LIFECYCLE_SCRIPT\",se[se.CONSTRAINTS_MISSING_FIELD=37]=\"CONSTRAINTS_MISSING_FIELD\",se[se.CONSTRAINTS_INCOMPATIBLE_FIELD=38]=\"CONSTRAINTS_INCOMPATIBLE_FIELD\",se[se.CONSTRAINTS_EXTRANEOUS_FIELD=39]=\"CONSTRAINTS_EXTRANEOUS_FIELD\",se[se.CONSTRAINTS_INVALID_FIELD=40]=\"CONSTRAINTS_INVALID_FIELD\",se[se.AUTHENTICATION_INVALID=41]=\"AUTHENTICATION_INVALID\",se[se.PROLOG_UNKNOWN_ERROR=42]=\"PROLOG_UNKNOWN_ERROR\",se[se.PROLOG_SYNTAX_ERROR=43]=\"PROLOG_SYNTAX_ERROR\",se[se.PROLOG_EXISTENCE_ERROR=44]=\"PROLOG_EXISTENCE_ERROR\",se[se.STACK_OVERFLOW_RESOLUTION=45]=\"STACK_OVERFLOW_RESOLUTION\",se[se.AUTOMERGE_FAILED_TO_PARSE=46]=\"AUTOMERGE_FAILED_TO_PARSE\",se[se.AUTOMERGE_IMMUTABLE=47]=\"AUTOMERGE_IMMUTABLE\",se[se.AUTOMERGE_SUCCESS=48]=\"AUTOMERGE_SUCCESS\",se[se.AUTOMERGE_REQUIRED=49]=\"AUTOMERGE_REQUIRED\",se[se.DEPRECATED_CLI_SETTINGS=50]=\"DEPRECATED_CLI_SETTINGS\",se[se.PLUGIN_NAME_NOT_FOUND=51]=\"PLUGIN_NAME_NOT_FOUND\",se[se.INVALID_PLUGIN_REFERENCE=52]=\"INVALID_PLUGIN_REFERENCE\",se[se.CONSTRAINTS_AMBIGUITY=53]=\"CONSTRAINTS_AMBIGUITY\",se[se.CACHE_OUTSIDE_PROJECT=54]=\"CACHE_OUTSIDE_PROJECT\",se[se.IMMUTABLE_INSTALL=55]=\"IMMUTABLE_INSTALL\",se[se.IMMUTABLE_CACHE=56]=\"IMMUTABLE_CACHE\",se[se.INVALID_MANIFEST=57]=\"INVALID_MANIFEST\",se[se.PACKAGE_PREPARATION_FAILED=58]=\"PACKAGE_PREPARATION_FAILED\",se[se.INVALID_RANGE_PEER_DEPENDENCY=59]=\"INVALID_RANGE_PEER_DEPENDENCY\",se[se.INCOMPATIBLE_PEER_DEPENDENCY=60]=\"INCOMPATIBLE_PEER_DEPENDENCY\",se[se.DEPRECATED_PACKAGE=61]=\"DEPRECATED_PACKAGE\",se[se.INCOMPATIBLE_OS=62]=\"INCOMPATIBLE_OS\",se[se.INCOMPATIBLE_CPU=63]=\"INCOMPATIBLE_CPU\",se[se.FROZEN_ARTIFACT_EXCEPTION=64]=\"FROZEN_ARTIFACT_EXCEPTION\",se[se.TELEMETRY_NOTICE=65]=\"TELEMETRY_NOTICE\",se[se.PATCH_HUNK_FAILED=66]=\"PATCH_HUNK_FAILED\",se[se.INVALID_CONFIGURATION_VALUE=67]=\"INVALID_CONFIGURATION_VALUE\",se[se.UNUSED_PACKAGE_EXTENSION=68]=\"UNUSED_PACKAGE_EXTENSION\",se[se.REDUNDANT_PACKAGE_EXTENSION=69]=\"REDUNDANT_PACKAGE_EXTENSION\",se[se.AUTO_NM_SUCCESS=70]=\"AUTO_NM_SUCCESS\",se[se.NM_CANT_INSTALL_EXTERNAL_SOFT_LINK=71]=\"NM_CANT_INSTALL_EXTERNAL_SOFT_LINK\",se[se.NM_PRESERVE_SYMLINKS_REQUIRED=72]=\"NM_PRESERVE_SYMLINKS_REQUIRED\",se[se.UPDATE_LOCKFILE_ONLY_SKIP_LINK=73]=\"UPDATE_LOCKFILE_ONLY_SKIP_LINK\",se[se.NM_HARDLINKS_MODE_DOWNGRADED=74]=\"NM_HARDLINKS_MODE_DOWNGRADED\",se[se.PROLOG_INSTANTIATION_ERROR=75]=\"PROLOG_INSTANTIATION_ERROR\",se[se.INCOMPATIBLE_ARCHITECTURE=76]=\"INCOMPATIBLE_ARCHITECTURE\",se[se.GHOST_ARCHITECTURE=77]=\"GHOST_ARCHITECTURE\",se[se.PROLOG_LIMIT_EXCEEDED=79]=\"PROLOG_LIMIT_EXCEEDED\",se))(Ct||{});function NA(r){return`YN${r.toString(10).padStart(4,\"0\")}`}function LI(r){let e=Number(r.slice(2));if(typeof Ct[e]>\"u\")throw new Error(`Unknown message name: \"${r}\"`);return e}var P={};ut(P,{areDescriptorsEqual:()=>Q8,areIdentsEqual:()=>sC,areLocatorsEqual:()=>oC,areVirtualPackagesEquivalent:()=>NSe,bindDescriptor:()=>RSe,bindLocator:()=>FSe,convertDescriptorToLocator:()=>Sw,convertLocatorToDescriptor:()=>HD,convertPackageToLocator:()=>kSe,convertToIdent:()=>DSe,convertToManifestRange:()=>OSe,copyPackage:()=>rC,devirtualizeDescriptor:()=>iC,devirtualizeLocator:()=>nC,getIdentVendorPath:()=>qD,isPackageCompatible:()=>kw,isVirtualDescriptor:()=>WA,isVirtualLocator:()=>jo,makeDescriptor:()=>_t,makeIdent:()=>qo,makeLocator:()=>nn,makeRange:()=>xw,parseDescriptor:()=>zA,parseFileStyleRange:()=>TSe,parseIdent:()=>tn,parseLocator:()=>Dc,parseRange:()=>vf,prettyDependent:()=>nP,prettyDescriptor:()=>tr,prettyIdent:()=>Ai,prettyLocator:()=>mt,prettyLocatorNoColors:()=>jD,prettyRange:()=>Dw,prettyReference:()=>AC,prettyResolution:()=>iP,prettyWorkspace:()=>lC,renamePackage:()=>tC,slugifyIdent:()=>UD,slugifyLocator:()=>xf,sortDescriptors:()=>Pf,stringifyDescriptor:()=>Sn,stringifyIdent:()=>Ot,stringifyLocator:()=>Es,tryParseDescriptor:()=>aC,tryParseIdent:()=>b8,tryParseLocator:()=>vw,virtualizeDescriptor:()=>GD,virtualizePackage:()=>YD});var Sf=Pe(J(\"querystring\")),y8=Pe(Xr()),w8=Pe(dJ());var ee={};ut(ee,{LogLevel:()=>Xy,Style:()=>_x,Type:()=>Ue,addLogFilterSupport:()=>Xd,applyColor:()=>bn,applyHyperlink:()=>If,applyStyle:()=>Vy,json:()=>Bc,jsonOrPretty:()=>g0e,mark:()=>rP,pretty:()=>$e,prettyField:()=>Ho,prettyList:()=>tP,supportsColor:()=>zy,supportsHyperlinks:()=>eP,tuple:()=>no});var Vd=Pe(wx()),zd=Pe(Ac());var f4=Pe(Bn()),h4=Pe(r4());var Ie={};ut(Ie,{AsyncActions:()=>Gx,BufferStream:()=>Hx,CachingStrategy:()=>u4,DefaultStream:()=>Yx,allSettledSafe:()=>io,assertNever:()=>qx,bufferStream:()=>Cf,buildIgnorePattern:()=>A0e,convertMapsToIndexableObjects:()=>Jy,dynamicRequire:()=>mf,escapeRegExp:()=>r0e,getArrayWithDefault:()=>hf,getFactoryWithDefault:()=>Ta,getMapWithDefault:()=>pf,getSetWithDefault:()=>wc,isIndexableObject:()=>Ux,isPathLike:()=>l0e,isTaggedYarnVersion:()=>t0e,mapAndFilter:()=>Uo,mapAndFind:()=>Jd,overrideType:()=>i0e,parseBoolean:()=>Wd,parseOptionalBoolean:()=>g4,prettifyAsyncErrors:()=>df,prettifySyncErrors:()=>Jx,releaseAfterUseAsync:()=>s0e,replaceEnvVariables:()=>Wx,sortMap:()=>Qn,tryParseOptionalBoolean:()=>zx,validateEnum:()=>n0e});var n4=Pe(Bn()),s4=Pe(Jg()),o4=Pe(Xr()),jx=J(\"stream\");function t0e(r){return!!(o4.default.valid(r)&&r.match(/^[^-]+(-rc\\.[0-9]+)?$/))}function r0e(r){return r.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}function i0e(r){}function qx(r){throw new Error(`Assertion failed: Unexpected object '${r}'`)}function n0e(r,e){let t=Object.values(r);if(!t.includes(e))throw new be(`Invalid value for enumeration: ${JSON.stringify(e)} (expected one of ${t.map(i=>JSON.stringify(i)).join(\", \")})`);return e}function Uo(r,e){let t=[];for(let i of r){let n=e(i);n!==a4&&t.push(n)}return t}var a4=Symbol();Uo.skip=a4;function Jd(r,e){for(let t of r){let i=e(t);if(i!==A4)return i}}var A4=Symbol();Jd.skip=A4;function Ux(r){return typeof r==\"object\"&&r!==null}async function io(r){let e=await Promise.allSettled(r),t=[];for(let i of e){if(i.status===\"rejected\")throw i.reason;t.push(i.value)}return t}function Jy(r){if(r instanceof Map&&(r=Object.fromEntries(r)),Ux(r))for(let e of Object.keys(r)){let t=r[e];Ux(t)&&(r[e]=Jy(t))}return r}function Ta(r,e,t){let i=r.get(e);return typeof i>\"u\"&&r.set(e,i=t()),i}function hf(r,e){let t=r.get(e);return typeof t>\"u\"&&r.set(e,t=[]),t}function wc(r,e){let t=r.get(e);return typeof t>\"u\"&&r.set(e,t=new Set),t}function pf(r,e){let t=r.get(e);return typeof t>\"u\"&&r.set(e,t=new Map),t}async function s0e(r,e){if(e==null)return await r();try{return await r()}finally{await e()}}async function df(r,e){try{return await r()}catch(t){throw t.message=e(t.message),t}}function Jx(r,e){try{return r()}catch(t){throw t.message=e(t.message),t}}async function Cf(r){return await new Promise((e,t)=>{let i=[];r.on(\"error\",n=>{t(n)}),r.on(\"data\",n=>{i.push(n)}),r.on(\"end\",()=>{e(Buffer.concat(i))})})}var Hx=class extends jx.Transform{constructor(){super(...arguments);this.chunks=[]}_transform(t,i,n){if(i!==\"buffer\"||!Buffer.isBuffer(t))throw new Error(\"Assertion failed: BufferStream only accept buffers\");this.chunks.push(t),n(null,null)}_flush(t){t(null,Buffer.concat(this.chunks))}};function o0e(){let r,e;return{promise:new Promise((i,n)=>{r=i,e=n}),resolve:r,reject:e}}var Gx=class{constructor(e){this.deferred=new Map;this.promises=new Map;this.limit=(0,s4.default)(e)}set(e,t){let i=this.deferred.get(e);typeof i>\"u\"&&this.deferred.set(e,i=o0e());let n=this.limit(()=>t());return this.promises.set(e,n),n.then(()=>{this.promises.get(e)===n&&i.resolve()},s=>{this.promises.get(e)===n&&i.reject(s)}),i.promise}reduce(e,t){var n;let i=(n=this.promises.get(e))!=null?n:Promise.resolve();this.set(e,()=>t(i))}async wait(){await Promise.all(this.promises.values())}},Yx=class extends jx.Transform{constructor(t=Buffer.alloc(0)){super();this.active=!0;this.ifEmpty=t}_transform(t,i,n){if(i!==\"buffer\"||!Buffer.isBuffer(t))throw new Error(\"Assertion failed: DefaultStream only accept buffers\");this.active=!1,n(null,t)}_flush(t){this.active&&this.ifEmpty.length>0?t(null,this.ifEmpty):t(null)}},qd=eval(\"require\");function l4(r){return qd(K.fromPortablePath(r))}function c4(path){let physicalPath=K.fromPortablePath(path),currentCacheEntry=qd.cache[physicalPath];delete qd.cache[physicalPath];let result;try{result=l4(physicalPath);let freshCacheEntry=qd.cache[physicalPath],dynamicModule=eval(\"module\"),freshCacheIndex=dynamicModule.children.indexOf(freshCacheEntry);freshCacheIndex!==-1&&dynamicModule.children.splice(freshCacheIndex,1)}finally{qd.cache[physicalPath]=currentCacheEntry}return result}var i4=new Map;function a0e(r){let e=i4.get(r),t=M.statSync(r);if((e==null?void 0:e.mtime)===t.mtimeMs)return e.instance;let i=c4(r);return i4.set(r,{mtime:t.mtimeMs,instance:i}),i}var u4=(i=>(i[i.NoCache=0]=\"NoCache\",i[i.FsTime=1]=\"FsTime\",i[i.Node=2]=\"Node\",i))(u4||{});function mf(r,{cachingStrategy:e=2}={}){switch(e){case 0:return c4(r);case 1:return a0e(r);case 2:return l4(r);default:throw new Error(\"Unsupported caching strategy\")}}function Qn(r,e){let t=Array.from(r);Array.isArray(e)||(e=[e]);let i=[];for(let s of e)i.push(t.map(o=>s(o)));let n=t.map((s,o)=>o);return n.sort((s,o)=>{for(let a of i){let l=a[s]<a[o]?-1:a[s]>a[o]?1:0;if(l!==0)return l}return 0}),n.map(s=>t[s])}function A0e(r){return r.length===0?null:r.map(e=>`(${n4.default.makeRe(e,{windows:!1,dot:!0}).source})`).join(\"|\")}function Wx(r,{env:e}){let t=/\\${(?<variableName>[\\d\\w_]+)(?<colon>:)?(?:-(?<fallback>[^}]*))?}/g;return r.replace(t,(...i)=>{let{variableName:n,colon:s,fallback:o}=i[i.length-1],a=Object.prototype.hasOwnProperty.call(e,n),l=e[n];if(l||a&&!s)return l;if(o!=null)return o;throw new be(`Environment variable not found (${n})`)})}function Wd(r){switch(r){case\"true\":case\"1\":case 1:case!0:return!0;case\"false\":case\"0\":case 0:case!1:return!1;default:throw new Error(`Couldn't parse \"${r}\" as a boolean`)}}function g4(r){return typeof r>\"u\"?r:Wd(r)}function zx(r){try{return g4(r)}catch{return null}}function l0e(r){return!!(K.isAbsolute(r)||r.match(/^(\\.{1,2}|~)\\//))}var Ef=(t=>(t.HARD=\"HARD\",t.SOFT=\"SOFT\",t))(Ef||{}),Vx=(i=>(i.Dependency=\"Dependency\",i.PeerDependency=\"PeerDependency\",i.PeerDependencyMeta=\"PeerDependencyMeta\",i))(Vx||{}),Xx=(i=>(i.Inactive=\"inactive\",i.Redundant=\"redundant\",i.Active=\"active\",i))(Xx||{});var Ue={NO_HINT:\"NO_HINT\",NULL:\"NULL\",SCOPE:\"SCOPE\",NAME:\"NAME\",RANGE:\"RANGE\",REFERENCE:\"REFERENCE\",NUMBER:\"NUMBER\",PATH:\"PATH\",URL:\"URL\",ADDED:\"ADDED\",REMOVED:\"REMOVED\",CODE:\"CODE\",DURATION:\"DURATION\",SIZE:\"SIZE\",IDENT:\"IDENT\",DESCRIPTOR:\"DESCRIPTOR\",LOCATOR:\"LOCATOR\",RESOLUTION:\"RESOLUTION\",DEPENDENT:\"DEPENDENT\",PACKAGE_EXTENSION:\"PACKAGE_EXTENSION\",SETTING:\"SETTING\",MARKDOWN:\"MARKDOWN\"},_x=(e=>(e[e.BOLD=2]=\"BOLD\",e))(_x||{}),$x=zd.default.GITHUB_ACTIONS?{level:2}:Vd.default.supportsColor?{level:Vd.default.supportsColor.level}:{level:0},zy=$x.level!==0,eP=zy&&!zd.default.GITHUB_ACTIONS&&!zd.default.CIRCLE&&!zd.default.GITLAB,Zx=new Vd.default.Instance($x),c0e=new Map([[Ue.NO_HINT,null],[Ue.NULL,[\"#a853b5\",129]],[Ue.SCOPE,[\"#d75f00\",166]],[Ue.NAME,[\"#d7875f\",173]],[Ue.RANGE,[\"#00afaf\",37]],[Ue.REFERENCE,[\"#87afff\",111]],[Ue.NUMBER,[\"#ffd700\",220]],[Ue.PATH,[\"#d75fd7\",170]],[Ue.URL,[\"#d75fd7\",170]],[Ue.ADDED,[\"#5faf00\",70]],[Ue.REMOVED,[\"#d70000\",160]],[Ue.CODE,[\"#87afff\",111]],[Ue.SIZE,[\"#ffd700\",220]]]),ms=r=>r,Wy={[Ue.NUMBER]:ms({pretty:(r,e)=>bn(r,`${e}`,Ue.NUMBER),json:r=>r}),[Ue.IDENT]:ms({pretty:(r,e)=>Ai(r,e),json:r=>Ot(r)}),[Ue.LOCATOR]:ms({pretty:(r,e)=>mt(r,e),json:r=>Es(r)}),[Ue.DESCRIPTOR]:ms({pretty:(r,e)=>tr(r,e),json:r=>Sn(r)}),[Ue.RESOLUTION]:ms({pretty:(r,{descriptor:e,locator:t})=>iP(r,e,t),json:({descriptor:r,locator:e})=>({descriptor:Sn(r),locator:e!==null?Es(e):null})}),[Ue.DEPENDENT]:ms({pretty:(r,{locator:e,descriptor:t})=>nP(r,e,t),json:({locator:r,descriptor:e})=>({locator:Es(r),descriptor:Sn(e)})}),[Ue.PACKAGE_EXTENSION]:ms({pretty:(r,e)=>{switch(e.type){case\"Dependency\":return`${Ai(r,e.parentDescriptor)} \\u27A4 ${bn(r,\"dependencies\",Ue.CODE)} \\u27A4 ${Ai(r,e.descriptor)}`;case\"PeerDependency\":return`${Ai(r,e.parentDescriptor)} \\u27A4 ${bn(r,\"peerDependencies\",Ue.CODE)} \\u27A4 ${Ai(r,e.descriptor)}`;case\"PeerDependencyMeta\":return`${Ai(r,e.parentDescriptor)} \\u27A4 ${bn(r,\"peerDependenciesMeta\",Ue.CODE)} \\u27A4 ${Ai(r,tn(e.selector))} \\u27A4 ${bn(r,e.key,Ue.CODE)}`;default:throw new Error(`Assertion failed: Unsupported package extension type: ${e.type}`)}},json:r=>{switch(r.type){case\"Dependency\":return`${Ot(r.parentDescriptor)} > ${Ot(r.descriptor)}`;case\"PeerDependency\":return`${Ot(r.parentDescriptor)} >> ${Ot(r.descriptor)}`;case\"PeerDependencyMeta\":return`${Ot(r.parentDescriptor)} >> ${r.selector} / ${r.key}`;default:throw new Error(`Assertion failed: Unsupported package extension type: ${r.type}`)}}}),[Ue.SETTING]:ms({pretty:(r,e)=>(r.get(e),If(r,bn(r,e,Ue.CODE),`https://yarnpkg.com/configuration/yarnrc#${e}`)),json:r=>r}),[Ue.DURATION]:ms({pretty:(r,e)=>{if(e>1e3*60){let t=Math.floor(e/1e3/60),i=Math.ceil((e-t*60*1e3)/1e3);return i===0?`${t}m`:`${t}m ${i}s`}else{let t=Math.floor(e/1e3),i=e-t*1e3;return i===0?`${t}s`:`${t}s ${i}ms`}},json:r=>r}),[Ue.SIZE]:ms({pretty:(r,e)=>{let t=[\"KB\",\"MB\",\"GB\",\"TB\"],i=t.length;for(;i>1&&e<1024**i;)i-=1;let n=1024**i,s=Math.floor(e*100/n)/100;return bn(r,`${s} ${t[i-1]}`,Ue.NUMBER)},json:r=>r}),[Ue.PATH]:ms({pretty:(r,e)=>bn(r,K.fromPortablePath(e),Ue.PATH),json:r=>K.fromPortablePath(r)}),[Ue.MARKDOWN]:ms({pretty:(r,{text:e,format:t,paragraphs:i})=>Ti(e,{format:t,paragraphs:i}),json:({text:r})=>r})};function no(r,e){return[e,r]}function Vy(r,e,t){return r.get(\"enableColors\")&&t&2&&(e=Vd.default.bold(e)),e}function bn(r,e,t){if(!r.get(\"enableColors\"))return e;let i=c0e.get(t);if(i===null)return e;let n=typeof i>\"u\"?t:$x.level>=3?i[0]:i[1],s=typeof n==\"number\"?Zx.ansi256(n):n.startsWith(\"#\")?Zx.hex(n):Zx[n];if(typeof s!=\"function\")throw new Error(`Invalid format type ${n}`);return s(e)}var u0e=!!process.env.KONSOLE_VERSION;function If(r,e,t){return r.get(\"enableHyperlinks\")?u0e?`\\x1B]8;;${t}\\x1B\\\\${e}\\x1B]8;;\\x1B\\\\`:`\\x1B]8;;${t}\\x07${e}\\x1B]8;;\\x07`:e}function $e(r,e,t){if(e===null)return bn(r,\"null\",Ue.NULL);if(Object.prototype.hasOwnProperty.call(Wy,t))return Wy[t].pretty(r,e);if(typeof e!=\"string\")throw new Error(`Assertion failed: Expected the value to be a string, got ${typeof e}`);return bn(r,e,t)}function tP(r,e,t,{separator:i=\", \"}={}){return[...e].map(n=>$e(r,n,t)).join(i)}function Bc(r,e){if(r===null)return null;if(Object.prototype.hasOwnProperty.call(Wy,e))return Wy[e].json(r);if(typeof r!=\"string\")throw new Error(`Assertion failed: Expected the value to be a string, got ${typeof r}`);return r}function g0e(r,e,[t,i]){return r?Bc(t,i):$e(e,t,i)}function rP(r){return{Check:bn(r,\"\\u2713\",\"green\"),Cross:bn(r,\"\\u2718\",\"red\"),Question:bn(r,\"?\",\"cyan\")}}function Ho(r,{label:e,value:[t,i]}){return`${$e(r,e,Ue.CODE)}: ${$e(r,t,i)}`}var Xy=(n=>(n.Error=\"error\",n.Warning=\"warning\",n.Info=\"info\",n.Discard=\"discard\",n))(Xy||{});function Xd(r,{configuration:e}){let t=e.get(\"logFilters\"),i=new Map,n=new Map,s=[];for(let g of t){let f=g.get(\"level\");if(typeof f>\"u\")continue;let h=g.get(\"code\");typeof h<\"u\"&&i.set(h,f);let p=g.get(\"text\");typeof p<\"u\"&&n.set(p,f);let C=g.get(\"pattern\");typeof C<\"u\"&&s.push([f4.default.matcher(C,{contains:!0}),f])}s.reverse();let o=(g,f,h)=>{if(g===null||g===0)return h;let p=n.size>0||s.length>0?(0,h4.default)(f):f;if(n.size>0){let C=n.get(p);if(typeof C<\"u\")return C!=null?C:h}if(s.length>0){for(let[C,y]of s)if(C(p))return y!=null?y:h}if(i.size>0){let C=i.get(NA(g));if(typeof C<\"u\")return C!=null?C:h}return h},a=r.reportInfo,l=r.reportWarning,c=r.reportError,u=function(g,f,h,p){switch(o(f,h,p)){case\"info\":a.call(g,f,h);break;case\"warning\":l.call(g,f!=null?f:0,h);break;case\"error\":c.call(g,f!=null?f:0,h);break}};r.reportInfo=function(...g){return u(this,...g,\"info\")},r.reportWarning=function(...g){return u(this,...g,\"warning\")},r.reportError=function(...g){return u(this,...g,\"error\")}}var li={};ut(li,{checksumFile:()=>Qw,checksumPattern:()=>bw,makeHash:()=>rn});var Bw=J(\"crypto\"),KD=Pe(MD());function rn(...r){let e=(0,Bw.createHash)(\"sha512\"),t=\"\";for(let i of r)typeof i==\"string\"?t+=i:i&&(t&&(e.update(t),t=\"\"),e.update(i));return t&&e.update(t),e.digest(\"hex\")}async function Qw(r,{baseFs:e,algorithm:t}={baseFs:M,algorithm:\"sha512\"}){let i=await e.openPromise(r,\"r\");try{let s=Buffer.allocUnsafeSlow(65536),o=(0,Bw.createHash)(t),a=0;for(;(a=await e.readPromise(i,s,0,65536))!==0;)o.update(a===65536?s:s.slice(0,a));return o.digest(\"hex\")}finally{await e.closePromise(i)}}async function bw(r,{cwd:e}){let i=(await(0,KD.default)(r,{cwd:K.fromPortablePath(e),expandDirectories:!1,onlyDirectories:!0,unique:!0})).map(a=>`${a}/**/*`),n=await(0,KD.default)([r,...i],{cwd:K.fromPortablePath(e),expandDirectories:!1,onlyFiles:!1,unique:!0});n.sort();let s=await Promise.all(n.map(async a=>{let l=[Buffer.from(a)],c=K.toPortablePath(a),u=await M.lstatPromise(c);return u.isSymbolicLink()?l.push(Buffer.from(await M.readlinkPromise(c))):u.isFile()&&l.push(await M.readFilePromise(c)),l.join(\"\\0\")})),o=(0,Bw.createHash)(\"sha512\");for(let a of s)o.update(a);return o.digest(\"hex\")}var eC=\"virtual:\",xSe=5,B8=/(os|cpu|libc)=([a-z0-9_-]+)/,PSe=(0,w8.makeParser)(B8);function qo(r,e){if(r!=null&&r.startsWith(\"@\"))throw new Error(\"Invalid scope: don't prefix it with '@'\");return{identHash:rn(r,e),scope:r,name:e}}function _t(r,e){return{identHash:r.identHash,scope:r.scope,name:r.name,descriptorHash:rn(r.identHash,e),range:e}}function nn(r,e){return{identHash:r.identHash,scope:r.scope,name:r.name,locatorHash:rn(r.identHash,e),reference:e}}function DSe(r){return{identHash:r.identHash,scope:r.scope,name:r.name}}function Sw(r){return{identHash:r.identHash,scope:r.scope,name:r.name,locatorHash:r.descriptorHash,reference:r.range}}function HD(r){return{identHash:r.identHash,scope:r.scope,name:r.name,descriptorHash:r.locatorHash,range:r.reference}}function kSe(r){return{identHash:r.identHash,scope:r.scope,name:r.name,locatorHash:r.locatorHash,reference:r.reference}}function tC(r,e){return{identHash:e.identHash,scope:e.scope,name:e.name,locatorHash:e.locatorHash,reference:e.reference,version:r.version,languageName:r.languageName,linkType:r.linkType,conditions:r.conditions,dependencies:new Map(r.dependencies),peerDependencies:new Map(r.peerDependencies),dependenciesMeta:new Map(r.dependenciesMeta),peerDependenciesMeta:new Map(r.peerDependenciesMeta),bin:new Map(r.bin)}}function rC(r){return tC(r,r)}function GD(r,e){if(e.includes(\"#\"))throw new Error(\"Invalid entropy\");return _t(r,`virtual:${e}#${r.range}`)}function YD(r,e){if(e.includes(\"#\"))throw new Error(\"Invalid entropy\");return tC(r,nn(r,`virtual:${e}#${r.reference}`))}function WA(r){return r.range.startsWith(eC)}function jo(r){return r.reference.startsWith(eC)}function iC(r){if(!WA(r))throw new Error(\"Not a virtual descriptor\");return _t(r,r.range.replace(/^[^#]*#/,\"\"))}function nC(r){if(!jo(r))throw new Error(\"Not a virtual descriptor\");return nn(r,r.reference.replace(/^[^#]*#/,\"\"))}function RSe(r,e){return r.range.includes(\"::\")?r:_t(r,`${r.range}::${Sf.default.stringify(e)}`)}function FSe(r,e){return r.reference.includes(\"::\")?r:nn(r,`${r.reference}::${Sf.default.stringify(e)}`)}function sC(r,e){return r.identHash===e.identHash}function Q8(r,e){return r.descriptorHash===e.descriptorHash}function oC(r,e){return r.locatorHash===e.locatorHash}function NSe(r,e){if(!jo(r))throw new Error(\"Invalid package type\");if(!jo(e))throw new Error(\"Invalid package type\");if(!sC(r,e)||r.dependencies.size!==e.dependencies.size)return!1;for(let t of r.dependencies.values()){let i=e.dependencies.get(t.identHash);if(!i||!Q8(t,i))return!1}return!0}function tn(r){let e=b8(r);if(!e)throw new Error(`Invalid ident (${r})`);return e}function b8(r){let e=r.match(/^(?:@([^/]+?)\\/)?([^/]+)$/);if(!e)return null;let[,t,i]=e;return qo(typeof t<\"u\"?t:null,i)}function zA(r,e=!1){let t=aC(r,e);if(!t)throw new Error(`Invalid descriptor (${r})`);return t}function aC(r,e=!1){let t=e?r.match(/^(?:@([^/]+?)\\/)?([^/]+?)(?:@(.+))$/):r.match(/^(?:@([^/]+?)\\/)?([^/]+?)(?:@(.+))?$/);if(!t)return null;let[,i,n,s]=t;if(s===\"unknown\")throw new Error(`Invalid range (${r})`);let o=typeof i<\"u\"?i:null,a=typeof s<\"u\"?s:\"unknown\";return _t(qo(o,n),a)}function Dc(r,e=!1){let t=vw(r,e);if(!t)throw new Error(`Invalid locator (${r})`);return t}function vw(r,e=!1){let t=e?r.match(/^(?:@([^/]+?)\\/)?([^/]+?)(?:@(.+))$/):r.match(/^(?:@([^/]+?)\\/)?([^/]+?)(?:@(.+))?$/);if(!t)return null;let[,i,n,s]=t;if(s===\"unknown\")throw new Error(`Invalid reference (${r})`);let o=typeof i<\"u\"?i:null,a=typeof s<\"u\"?s:\"unknown\";return nn(qo(o,n),a)}function vf(r,e){let t=r.match(/^([^#:]*:)?((?:(?!::)[^#])*)(?:#((?:(?!::).)*))?(?:::(.*))?$/);if(t===null)throw new Error(`Invalid range (${r})`);let i=typeof t[1]<\"u\"?t[1]:null;if(typeof(e==null?void 0:e.requireProtocol)==\"string\"&&i!==e.requireProtocol)throw new Error(`Invalid protocol (${i})`);if((e==null?void 0:e.requireProtocol)&&i===null)throw new Error(`Missing protocol (${i})`);let n=typeof t[3]<\"u\"?decodeURIComponent(t[2]):null;if((e==null?void 0:e.requireSource)&&n===null)throw new Error(`Missing source (${r})`);let s=typeof t[3]<\"u\"?decodeURIComponent(t[3]):decodeURIComponent(t[2]),o=e!=null&&e.parseSelector?Sf.default.parse(s):s,a=typeof t[4]<\"u\"?Sf.default.parse(t[4]):null;return{protocol:i,source:n,selector:o,params:a}}function TSe(r,{protocol:e}){let{selector:t,params:i}=vf(r,{requireProtocol:e,requireBindings:!0});if(typeof i.locator!=\"string\")throw new Error(`Assertion failed: Invalid bindings for ${r}`);return{parentLocator:Dc(i.locator,!0),path:t}}function I8(r){return r=r.replace(/%/g,\"%25\"),r=r.replace(/:/g,\"%3A\"),r=r.replace(/#/g,\"%23\"),r}function LSe(r){return r===null?!1:Object.entries(r).length>0}function xw({protocol:r,source:e,selector:t,params:i}){let n=\"\";return r!==null&&(n+=`${r}`),e!==null&&(n+=`${I8(e)}#`),n+=I8(t),LSe(i)&&(n+=`::${Sf.default.stringify(i)}`),n}function OSe(r){let{params:e,protocol:t,source:i,selector:n}=vf(r);for(let s in e)s.startsWith(\"__\")&&delete e[s];return xw({protocol:t,source:i,params:e,selector:n})}function Ot(r){return r.scope?`@${r.scope}/${r.name}`:`${r.name}`}function Sn(r){return r.scope?`@${r.scope}/${r.name}@${r.range}`:`${r.name}@${r.range}`}function Es(r){return r.scope?`@${r.scope}/${r.name}@${r.reference}`:`${r.name}@${r.reference}`}function UD(r){return r.scope!==null?`@${r.scope}-${r.name}`:r.name}function xf(r){let{protocol:e,selector:t}=vf(r.reference),i=e!==null?e.replace(/:$/,\"\"):\"exotic\",n=y8.default.valid(t),s=n!==null?`${i}-${n}`:`${i}`,o=10,a=r.scope?`${UD(r)}-${s}-${r.locatorHash.slice(0,o)}`:`${UD(r)}-${s}-${r.locatorHash.slice(0,o)}`;return Ur(a)}function Ai(r,e){return e.scope?`${$e(r,`@${e.scope}/`,Ue.SCOPE)}${$e(r,e.name,Ue.NAME)}`:`${$e(r,e.name,Ue.NAME)}`}function Pw(r){if(r.startsWith(eC)){let e=Pw(r.substring(r.indexOf(\"#\")+1)),t=r.substring(eC.length,eC.length+xSe);return`${e} [${t}]`}else return r.replace(/\\?.*/,\"?[...]\")}function Dw(r,e){return`${$e(r,Pw(e),Ue.RANGE)}`}function tr(r,e){return`${Ai(r,e)}${$e(r,\"@\",Ue.RANGE)}${Dw(r,e.range)}`}function AC(r,e){return`${$e(r,Pw(e),Ue.REFERENCE)}`}function mt(r,e){return`${Ai(r,e)}${$e(r,\"@\",Ue.REFERENCE)}${AC(r,e.reference)}`}function jD(r){return`${Ot(r)}@${Pw(r.reference)}`}function Pf(r){return Qn(r,[e=>Ot(e),e=>e.range])}function lC(r,e){return Ai(r,e.locator)}function iP(r,e,t){let i=WA(e)?iC(e):e;return t===null?`${tr(r,i)} \\u2192 ${rP(r).Cross}`:i.identHash===t.identHash?`${tr(r,i)} \\u2192 ${AC(r,t.reference)}`:`${tr(r,i)} \\u2192 ${mt(r,t)}`}function nP(r,e,t){return t===null?`${mt(r,e)}`:`${mt(r,e)} (via ${Dw(r,t.range)})`}function qD(r){return`node_modules/${Ot(r)}`}function kw(r,e){return r.conditions?PSe(r.conditions,t=>{let[,i,n]=t.match(B8),s=e[i];return s?s.includes(n):!0}):!0}var S8={hooks:{reduceDependency:(r,e,t,i,{resolver:n,resolveOptions:s})=>{for(let{pattern:o,reference:a}of e.topLevelWorkspace.manifest.resolutions){if(o.from&&o.from.fullName!==Ot(t)||o.from&&o.from.description&&o.from.description!==t.reference||o.descriptor.fullName!==Ot(r)||o.descriptor.description&&o.descriptor.description!==r.range)continue;return n.bindDescriptor(_t(r,a),e.topLevelWorkspace.anchoredLocator,s)}return r},validateProject:async(r,e)=>{for(let t of r.workspaces){let i=lC(r.configuration,t);await r.configuration.triggerHook(n=>n.validateWorkspace,t,{reportWarning:(n,s)=>e.reportWarning(n,`${i}: ${s}`),reportError:(n,s)=>e.reportError(n,`${i}: ${s}`)})}},validateWorkspace:async(r,e)=>{let{manifest:t}=r;t.resolutions.length&&r.cwd!==r.project.cwd&&t.errors.push(new Error(\"Resolutions field will be ignored\"));for(let i of t.errors)e.reportWarning(57,i.message)}}};var F8=Pe(Xr());var cC=class{supportsDescriptor(e,t){return!!(e.range.startsWith(cC.protocol)||t.project.tryWorkspaceByDescriptor(e)!==null)}supportsLocator(e,t){return!!e.reference.startsWith(cC.protocol)}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){return[i.project.getWorkspaceByDescriptor(e).anchoredLocator]}async getSatisfying(e,t,i){return null}async resolve(e,t){let i=t.project.getWorkspaceByCwd(e.reference.slice(cC.protocol.length));return{...e,version:i.manifest.version||\"0.0.0\",languageName:\"unknown\",linkType:\"SOFT\",conditions:null,dependencies:new Map([...i.manifest.dependencies,...i.manifest.devDependencies]),peerDependencies:new Map([...i.manifest.peerDependencies]),dependenciesMeta:i.manifest.dependenciesMeta,peerDependenciesMeta:i.manifest.peerDependenciesMeta,bin:i.manifest.bin}}},jr=cC;jr.protocol=\"workspace:\";var vt={};ut(vt,{SemVer:()=>P8.SemVer,clean:()=>KSe,satisfiesWithPrereleases:()=>kc,validRange:()=>so});var Rw=Pe(Xr()),P8=Pe(Xr()),v8=new Map;function kc(r,e,t=!1){if(!r)return!1;let i=`${e}${t}`,n=v8.get(i);if(typeof n>\"u\")try{n=new Rw.default.Range(e,{includePrerelease:!0,loose:t})}catch{return!1}finally{v8.set(i,n||null)}else if(n===null)return!1;let s;try{s=new Rw.default.SemVer(r,n)}catch{return!1}return n.test(s)?!0:(s.prerelease&&(s.prerelease=[]),n.set.some(o=>{for(let a of o)a.semver.prerelease&&(a.semver.prerelease=[]);return o.every(a=>a.test(s))}))}var x8=new Map;function so(r){if(r.indexOf(\":\")!==-1)return null;let e=x8.get(r);if(typeof e<\"u\")return e;try{e=new Rw.default.Range(r)}catch{e=null}return x8.set(r,e),e}var MSe=/^(?:[\\sv=]*?)((0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?)(?:\\s*)$/;function KSe(r){let e=MSe.exec(r);return e?e[1]:null}var VA=class{constructor(){this.indent=\"  \";this.name=null;this.version=null;this.os=null;this.cpu=null;this.libc=null;this.type=null;this.packageManager=null;this.private=!1;this.license=null;this.main=null;this.module=null;this.browser=null;this.languageName=null;this.bin=new Map;this.scripts=new Map;this.dependencies=new Map;this.devDependencies=new Map;this.peerDependencies=new Map;this.workspaceDefinitions=[];this.dependenciesMeta=new Map;this.peerDependenciesMeta=new Map;this.resolutions=[];this.files=null;this.publishConfig=null;this.installConfig=null;this.preferUnplugged=null;this.raw={};this.errors=[]}static async tryFind(e,{baseFs:t=new $t}={}){let i=x.join(e,\"package.json\");try{return await VA.fromFile(i,{baseFs:t})}catch(n){if(n.code===\"ENOENT\")return null;throw n}}static async find(e,{baseFs:t}={}){let i=await VA.tryFind(e,{baseFs:t});if(i===null)throw new Error(\"Manifest not found\");return i}static async fromFile(e,{baseFs:t=new $t}={}){let i=new VA;return await i.loadFile(e,{baseFs:t}),i}static fromText(e){let t=new VA;return t.loadFromText(e),t}static isManifestFieldCompatible(e,t){if(e===null)return!0;let i=!0,n=!1;for(let s of e)if(s[0]===\"!\"){if(n=!0,t===s.slice(1))return!1}else if(i=!1,s===t)return!0;return n&&i}loadFromText(e){let t;try{t=JSON.parse(k8(e)||\"{}\")}catch(i){throw i.message+=` (when parsing ${e})`,i}this.load(t),this.indent=D8(e)}async loadFile(e,{baseFs:t=new $t}){let i=await t.readFilePromise(e,\"utf8\"),n;try{n=JSON.parse(k8(i)||\"{}\")}catch(s){throw s.message+=` (when parsing ${e})`,s}this.load(n),this.indent=D8(i)}load(e,{yamlCompatibilityMode:t=!1}={}){if(typeof e!=\"object\"||e===null)throw new Error(`Utterly invalid manifest data (${e})`);this.raw=e;let i=[];if(this.name=null,typeof e.name==\"string\")try{this.name=tn(e.name)}catch{i.push(new Error(\"Parsing failed for the 'name' field\"))}if(typeof e.version==\"string\"?this.version=e.version:this.version=null,Array.isArray(e.os)){let s=[];this.os=s;for(let o of e.os)typeof o!=\"string\"?i.push(new Error(\"Parsing failed for the 'os' field\")):s.push(o)}else this.os=null;if(Array.isArray(e.cpu)){let s=[];this.cpu=s;for(let o of e.cpu)typeof o!=\"string\"?i.push(new Error(\"Parsing failed for the 'cpu' field\")):s.push(o)}else this.cpu=null;if(Array.isArray(e.libc)){let s=[];this.libc=s;for(let o of e.libc)typeof o!=\"string\"?i.push(new Error(\"Parsing failed for the 'libc' field\")):s.push(o)}else this.libc=null;if(typeof e.type==\"string\"?this.type=e.type:this.type=null,typeof e.packageManager==\"string\"?this.packageManager=e.packageManager:this.packageManager=null,typeof e.private==\"boolean\"?this.private=e.private:this.private=!1,typeof e.license==\"string\"?this.license=e.license:this.license=null,typeof e.languageName==\"string\"?this.languageName=e.languageName:this.languageName=null,typeof e.main==\"string\"?this.main=sn(e.main):this.main=null,typeof e.module==\"string\"?this.module=sn(e.module):this.module=null,e.browser!=null)if(typeof e.browser==\"string\")this.browser=sn(e.browser);else{this.browser=new Map;for(let[s,o]of Object.entries(e.browser))this.browser.set(sn(s),typeof o==\"string\"?sn(o):o)}else this.browser=null;if(this.bin=new Map,typeof e.bin==\"string\")this.name!==null?this.bin.set(this.name.name,sn(e.bin)):i.push(new Error(\"String bin field, but no attached package name\"));else if(typeof e.bin==\"object\"&&e.bin!==null)for(let[s,o]of Object.entries(e.bin)){if(typeof o!=\"string\"){i.push(new Error(`Invalid bin definition for '${s}'`));continue}let a=tn(s);this.bin.set(a.name,sn(o))}if(this.scripts=new Map,typeof e.scripts==\"object\"&&e.scripts!==null)for(let[s,o]of Object.entries(e.scripts)){if(typeof o!=\"string\"){i.push(new Error(`Invalid script definition for '${s}'`));continue}this.scripts.set(s,o)}if(this.dependencies=new Map,typeof e.dependencies==\"object\"&&e.dependencies!==null)for(let[s,o]of Object.entries(e.dependencies)){if(typeof o!=\"string\"){i.push(new Error(`Invalid dependency range for '${s}'`));continue}let a;try{a=tn(s)}catch{i.push(new Error(`Parsing failed for the dependency name '${s}'`));continue}let l=_t(a,o);this.dependencies.set(l.identHash,l)}if(this.devDependencies=new Map,typeof e.devDependencies==\"object\"&&e.devDependencies!==null)for(let[s,o]of Object.entries(e.devDependencies)){if(typeof o!=\"string\"){i.push(new Error(`Invalid dependency range for '${s}'`));continue}let a;try{a=tn(s)}catch{i.push(new Error(`Parsing failed for the dependency name '${s}'`));continue}let l=_t(a,o);this.devDependencies.set(l.identHash,l)}if(this.peerDependencies=new Map,typeof e.peerDependencies==\"object\"&&e.peerDependencies!==null)for(let[s,o]of Object.entries(e.peerDependencies)){let a;try{a=tn(s)}catch{i.push(new Error(`Parsing failed for the dependency name '${s}'`));continue}(typeof o!=\"string\"||!o.startsWith(jr.protocol)&&!so(o))&&(i.push(new Error(`Invalid dependency range for '${s}'`)),o=\"*\");let l=_t(a,o);this.peerDependencies.set(l.identHash,l)}typeof e.workspaces==\"object\"&&e.workspaces!==null&&e.workspaces.nohoist&&i.push(new Error(\"'nohoist' is deprecated, please use 'installConfig.hoistingLimits' instead\"));let n=Array.isArray(e.workspaces)?e.workspaces:typeof e.workspaces==\"object\"&&e.workspaces!==null&&Array.isArray(e.workspaces.packages)?e.workspaces.packages:[];this.workspaceDefinitions=[];for(let s of n){if(typeof s!=\"string\"){i.push(new Error(`Invalid workspace definition for '${s}'`));continue}this.workspaceDefinitions.push({pattern:s})}if(this.dependenciesMeta=new Map,typeof e.dependenciesMeta==\"object\"&&e.dependenciesMeta!==null)for(let[s,o]of Object.entries(e.dependenciesMeta)){if(typeof o!=\"object\"||o===null){i.push(new Error(`Invalid meta field for '${s}`));continue}let a=zA(s),l=this.ensureDependencyMeta(a),c=Fw(o.built,{yamlCompatibilityMode:t});if(c===null){i.push(new Error(`Invalid built meta field for '${s}'`));continue}let u=Fw(o.optional,{yamlCompatibilityMode:t});if(u===null){i.push(new Error(`Invalid optional meta field for '${s}'`));continue}let g=Fw(o.unplugged,{yamlCompatibilityMode:t});if(g===null){i.push(new Error(`Invalid unplugged meta field for '${s}'`));continue}Object.assign(l,{built:c,optional:u,unplugged:g})}if(this.peerDependenciesMeta=new Map,typeof e.peerDependenciesMeta==\"object\"&&e.peerDependenciesMeta!==null)for(let[s,o]of Object.entries(e.peerDependenciesMeta)){if(typeof o!=\"object\"||o===null){i.push(new Error(`Invalid meta field for '${s}'`));continue}let a=zA(s),l=this.ensurePeerDependencyMeta(a),c=Fw(o.optional,{yamlCompatibilityMode:t});if(c===null){i.push(new Error(`Invalid optional meta field for '${s}'`));continue}Object.assign(l,{optional:c})}if(this.resolutions=[],typeof e.resolutions==\"object\"&&e.resolutions!==null)for(let[s,o]of Object.entries(e.resolutions)){if(typeof o!=\"string\"){i.push(new Error(`Invalid resolution entry for '${s}'`));continue}try{this.resolutions.push({pattern:hI(s),reference:o})}catch(a){i.push(a);continue}}if(Array.isArray(e.files)){this.files=new Set;for(let s of e.files){if(typeof s!=\"string\"){i.push(new Error(`Invalid files entry for '${s}'`));continue}this.files.add(s)}}else this.files=null;if(typeof e.publishConfig==\"object\"&&e.publishConfig!==null){if(this.publishConfig={},typeof e.publishConfig.access==\"string\"&&(this.publishConfig.access=e.publishConfig.access),typeof e.publishConfig.main==\"string\"&&(this.publishConfig.main=sn(e.publishConfig.main)),typeof e.publishConfig.module==\"string\"&&(this.publishConfig.module=sn(e.publishConfig.module)),e.publishConfig.browser!=null)if(typeof e.publishConfig.browser==\"string\")this.publishConfig.browser=sn(e.publishConfig.browser);else{this.publishConfig.browser=new Map;for(let[s,o]of Object.entries(e.publishConfig.browser))this.publishConfig.browser.set(sn(s),typeof o==\"string\"?sn(o):o)}if(typeof e.publishConfig.registry==\"string\"&&(this.publishConfig.registry=e.publishConfig.registry),typeof e.publishConfig.bin==\"string\")this.name!==null?this.publishConfig.bin=new Map([[this.name.name,sn(e.publishConfig.bin)]]):i.push(new Error(\"String bin field, but no attached package name\"));else if(typeof e.publishConfig.bin==\"object\"&&e.publishConfig.bin!==null){this.publishConfig.bin=new Map;for(let[s,o]of Object.entries(e.publishConfig.bin)){if(typeof o!=\"string\"){i.push(new Error(`Invalid bin definition for '${s}'`));continue}this.publishConfig.bin.set(s,sn(o))}}if(Array.isArray(e.publishConfig.executableFiles)){this.publishConfig.executableFiles=new Set;for(let s of e.publishConfig.executableFiles){if(typeof s!=\"string\"){i.push(new Error(\"Invalid executable file definition\"));continue}this.publishConfig.executableFiles.add(sn(s))}}}else this.publishConfig=null;if(typeof e.installConfig==\"object\"&&e.installConfig!==null){this.installConfig={};for(let s of Object.keys(e.installConfig))s===\"hoistingLimits\"?typeof e.installConfig.hoistingLimits==\"string\"?this.installConfig.hoistingLimits=e.installConfig.hoistingLimits:i.push(new Error(\"Invalid hoisting limits definition\")):s==\"selfReferences\"?typeof e.installConfig.selfReferences==\"boolean\"?this.installConfig.selfReferences=e.installConfig.selfReferences:i.push(new Error(\"Invalid selfReferences definition, must be a boolean value\")):i.push(new Error(`Unrecognized installConfig key: ${s}`))}else this.installConfig=null;if(typeof e.optionalDependencies==\"object\"&&e.optionalDependencies!==null)for(let[s,o]of Object.entries(e.optionalDependencies)){if(typeof o!=\"string\"){i.push(new Error(`Invalid dependency range for '${s}'`));continue}let a;try{a=tn(s)}catch{i.push(new Error(`Parsing failed for the dependency name '${s}'`));continue}let l=_t(a,o);this.dependencies.set(l.identHash,l);let c=_t(a,\"unknown\"),u=this.ensureDependencyMeta(c);Object.assign(u,{optional:!0})}typeof e.preferUnplugged==\"boolean\"?this.preferUnplugged=e.preferUnplugged:this.preferUnplugged=null,this.errors=i}getForScope(e){switch(e){case\"dependencies\":return this.dependencies;case\"devDependencies\":return this.devDependencies;case\"peerDependencies\":return this.peerDependencies;default:throw new Error(`Unsupported value (\"${e}\")`)}}hasConsumerDependency(e){return!!(this.dependencies.has(e.identHash)||this.peerDependencies.has(e.identHash))}hasHardDependency(e){return!!(this.dependencies.has(e.identHash)||this.devDependencies.has(e.identHash))}hasSoftDependency(e){return!!this.peerDependencies.has(e.identHash)}hasDependency(e){return!!(this.hasHardDependency(e)||this.hasSoftDependency(e))}getConditions(){let e=[];return this.os&&this.os.length>0&&e.push(JD(\"os\",this.os)),this.cpu&&this.cpu.length>0&&e.push(JD(\"cpu\",this.cpu)),this.libc&&this.libc.length>0&&e.push(JD(\"libc\",this.libc)),e.length>0?e.join(\" & \"):null}isCompatibleWithOS(e){return VA.isManifestFieldCompatible(this.os,e)}isCompatibleWithCPU(e){return VA.isManifestFieldCompatible(this.cpu,e)}ensureDependencyMeta(e){if(e.range!==\"unknown\"&&!F8.default.valid(e.range))throw new Error(`Invalid meta field range for '${Sn(e)}'`);let t=Ot(e),i=e.range!==\"unknown\"?e.range:null,n=this.dependenciesMeta.get(t);n||this.dependenciesMeta.set(t,n=new Map);let s=n.get(i);return s||n.set(i,s={}),s}ensurePeerDependencyMeta(e){if(e.range!==\"unknown\")throw new Error(`Invalid meta field range for '${Sn(e)}'`);let t=Ot(e),i=this.peerDependenciesMeta.get(t);return i||this.peerDependenciesMeta.set(t,i={}),i}setRawField(e,t,{after:i=[]}={}){let n=new Set(i.filter(s=>Object.prototype.hasOwnProperty.call(this.raw,s)));if(n.size===0||Object.prototype.hasOwnProperty.call(this.raw,e))this.raw[e]=t;else{let s=this.raw,o=this.raw={},a=!1;for(let l of Object.keys(s))o[l]=s[l],a||(n.delete(l),n.size===0&&(o[e]=t,a=!0))}}exportTo(e,{compatibilityMode:t=!0}={}){var s;if(Object.assign(e,this.raw),this.name!==null?e.name=Ot(this.name):delete e.name,this.version!==null?e.version=this.version:delete e.version,this.os!==null?e.os=this.os:delete e.os,this.cpu!==null?e.cpu=this.cpu:delete e.cpu,this.type!==null?e.type=this.type:delete e.type,this.packageManager!==null?e.packageManager=this.packageManager:delete e.packageManager,this.private?e.private=!0:delete e.private,this.license!==null?e.license=this.license:delete e.license,this.languageName!==null?e.languageName=this.languageName:delete e.languageName,this.main!==null?e.main=this.main:delete e.main,this.module!==null?e.module=this.module:delete e.module,this.browser!==null){let o=this.browser;typeof o==\"string\"?e.browser=o:o instanceof Map&&(e.browser=Object.assign({},...Array.from(o.keys()).sort().map(a=>({[a]:o.get(a)}))))}else delete e.browser;this.bin.size===1&&this.name!==null&&this.bin.has(this.name.name)?e.bin=this.bin.get(this.name.name):this.bin.size>0?e.bin=Object.assign({},...Array.from(this.bin.keys()).sort().map(o=>({[o]:this.bin.get(o)}))):delete e.bin,this.workspaceDefinitions.length>0?this.raw.workspaces&&!Array.isArray(this.raw.workspaces)?e.workspaces={...this.raw.workspaces,packages:this.workspaceDefinitions.map(({pattern:o})=>o)}:e.workspaces=this.workspaceDefinitions.map(({pattern:o})=>o):this.raw.workspaces&&!Array.isArray(this.raw.workspaces)&&Object.keys(this.raw.workspaces).length>0?e.workspaces=this.raw.workspaces:delete e.workspaces;let i=[],n=[];for(let o of this.dependencies.values()){let a=this.dependenciesMeta.get(Ot(o)),l=!1;if(t&&a){let c=a.get(null);c&&c.optional&&(l=!0)}l?n.push(o):i.push(o)}i.length>0?e.dependencies=Object.assign({},...Pf(i).map(o=>({[Ot(o)]:o.range}))):delete e.dependencies,n.length>0?e.optionalDependencies=Object.assign({},...Pf(n).map(o=>({[Ot(o)]:o.range}))):delete e.optionalDependencies,this.devDependencies.size>0?e.devDependencies=Object.assign({},...Pf(this.devDependencies.values()).map(o=>({[Ot(o)]:o.range}))):delete e.devDependencies,this.peerDependencies.size>0?e.peerDependencies=Object.assign({},...Pf(this.peerDependencies.values()).map(o=>({[Ot(o)]:o.range}))):delete e.peerDependencies,e.dependenciesMeta={};for(let[o,a]of Qn(this.dependenciesMeta.entries(),([l,c])=>l))for(let[l,c]of Qn(a.entries(),([u,g])=>u!==null?`0${u}`:\"1\")){let u=l!==null?Sn(_t(tn(o),l)):o,g={...c};t&&l===null&&delete g.optional,Object.keys(g).length!==0&&(e.dependenciesMeta[u]=g)}if(Object.keys(e.dependenciesMeta).length===0&&delete e.dependenciesMeta,this.peerDependenciesMeta.size>0?e.peerDependenciesMeta=Object.assign({},...Qn(this.peerDependenciesMeta.entries(),([o,a])=>o).map(([o,a])=>({[o]:a}))):delete e.peerDependenciesMeta,this.resolutions.length>0?e.resolutions=Object.assign({},...this.resolutions.map(({pattern:o,reference:a})=>({[pI(o)]:a}))):delete e.resolutions,this.files!==null?e.files=Array.from(this.files):delete e.files,this.preferUnplugged!==null?e.preferUnplugged=this.preferUnplugged:delete e.preferUnplugged,this.scripts!==null&&this.scripts.size>0){(s=e.scripts)!=null||(e.scripts={});for(let o of Object.keys(e.scripts))this.scripts.has(o)||delete e.scripts[o];for(let[o,a]of this.scripts.entries())e.scripts[o]=a}else delete e.scripts;return e}},ot=VA;ot.fileName=\"package.json\",ot.allDependencies=[\"dependencies\",\"devDependencies\",\"peerDependencies\"],ot.hardDependencies=[\"dependencies\",\"devDependencies\"];function D8(r){let e=r.match(/^[ \\t]+/m);return e?e[0]:\"  \"}function k8(r){return r.charCodeAt(0)===65279?r.slice(1):r}function sn(r){return r.replace(/\\\\/g,\"/\")}function Fw(r,{yamlCompatibilityMode:e}){return e?zx(r):typeof r>\"u\"||typeof r==\"boolean\"?r:null}function R8(r,e){let t=e.search(/[^!]/);if(t===-1)return\"invalid\";let i=t%2===0?\"\":\"!\",n=e.slice(t);return`${i}${r}=${n}`}function JD(r,e){return e.length===1?R8(r,e[0]):`(${e.map(t=>R8(r,t)).join(\" | \")})`}var cz=Pe(lz()),uz=J(\"stream\"),gz=J(\"string_decoder\");var Rve=15,at=class extends Error{constructor(t,i,n){super(i);this.reportExtra=n;this.reportCode=t}};function Fve(r){return typeof r.reportCode<\"u\"}var vi=class{constructor(){this.reportedInfos=new Set;this.reportedWarnings=new Set;this.reportedErrors=new Set}static progressViaCounter(e){let t=0,i,n=new Promise(l=>{i=l}),s=l=>{let c=i;n=new Promise(u=>{i=u}),t=l,c()},o=(l=0)=>{s(t+1)},a=async function*(){for(;t<e;)await n,yield{progress:t/e}}();return{[Symbol.asyncIterator](){return a},hasProgress:!0,hasTitle:!1,set:s,tick:o}}static progressViaTitle(){let e,t,i=new Promise(o=>{t=o}),n=(0,cz.default)(o=>{let a=t;i=new Promise(l=>{t=l}),e=o,a()},1e3/Rve),s=async function*(){for(;;)await i,yield{title:e}}();return{[Symbol.asyncIterator](){return s},hasProgress:!1,hasTitle:!0,setTitle:n}}async startProgressPromise(e,t){let i=this.reportProgress(e);try{return await t(e)}finally{i.stop()}}startProgressSync(e,t){let i=this.reportProgress(e);try{return t(e)}finally{i.stop()}}reportInfoOnce(e,t,i){var s;let n=i&&i.key?i.key:t;this.reportedInfos.has(n)||(this.reportedInfos.add(n),this.reportInfo(e,t),(s=i==null?void 0:i.reportExtra)==null||s.call(i,this))}reportWarningOnce(e,t,i){var s;let n=i&&i.key?i.key:t;this.reportedWarnings.has(n)||(this.reportedWarnings.add(n),this.reportWarning(e,t),(s=i==null?void 0:i.reportExtra)==null||s.call(i,this))}reportErrorOnce(e,t,i){var s;let n=i&&i.key?i.key:t;this.reportedErrors.has(n)||(this.reportedErrors.add(n),this.reportError(e,t),(s=i==null?void 0:i.reportExtra)==null||s.call(i,this))}reportExceptionOnce(e){Fve(e)?this.reportErrorOnce(e.reportCode,e.message,{key:e,reportExtra:e.reportExtra}):this.reportErrorOnce(1,e.stack||e.message,{key:e})}createStreamReporter(e=null){let t=new uz.PassThrough,i=new gz.StringDecoder,n=\"\";return t.on(\"data\",s=>{let o=i.write(s),a;do if(a=o.indexOf(`\n`),a!==-1){let l=n+o.substring(0,a);o=o.substring(a+1),n=\"\",e!==null?this.reportInfo(null,`${e} ${l}`):this.reportInfo(null,l)}while(a!==-1);n+=o}),t.on(\"end\",()=>{let s=i.end();s!==\"\"&&(e!==null?this.reportInfo(null,`${e} ${s}`):this.reportInfo(null,s))}),t}};var Df=class{constructor(e){this.fetchers=e}supports(e,t){return!!this.tryFetcher(e,t)}getLocalPath(e,t){return this.getFetcher(e,t).getLocalPath(e,t)}async fetch(e,t){return await this.getFetcher(e,t).fetch(e,t)}tryFetcher(e,t){let i=this.fetchers.find(n=>n.supports(e,t));return i||null}getFetcher(e,t){let i=this.fetchers.find(n=>n.supports(e,t));if(!i)throw new at(11,`${mt(t.project.configuration,e)} isn't supported by any available fetcher`);return i}};var kf=class{constructor(e){this.resolvers=e.filter(t=>t)}supportsDescriptor(e,t){return!!this.tryResolverByDescriptor(e,t)}supportsLocator(e,t){return!!this.tryResolverByLocator(e,t)}shouldPersistResolution(e,t){return this.getResolverByLocator(e,t).shouldPersistResolution(e,t)}bindDescriptor(e,t,i){return this.getResolverByDescriptor(e,i).bindDescriptor(e,t,i)}getResolutionDependencies(e,t){return this.getResolverByDescriptor(e,t).getResolutionDependencies(e,t)}async getCandidates(e,t,i){return await this.getResolverByDescriptor(e,i).getCandidates(e,t,i)}async getSatisfying(e,t,i){return this.getResolverByDescriptor(e,i).getSatisfying(e,t,i)}async resolve(e,t){return await this.getResolverByLocator(e,t).resolve(e,t)}tryResolverByDescriptor(e,t){let i=this.resolvers.find(n=>n.supportsDescriptor(e,t));return i||null}getResolverByDescriptor(e,t){let i=this.resolvers.find(n=>n.supportsDescriptor(e,t));if(!i)throw new Error(`${tr(t.project.configuration,e)} isn't supported by any available resolver`);return i}tryResolverByLocator(e,t){let i=this.resolvers.find(n=>n.supportsLocator(e,t));return i||null}getResolverByLocator(e,t){let i=this.resolvers.find(n=>n.supportsLocator(e,t));if(!i)throw new Error(`${mt(t.project.configuration,e)} isn't supported by any available resolver`);return i}};var fz=Pe(Xr());var Rf=/^(?!v)[a-z0-9._-]+$/i,Nw=class{supportsDescriptor(e,t){return!!(so(e.range)||Rf.test(e.range))}supportsLocator(e,t){return!!(fz.default.valid(e.reference)||Rf.test(e.reference))}shouldPersistResolution(e,t){return t.resolver.shouldPersistResolution(this.forwardLocator(e,t),t)}bindDescriptor(e,t,i){return i.resolver.bindDescriptor(this.forwardDescriptor(e,i),t,i)}getResolutionDependencies(e,t){return t.resolver.getResolutionDependencies(this.forwardDescriptor(e,t),t)}async getCandidates(e,t,i){return await i.resolver.getCandidates(this.forwardDescriptor(e,i),t,i)}async getSatisfying(e,t,i){return await i.resolver.getSatisfying(this.forwardDescriptor(e,i),t,i)}async resolve(e,t){let i=await t.resolver.resolve(this.forwardLocator(e,t),t);return tC(i,e)}forwardDescriptor(e,t){return _t(e,`${t.project.configuration.get(\"defaultProtocol\")}${e.range}`)}forwardLocator(e,t){return nn(e,`${t.project.configuration.get(\"defaultProtocol\")}${e.reference}`)}};var Ff=class{supports(e){return!!e.reference.startsWith(\"virtual:\")}getLocalPath(e,t){let i=e.reference.indexOf(\"#\");if(i===-1)throw new Error(\"Invalid virtual package reference\");let n=e.reference.slice(i+1),s=nn(e,n);return t.fetcher.getLocalPath(s,t)}async fetch(e,t){let i=e.reference.indexOf(\"#\");if(i===-1)throw new Error(\"Invalid virtual package reference\");let n=e.reference.slice(i+1),s=nn(e,n),o=await t.fetcher.fetch(s,t);return await this.ensureVirtualLink(e,o,t)}getLocatorFilename(e){return xf(e)}async ensureVirtualLink(e,t,i){let n=t.packageFs.getRealPath(),s=i.project.configuration.get(\"virtualFolder\"),o=this.getLocatorFilename(e),a=Br.makeVirtualPath(s,o,n),l=new bo(a,{baseFs:t.packageFs,pathUtils:x});return{...t,packageFs:l}}};var Nf=class{static isVirtualDescriptor(e){return!!e.range.startsWith(Nf.protocol)}static isVirtualLocator(e){return!!e.reference.startsWith(Nf.protocol)}supportsDescriptor(e,t){return Nf.isVirtualDescriptor(e)}supportsLocator(e,t){return Nf.isVirtualLocator(e)}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,i){throw new Error('Assertion failed: calling \"bindDescriptor\" on a virtual descriptor is unsupported')}getResolutionDependencies(e,t){throw new Error('Assertion failed: calling \"getResolutionDependencies\" on a virtual descriptor is unsupported')}async getCandidates(e,t,i){throw new Error('Assertion failed: calling \"getCandidates\" on a virtual descriptor is unsupported')}async getSatisfying(e,t,i){throw new Error('Assertion failed: calling \"getSatisfying\" on a virtual descriptor is unsupported')}async resolve(e,t){throw new Error('Assertion failed: calling \"resolve\" on a virtual locator is unsupported')}},fC=Nf;fC.protocol=\"virtual:\";var Tf=class{supports(e){return!!e.reference.startsWith(jr.protocol)}getLocalPath(e,t){return this.getWorkspace(e,t).cwd}async fetch(e,t){let i=this.getWorkspace(e,t).cwd;return{packageFs:new qt(i),prefixPath:Oe.dot,localPath:i}}getWorkspace(e,t){return t.project.getWorkspaceByCwd(e.reference.slice(jr.protocol.length))}};var Tw={};ut(Tw,{getDefaultGlobalFolder:()=>XD,getHomeFolder:()=>hC,isFolderInside:()=>ZD});var VD=J(\"os\");function XD(){if(process.platform===\"win32\"){let r=K.toPortablePath(process.env.LOCALAPPDATA||K.join((0,VD.homedir)(),\"AppData\",\"Local\"));return x.resolve(r,\"Yarn/Berry\")}if(process.env.XDG_DATA_HOME){let r=K.toPortablePath(process.env.XDG_DATA_HOME);return x.resolve(r,\"yarn/berry\")}return x.resolve(hC(),\".yarn/berry\")}function hC(){return K.toPortablePath((0,VD.homedir)()||\"/usr/local/share\")}function ZD(r,e){let t=x.relative(e,r);return t&&!t.startsWith(\"..\")&&!x.isAbsolute(t)}var ws={};ut(ws,{availableParallelism:()=>ek,builtinModules:()=>_D,getArchitecture:()=>pC,getArchitectureName:()=>Lve,getArchitectureSet:()=>$D,openUrl:()=>Nve});var pz=Pe(J(\"module\")),Mw=Pe(J(\"os\"));var hz=new Map([[\"darwin\",\"open\"],[\"linux\",\"xdg-open\"],[\"win32\",\"explorer.exe\"]]).get(process.platform),Nve=typeof hz<\"u\"?async r=>{try{return await tk(hz,[r],{cwd:x.cwd()}),!0}catch{return!1}}:void 0;function _D(){return new Set(pz.default.builtinModules||Object.keys(process.binding(\"natives\")))}function Tve(){var i,n,s,o;if(process.platform===\"win32\")return null;let e=(s=((n=(i=process.report)==null?void 0:i.getReport())!=null?n:{}).sharedObjects)!=null?s:[],t=/\\/(?:(ld-linux-|[^/]+-linux-gnu\\/)|(libc.musl-|ld-musl-))/;return(o=Jd(e,a=>{let l=a.match(t);if(!l)return Jd.skip;if(l[1])return\"glibc\";if(l[2])return\"musl\";throw new Error(\"Assertion failed: Expected the libc variant to have been detected\")}))!=null?o:null}var Lw,Ow;function pC(){return Lw=Lw!=null?Lw:{os:process.platform,cpu:process.arch,libc:Tve()}}function Lve(r=pC()){return r.libc?`${r.os}-${r.cpu}-${r.libc}`:`${r.os}-${r.cpu}`}function $D(){let r=pC();return Ow=Ow!=null?Ow:{os:[r.os],cpu:[r.cpu],libc:r.libc?[r.libc]:[]}}function ek(){return\"availableParallelism\"in Mw.default?Mw.default.availableParallelism():Math.max(1,Mw.default.cpus().length)}var Ove=new Set([\"isTestEnv\",\"injectNpmUser\",\"injectNpmPassword\",\"injectNpm2FaToken\",\"binFolder\",\"version\",\"flags\",\"profile\",\"gpg\",\"ignoreNode\",\"wrapOutput\",\"home\",\"confDir\",\"registry\"]),Gw=\"yarn_\",sk=\".yarnrc.yml\",ok=\"yarn.lock\",Mve=\"********\",ak=(u=>(u.ANY=\"ANY\",u.BOOLEAN=\"BOOLEAN\",u.ABSOLUTE_PATH=\"ABSOLUTE_PATH\",u.LOCATOR=\"LOCATOR\",u.LOCATOR_LOOSE=\"LOCATOR_LOOSE\",u.NUMBER=\"NUMBER\",u.STRING=\"STRING\",u.SECRET=\"SECRET\",u.SHAPE=\"SHAPE\",u.MAP=\"MAP\",u))(ak||{}),xi=Ue,rk={lastUpdateCheck:{description:\"Last timestamp we checked whether new Yarn versions were available\",type:\"STRING\",default:null},yarnPath:{description:\"Path to the local executable that must be used over the global one\",type:\"ABSOLUTE_PATH\",default:null},ignorePath:{description:\"If true, the local executable will be ignored when using the global one\",type:\"BOOLEAN\",default:!1},ignoreCwd:{description:\"If true, the `--cwd` flag will be ignored\",type:\"BOOLEAN\",default:!1},cacheKeyOverride:{description:\"A global cache key override; used only for test purposes\",type:\"STRING\",default:null},globalFolder:{description:\"Folder where all system-global files are stored\",type:\"ABSOLUTE_PATH\",default:XD()},cacheFolder:{description:\"Folder where the cache files must be written\",type:\"ABSOLUTE_PATH\",default:\"./.yarn/cache\"},compressionLevel:{description:\"Zip files compression level, from 0 to 9 or mixed (a variant of 9, which stores some files uncompressed, when compression doesn't yield good results)\",type:\"NUMBER\",values:[\"mixed\",0,1,2,3,4,5,6,7,8,9],default:Xl},virtualFolder:{description:\"Folder where the virtual packages (cf doc) will be mapped on the disk (must be named __virtual__)\",type:\"ABSOLUTE_PATH\",default:\"./.yarn/__virtual__\"},lockfileFilename:{description:\"Name of the files where the Yarn dependency tree entries must be stored\",type:\"STRING\",default:ok},installStatePath:{description:\"Path of the file where the install state will be persisted\",type:\"ABSOLUTE_PATH\",default:\"./.yarn/install-state.gz\"},immutablePatterns:{description:\"Array of glob patterns; files matching them won't be allowed to change during immutable installs\",type:\"STRING\",default:[],isArray:!0},rcFilename:{description:\"Name of the files where the configuration can be found\",type:\"STRING\",default:Hw()},enableGlobalCache:{description:\"If true, the system-wide cache folder will be used regardless of `cache-folder`\",type:\"BOOLEAN\",default:!1},enableColors:{description:\"If true, the CLI is allowed to use colors in its output\",type:\"BOOLEAN\",default:zy,defaultText:\"<dynamic>\"},enableHyperlinks:{description:\"If true, the CLI is allowed to use hyperlinks in its output\",type:\"BOOLEAN\",default:eP,defaultText:\"<dynamic>\"},enableInlineBuilds:{description:\"If true, the CLI will print the build output on the command line\",type:\"BOOLEAN\",default:Kw.isCI,defaultText:\"<dynamic>\"},enableMessageNames:{description:\"If true, the CLI will prefix most messages with codes suitable for search engines\",type:\"BOOLEAN\",default:!0},enableProgressBars:{description:\"If true, the CLI is allowed to show a progress bar for long-running events\",type:\"BOOLEAN\",default:!Kw.isCI,defaultText:\"<dynamic>\"},enableTimers:{description:\"If true, the CLI is allowed to print the time spent executing commands\",type:\"BOOLEAN\",default:!0},preferAggregateCacheInfo:{description:\"If true, the CLI will only print a one-line report of any cache changes\",type:\"BOOLEAN\",default:Kw.isCI},preferInteractive:{description:\"If true, the CLI will automatically use the interactive mode when called from a TTY\",type:\"BOOLEAN\",default:!1},preferTruncatedLines:{description:\"If true, the CLI will truncate lines that would go beyond the size of the terminal\",type:\"BOOLEAN\",default:!1},progressBarStyle:{description:\"Which style of progress bar should be used (only when progress bars are enabled)\",type:\"STRING\",default:void 0,defaultText:\"<dynamic>\"},defaultLanguageName:{description:\"Default language mode that should be used when a package doesn't offer any insight\",type:\"STRING\",default:\"node\"},defaultProtocol:{description:\"Default resolution protocol used when resolving pure semver and tag ranges\",type:\"STRING\",default:\"npm:\"},enableTransparentWorkspaces:{description:\"If false, Yarn won't automatically resolve workspace dependencies unless they use the `workspace:` protocol\",type:\"BOOLEAN\",default:!0},supportedArchitectures:{description:\"Architectures that Yarn will fetch and inject into the resolver\",type:\"SHAPE\",properties:{os:{description:\"Array of supported process.platform strings, or null to target them all\",type:\"STRING\",isArray:!0,isNullable:!0,default:[\"current\"]},cpu:{description:\"Array of supported process.arch strings, or null to target them all\",type:\"STRING\",isArray:!0,isNullable:!0,default:[\"current\"]},libc:{description:\"Array of supported libc libraries, or null to target them all\",type:\"STRING\",isArray:!0,isNullable:!0,default:[\"current\"]}}},enableMirror:{description:\"If true, the downloaded packages will be retrieved and stored in both the local and global folders\",type:\"BOOLEAN\",default:!0},enableNetwork:{description:\"If false, the package manager will refuse to use the network if required to\",type:\"BOOLEAN\",default:!0},httpProxy:{description:\"URL of the http proxy that must be used for outgoing http requests\",type:\"STRING\",default:null},httpsProxy:{description:\"URL of the http proxy that must be used for outgoing https requests\",type:\"STRING\",default:null},unsafeHttpWhitelist:{description:\"List of the hostnames for which http queries are allowed (glob patterns are supported)\",type:\"STRING\",default:[],isArray:!0},httpTimeout:{description:\"Timeout of each http request in milliseconds\",type:\"NUMBER\",default:6e4},httpRetry:{description:\"Retry times on http failure\",type:\"NUMBER\",default:3},networkConcurrency:{description:\"Maximal number of concurrent requests\",type:\"NUMBER\",default:50},networkSettings:{description:\"Network settings per hostname (glob patterns are supported)\",type:\"MAP\",valueDefinition:{description:\"\",type:\"SHAPE\",properties:{caFilePath:{description:\"Path to file containing one or multiple Certificate Authority signing certificates\",type:\"ABSOLUTE_PATH\",default:null},enableNetwork:{description:\"If false, the package manager will refuse to use the network if required to\",type:\"BOOLEAN\",default:null},httpProxy:{description:\"URL of the http proxy that must be used for outgoing http requests\",type:\"STRING\",default:null},httpsProxy:{description:\"URL of the http proxy that must be used for outgoing https requests\",type:\"STRING\",default:null},httpsKeyFilePath:{description:\"Path to file containing private key in PEM format\",type:\"ABSOLUTE_PATH\",default:null},httpsCertFilePath:{description:\"Path to file containing certificate chain in PEM format\",type:\"ABSOLUTE_PATH\",default:null}}}},caFilePath:{description:\"A path to a file containing one or multiple Certificate Authority signing certificates\",type:\"ABSOLUTE_PATH\",default:null},httpsKeyFilePath:{description:\"Path to file containing private key in PEM format\",type:\"ABSOLUTE_PATH\",default:null},httpsCertFilePath:{description:\"Path to file containing certificate chain in PEM format\",type:\"ABSOLUTE_PATH\",default:null},enableStrictSsl:{description:\"If false, SSL certificate errors will be ignored\",type:\"BOOLEAN\",default:!0},logFilters:{description:\"Overrides for log levels\",type:\"SHAPE\",isArray:!0,concatenateValues:!0,properties:{code:{description:\"Code of the messages covered by this override\",type:\"STRING\",default:void 0},text:{description:\"Code of the texts covered by this override\",type:\"STRING\",default:void 0},pattern:{description:\"Code of the patterns covered by this override\",type:\"STRING\",default:void 0},level:{description:\"Log level override, set to null to remove override\",type:\"STRING\",values:Object.values(Xy),isNullable:!0,default:void 0}}},enableTelemetry:{description:\"If true, telemetry will be periodically sent, following the rules in https://yarnpkg.com/advanced/telemetry\",type:\"BOOLEAN\",default:!0},telemetryInterval:{description:\"Minimal amount of time between two telemetry uploads, in days\",type:\"NUMBER\",default:7},telemetryUserId:{description:\"If you desire to tell us which project you are, you can set this field. Completely optional and opt-in.\",type:\"STRING\",default:null},enableScripts:{description:\"If true, packages are allowed to have install scripts by default\",type:\"BOOLEAN\",default:!0},enableStrictSettings:{description:\"If true, unknown settings will cause Yarn to abort\",type:\"BOOLEAN\",default:!0},enableImmutableCache:{description:\"If true, the cache is reputed immutable and actions that would modify it will throw\",type:\"BOOLEAN\",default:!1},checksumBehavior:{description:\"Enumeration defining what to do when a checksum doesn't match expectations\",type:\"STRING\",default:\"throw\"},packageExtensions:{description:\"Map of package corrections to apply on the dependency tree\",type:\"MAP\",valueDefinition:{description:\"The extension that will be applied to any package whose version matches the specified range\",type:\"SHAPE\",properties:{dependencies:{description:\"The set of dependencies that must be made available to the current package in order for it to work properly\",type:\"MAP\",valueDefinition:{description:\"A range\",type:\"STRING\"}},peerDependencies:{description:\"Inherited dependencies - the consumer of the package will be tasked to provide them\",type:\"MAP\",valueDefinition:{description:\"A semver range\",type:\"STRING\"}},peerDependenciesMeta:{description:\"Extra information related to the dependencies listed in the peerDependencies field\",type:\"MAP\",valueDefinition:{description:\"The peerDependency meta\",type:\"SHAPE\",properties:{optional:{description:\"If true, the selected peer dependency will be marked as optional by the package manager and the consumer omitting it won't be reported as an error\",type:\"BOOLEAN\",default:!1}}}}}}}};function Ak(r,e,t,i,n){if(i.isArray||i.type===\"ANY\"&&Array.isArray(t))return Array.isArray(t)?t.map((s,o)=>ik(r,`${e}[${o}]`,s,i,n)):String(t).split(/,/).map(s=>ik(r,e,s,i,n));if(Array.isArray(t))throw new Error(`Non-array configuration settings \"${e}\" cannot be an array`);return ik(r,e,t,i,n)}function ik(r,e,t,i,n){var a;switch(i.type){case\"ANY\":return t;case\"SHAPE\":return Kve(r,e,t,i,n);case\"MAP\":return Uve(r,e,t,i,n)}if(t===null&&!i.isNullable&&i.default!==null)throw new Error(`Non-nullable configuration settings \"${e}\" cannot be set to null`);if((a=i.values)!=null&&a.includes(t))return t;let o=(()=>{if(i.type===\"BOOLEAN\"&&typeof t!=\"string\")return Wd(t);if(typeof t!=\"string\")throw new Error(`Expected configuration setting \"${e}\" to be a string, got ${typeof t}`);let l=Wx(t,{env:process.env});switch(i.type){case\"ABSOLUTE_PATH\":return x.resolve(n,K.toPortablePath(l));case\"LOCATOR_LOOSE\":return Dc(l,!1);case\"NUMBER\":return parseInt(l);case\"LOCATOR\":return Dc(l);case\"BOOLEAN\":return Wd(l);default:return l}})();if(i.values&&!i.values.includes(o))throw new Error(`Invalid value, expected one of ${i.values.join(\", \")}`);return o}function Kve(r,e,t,i,n){if(typeof t!=\"object\"||Array.isArray(t))throw new be(`Object configuration settings \"${e}\" must be an object`);let s=lk(r,i,{ignoreArrays:!0});if(t===null)return s;for(let[o,a]of Object.entries(t)){let l=`${e}.${o}`;if(!i.properties[o])throw new be(`Unrecognized configuration settings found: ${e}.${o} - run \"yarn config -v\" to see the list of settings supported in Yarn`);s.set(o,Ak(r,l,a,i.properties[o],n))}return s}function Uve(r,e,t,i,n){let s=new Map;if(typeof t!=\"object\"||Array.isArray(t))throw new be(`Map configuration settings \"${e}\" must be an object`);if(t===null)return s;for(let[o,a]of Object.entries(t)){let l=i.normalizeKeys?i.normalizeKeys(o):o,c=`${e}['${l}']`,u=i.valueDefinition;s.set(l,Ak(r,c,a,u,n))}return s}function lk(r,e,{ignoreArrays:t=!1}={}){switch(e.type){case\"SHAPE\":{if(e.isArray&&!t)return[];let i=new Map;for(let[n,s]of Object.entries(e.properties))i.set(n,lk(r,s));return i}break;case\"MAP\":return e.isArray&&!t?[]:new Map;case\"ABSOLUTE_PATH\":return e.default===null?null:r.projectCwd===null?x.isAbsolute(e.default)?x.normalize(e.default):e.isNullable?null:void 0:Array.isArray(e.default)?e.default.map(i=>x.resolve(r.projectCwd,i)):x.resolve(r.projectCwd,e.default);default:return e.default}}function Uw(r,e,t){if(e.type===\"SECRET\"&&typeof r==\"string\"&&t.hideSecrets)return Mve;if(e.type===\"ABSOLUTE_PATH\"&&typeof r==\"string\"&&t.getNativePaths)return K.fromPortablePath(r);if(e.isArray&&Array.isArray(r)){let i=[];for(let n of r)i.push(Uw(n,e,t));return i}if(e.type===\"MAP\"&&r instanceof Map){let i=new Map;for(let[n,s]of r.entries())i.set(n,Uw(s,e.valueDefinition,t));return i}if(e.type===\"SHAPE\"&&r instanceof Map){let i=new Map;for(let[n,s]of r.entries()){let o=e.properties[n];i.set(n,Uw(s,o,t))}return i}return r}function Hve(){let r={};for(let[e,t]of Object.entries(process.env))e=e.toLowerCase(),e.startsWith(Gw)&&(e=(0,dz.default)(e.slice(Gw.length)),r[e]=t);return r}function Hw(){let r=`${Gw}rc_filename`;for(let[e,t]of Object.entries(process.env))if(e.toLowerCase()===r&&typeof t==\"string\")return t;return sk}var ck=(i=>(i[i.LOCKFILE=0]=\"LOCKFILE\",i[i.MANIFEST=1]=\"MANIFEST\",i[i.NONE=2]=\"NONE\",i))(ck||{}),Ha=class{constructor(e){this.projectCwd=null;this.plugins=new Map;this.settings=new Map;this.values=new Map;this.sources=new Map;this.invalid=new Map;this.packageExtensions=new Map;this.limits=new Map;this.startingCwd=e}static create(e,t,i){let n=new Ha(e);typeof t<\"u\"&&!(t instanceof Map)&&(n.projectCwd=t),n.importSettings(rk);let s=typeof i<\"u\"?i:t instanceof Map?t:new Map;for(let[o,a]of s)n.activatePlugin(o,a);return n}static async find(e,t,{lookup:i=0,strict:n=!0,usePath:s=!1,useRc:o=!0}={}){let a=Hve();delete a.rcFilename;let l=await Ha.findRcFiles(e),c=await Ha.findHomeRcFile();if(c){let B=l.find(v=>v.path===c.path);B?B.strict=!1:l.push({...c,strict:!1})}let u=({ignoreCwd:B,yarnPath:v,ignorePath:D,lockfileFilename:T})=>({ignoreCwd:B,yarnPath:v,ignorePath:D,lockfileFilename:T}),g=({ignoreCwd:B,yarnPath:v,ignorePath:D,lockfileFilename:T,...H})=>H,f=new Ha(e);f.importSettings(u(rk)),f.useWithSource(\"<environment>\",u(a),e,{strict:!1});for(let{path:B,cwd:v,data:D}of l)f.useWithSource(B,u(D),v,{strict:!1});if(s){let B=f.get(\"yarnPath\"),v=f.get(\"ignorePath\");if(B!==null&&!v)return f}let h=f.get(\"lockfileFilename\"),p;switch(i){case 0:p=await Ha.findProjectCwd(e,h);break;case 1:p=await Ha.findProjectCwd(e,null);break;case 2:M.existsSync(x.join(e,\"package.json\"))?p=x.resolve(e):p=null;break}f.startingCwd=e,f.projectCwd=p,f.importSettings(g(rk));let C=new Map([[\"@@core\",S8]]),y=B=>\"default\"in B?B.default:B;if(t!==null){for(let T of t.plugins.keys())C.set(T,y(t.modules.get(T)));let B=new Map;for(let T of _D())B.set(T,()=>mf(T));for(let[T,H]of t.modules)B.set(T,()=>H);let v=new Set,D=async(T,H)=>{let{factory:j,name:$}=mf(T);if(v.has($))return;let V=new Map(B),W=A=>{if(V.has(A))return V.get(A)();throw new be(`This plugin cannot access the package referenced via ${A} which is neither a builtin, nor an exposed entry`)},_=await df(async()=>y(await j(W)),A=>`${A} (when initializing ${$}, defined in ${H})`);B.set($,()=>_),v.add($),C.set($,_)};if(a.plugins)for(let T of a.plugins.split(\";\")){let H=x.resolve(e,K.toPortablePath(T));await D(H,\"<environment>\")}for(let{path:T,cwd:H,data:j}of l)if(!!o&&!!Array.isArray(j.plugins))for(let $ of j.plugins){let V=typeof $!=\"string\"?$.path:$,W=x.resolve(H,K.toPortablePath(V));await D(W,T)}}for(let[B,v]of C)f.activatePlugin(B,v);f.useWithSource(\"<environment>\",g(a),e,{strict:n});for(let{path:B,cwd:v,data:D,strict:T}of l)f.useWithSource(B,g(D),v,{strict:T!=null?T:n});return f.get(\"enableGlobalCache\")&&(f.values.set(\"cacheFolder\",`${f.get(\"globalFolder\")}/cache`),f.sources.set(\"cacheFolder\",\"<internal>\")),await f.refreshPackageExtensions(),f}static async findRcFiles(e){let t=Hw(),i=[],n=e,s=null;for(;n!==s;){s=n;let o=x.join(s,t);if(M.existsSync(o)){let a=await M.readFilePromise(o,\"utf8\"),l;try{l=yi(a)}catch{let u=\"\";throw a.match(/^\\s+(?!-)[^:]+\\s+\\S+/m)&&(u=\" (in particular, make sure you list the colons after each key name)\"),new be(`Parse error when loading ${o}; please check it's proper Yaml${u}`)}i.push({path:o,cwd:s,data:l})}n=x.dirname(s)}return i}static async findHomeRcFile(){let e=Hw(),t=hC(),i=x.join(t,e);if(M.existsSync(i)){let n=await M.readFilePromise(i,\"utf8\"),s=yi(n);return{path:i,cwd:t,data:s}}return null}static async findProjectCwd(e,t){let i=null,n=e,s=null;for(;n!==s;){if(s=n,M.existsSync(x.join(s,\"package.json\"))&&(i=s),t!==null){if(M.existsSync(x.join(s,t))){i=s;break}}else if(i!==null)break;n=x.dirname(s)}return i}static async updateConfiguration(e,t){let i=Hw(),n=x.join(e,i),s=M.existsSync(n)?yi(await M.readFilePromise(n,\"utf8\")):{},o=!1,a;if(typeof t==\"function\"){try{a=t(s)}catch{a=t({})}if(a===s)return}else{a=s;for(let l of Object.keys(t)){let c=s[l],u=t[l],g;if(typeof u==\"function\")try{g=u(c)}catch{g=u(void 0)}else g=u;c!==g&&(a[l]=g,o=!0)}if(!o)return}await M.changeFilePromise(n,Qa(a),{automaticNewlines:!0})}static async updateHomeConfiguration(e){let t=hC();return await Ha.updateConfiguration(t,e)}activatePlugin(e,t){this.plugins.set(e,t),typeof t.configuration<\"u\"&&this.importSettings(t.configuration)}importSettings(e){for(let[t,i]of Object.entries(e))if(i!=null){if(this.settings.has(t))throw new Error(`Cannot redefine settings \"${t}\"`);this.settings.set(t,i),this.values.set(t,lk(this,i))}}useWithSource(e,t,i,n){try{this.use(e,t,i,n)}catch(s){throw s.message+=` (in ${$e(this,e,Ue.PATH)})`,s}}use(e,t,i,{strict:n=!0,overwrite:s=!1}={}){n=n&&this.get(\"enableStrictSettings\");for(let o of[\"enableStrictSettings\",...Object.keys(t)]){if(typeof t[o]>\"u\"||o===\"plugins\"||e===\"<environment>\"&&Ove.has(o))continue;if(o===\"rcFilename\")throw new be(`The rcFilename settings can only be set via ${`${Gw}RC_FILENAME`.toUpperCase()}, not via a rc file`);let l=this.settings.get(o);if(!l){if(n)throw new be(`Unrecognized or legacy configuration settings found: ${o} - run \"yarn config -v\" to see the list of settings supported in Yarn`);this.invalid.set(o,e);continue}if(this.sources.has(o)&&!(s||l.type===\"MAP\"||l.isArray&&l.concatenateValues))continue;let c;try{c=Ak(this,o,t[o],l,i)}catch(u){throw u.message+=` in ${$e(this,e,Ue.PATH)}`,u}if(o===\"enableStrictSettings\"&&e!==\"<environment>\"){n=c;continue}if(l.type===\"MAP\"){let u=this.values.get(o);this.values.set(o,new Map(s?[...u,...c]:[...c,...u])),this.sources.set(o,`${this.sources.get(o)}, ${e}`)}else if(l.isArray&&l.concatenateValues){let u=this.values.get(o);this.values.set(o,s?[...u,...c]:[...c,...u]),this.sources.set(o,`${this.sources.get(o)}, ${e}`)}else this.values.set(o,c),this.sources.set(o,e)}}get(e){if(!this.values.has(e))throw new Error(`Invalid configuration key \"${e}\"`);return this.values.get(e)}getSpecial(e,{hideSecrets:t=!1,getNativePaths:i=!1}){let n=this.get(e),s=this.settings.get(e);if(typeof s>\"u\")throw new be(`Couldn't find a configuration settings named \"${e}\"`);return Uw(n,s,{hideSecrets:t,getNativePaths:i})}getSubprocessStreams(e,{header:t,prefix:i,report:n}){let s,o,a=M.createWriteStream(e);if(this.get(\"enableInlineBuilds\")){let l=n.createStreamReporter(`${i} ${$e(this,\"STDOUT\",\"green\")}`),c=n.createStreamReporter(`${i} ${$e(this,\"STDERR\",\"red\")}`);s=new nk.PassThrough,s.pipe(l),s.pipe(a),o=new nk.PassThrough,o.pipe(c),o.pipe(a)}else s=a,o=a,typeof t<\"u\"&&s.write(`${t}\n`);return{stdout:s,stderr:o}}makeResolver(){let e=[];for(let t of this.plugins.values())for(let i of t.resolvers||[])e.push(new i);return new kf([new fC,new jr,new Nw,...e])}makeFetcher(){let e=[];for(let t of this.plugins.values())for(let i of t.fetchers||[])e.push(new i);return new Df([new Ff,new Tf,...e])}getLinkers(){let e=[];for(let t of this.plugins.values())for(let i of t.linkers||[])e.push(new i);return e}getSupportedArchitectures(){let e=pC(),t=this.get(\"supportedArchitectures\"),i=t.get(\"os\");i!==null&&(i=i.map(o=>o===\"current\"?e.os:o));let n=t.get(\"cpu\");n!==null&&(n=n.map(o=>o===\"current\"?e.cpu:o));let s=t.get(\"libc\");return s!==null&&(s=Uo(s,o=>{var a;return o===\"current\"?(a=e.libc)!=null?a:Uo.skip:o})),{os:i,cpu:n,libc:s}}async refreshPackageExtensions(){this.packageExtensions=new Map;let e=this.packageExtensions,t=(i,n,{userProvided:s=!1}={})=>{if(!so(i.range))throw new Error(\"Only semver ranges are allowed as keys for the packageExtensions setting\");let o=new ot;o.load(n,{yamlCompatibilityMode:!0});let a=hf(e,i.identHash),l=[];a.push([i.range,l]);let c={status:\"inactive\",userProvided:s,parentDescriptor:i};for(let u of o.dependencies.values())l.push({...c,type:\"Dependency\",descriptor:u});for(let u of o.peerDependencies.values())l.push({...c,type:\"PeerDependency\",descriptor:u});for(let[u,g]of o.peerDependenciesMeta)for(let[f,h]of Object.entries(g))l.push({...c,type:\"PeerDependencyMeta\",selector:u,key:f,value:h})};await this.triggerHook(i=>i.registerPackageExtensions,this,t);for(let[i,n]of this.get(\"packageExtensions\"))t(zA(i,!0),Jy(n),{userProvided:!0})}normalizePackage(e){let t=rC(e);if(this.packageExtensions==null)throw new Error(\"refreshPackageExtensions has to be called before normalizing packages\");let i=this.packageExtensions.get(e.identHash);if(typeof i<\"u\"){let s=e.version;if(s!==null){for(let[o,a]of i)if(!!kc(s,o))for(let l of a)switch(l.status===\"inactive\"&&(l.status=\"redundant\"),l.type){case\"Dependency\":typeof t.dependencies.get(l.descriptor.identHash)>\"u\"&&(l.status=\"active\",t.dependencies.set(l.descriptor.identHash,l.descriptor));break;case\"PeerDependency\":typeof t.peerDependencies.get(l.descriptor.identHash)>\"u\"&&(l.status=\"active\",t.peerDependencies.set(l.descriptor.identHash,l.descriptor));break;case\"PeerDependencyMeta\":{let c=t.peerDependenciesMeta.get(l.selector);(typeof c>\"u\"||!Object.prototype.hasOwnProperty.call(c,l.key)||c[l.key]!==l.value)&&(l.status=\"active\",Ta(t.peerDependenciesMeta,l.selector,()=>({}))[l.key]=l.value)}break;default:qx(l);break}}}let n=s=>s.scope?`${s.scope}__${s.name}`:`${s.name}`;for(let s of t.peerDependenciesMeta.keys()){let o=tn(s);t.peerDependencies.has(o.identHash)||t.peerDependencies.set(o.identHash,_t(o,\"*\"))}for(let s of t.peerDependencies.values()){if(s.scope===\"types\")continue;let o=n(s),a=qo(\"types\",o),l=Ot(a);t.peerDependencies.has(a.identHash)||t.peerDependenciesMeta.has(l)||(t.peerDependencies.set(a.identHash,_t(a,\"*\")),t.peerDependenciesMeta.set(l,{optional:!0}))}return t.dependencies=new Map(Qn(t.dependencies,([,s])=>Sn(s))),t.peerDependencies=new Map(Qn(t.peerDependencies,([,s])=>Sn(s))),t}getLimit(e){return Ta(this.limits,e,()=>(0,Cz.default)(this.get(e)))}async triggerHook(e,...t){for(let i of this.plugins.values()){let n=i.hooks;if(!n)continue;let s=e(n);!s||await s(...t)}}async triggerMultipleHooks(e,t){for(let i of t)await this.triggerHook(e,...i)}async reduceHook(e,t,...i){let n=t;for(let s of this.plugins.values()){let o=s.hooks;if(!o)continue;let a=e(o);!a||(n=await a(n,...i))}return n}async firstHook(e,...t){for(let i of this.plugins.values()){let n=i.hooks;if(!n)continue;let s=e(n);if(!s)continue;let o=await s(...t);if(typeof o<\"u\")return o}return null}},ye=Ha;ye.telemetry=null;var hk=(i=>(i[i.Never=0]=\"Never\",i[i.ErrorCode=1]=\"ErrorCode\",i[i.Always=2]=\"Always\",i))(hk||{}),dC=class extends at{constructor({fileName:t,code:i,signal:n}){let s=ye.create(x.cwd()),o=$e(s,t,Ue.PATH);super(1,`Child ${o} reported an error`,a=>{Yve(i,n,{configuration:s,report:a})});this.code=pk(i,n)}},Yw=class extends dC{constructor({fileName:t,code:i,signal:n,stdout:s,stderr:o}){super({fileName:t,code:i,signal:n});this.stdout=s,this.stderr=o}};function Nc(r){return r!==null&&typeof r.fd==\"number\"}var Tc=new Set;function uk(){}function gk(){for(let r of Tc)r.kill()}async function Wo(r,e,{cwd:t,env:i=process.env,strict:n=!1,stdin:s=null,stdout:o,stderr:a,end:l=2}){let c=[\"pipe\",\"pipe\",\"pipe\"];s===null?c[0]=\"ignore\":Nc(s)&&(c[0]=s),Nc(o)&&(c[1]=o),Nc(a)&&(c[2]=a);let u=(0,fk.default)(r,e,{cwd:K.fromPortablePath(t),env:{...i,PWD:K.fromPortablePath(t)},stdio:c});Tc.add(u),Tc.size===1&&(process.on(\"SIGINT\",uk),process.on(\"SIGTERM\",gk)),!Nc(s)&&s!==null&&s.pipe(u.stdin),Nc(o)||u.stdout.pipe(o,{end:!1}),Nc(a)||u.stderr.pipe(a,{end:!1});let g=()=>{for(let f of new Set([o,a]))Nc(f)||f.end()};return new Promise((f,h)=>{u.on(\"error\",p=>{Tc.delete(u),Tc.size===0&&(process.off(\"SIGINT\",uk),process.off(\"SIGTERM\",gk)),(l===2||l===1)&&g(),h(p)}),u.on(\"close\",(p,C)=>{Tc.delete(u),Tc.size===0&&(process.off(\"SIGINT\",uk),process.off(\"SIGTERM\",gk)),(l===2||l===1&&p>0)&&g(),p===0||!n?f({code:pk(p,C)}):h(new dC({fileName:r,code:p,signal:C}))})})}async function tk(r,e,{cwd:t,env:i=process.env,encoding:n=\"utf8\",strict:s=!1}){let o=[\"ignore\",\"pipe\",\"pipe\"],a=[],l=[],c=K.fromPortablePath(t);typeof i.PWD<\"u\"&&(i={...i,PWD:c});let u=(0,fk.default)(r,e,{cwd:c,env:i,stdio:o});return u.stdout.on(\"data\",g=>{a.push(g)}),u.stderr.on(\"data\",g=>{l.push(g)}),await new Promise((g,f)=>{u.on(\"error\",h=>{let p=ye.create(t),C=$e(p,r,Ue.PATH);f(new at(1,`Process ${C} failed to spawn`,y=>{y.reportError(1,`  ${Ho(p,{label:\"Thrown Error\",value:no(Ue.NO_HINT,h.message)})}`)}))}),u.on(\"close\",(h,p)=>{let C=n===\"buffer\"?Buffer.concat(a):Buffer.concat(a).toString(n),y=n===\"buffer\"?Buffer.concat(l):Buffer.concat(l).toString(n);h===0||!s?g({code:pk(h,p),stdout:C,stderr:y}):f(new Yw({fileName:r,code:h,signal:p,stdout:C,stderr:y}))})})}var Gve=new Map([[\"SIGINT\",2],[\"SIGQUIT\",3],[\"SIGKILL\",9],[\"SIGTERM\",15]]);function pk(r,e){let t=Gve.get(e);return typeof t<\"u\"?128+t:r!=null?r:1}function Yve(r,e,{configuration:t,report:i}){i.reportError(1,`  ${Ho(t,r!==null?{label:\"Exit Code\",value:no(Ue.NUMBER,r)}:{label:\"Exit Signal\",value:no(Ue.CODE,e)})}`)}var Xt={};ut(Xt,{Method:()=>_6,RequestError:()=>$6.RequestError,del:()=>rke,get:()=>eke,getNetworkSettings:()=>Z6,post:()=>kR,put:()=>tke,request:()=>vC});var z6=Pe(CB()),V6=J(\"https\"),X6=J(\"http\"),DR=Pe(Bn()),PR=Pe(j6()),mB=J(\"url\");var $6=Pe(CB()),q6=new Map,J6=new Map,ZDe=new X6.Agent({keepAlive:!0}),_De=new V6.Agent({keepAlive:!0});function W6(r){let e=new mB.URL(r),t={host:e.hostname,headers:{}};return e.port&&(t.port=Number(e.port)),{proxy:t}}async function xR(r){return Ta(J6,r,()=>M.readFilePromise(r).then(e=>(J6.set(r,e),e)))}function $De({statusCode:r,statusMessage:e},t){let i=$e(t,r,Ue.NUMBER),n=`https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/${r}`;return If(t,`${i}${e?` (${e})`:\"\"}`,n)}async function EB(r,{configuration:e,customErrorMessage:t}){var i,n;try{return await r}catch(s){if(s.name!==\"HTTPError\")throw s;let o=(n=t==null?void 0:t(s))!=null?n:(i=s.response.body)==null?void 0:i.error;o==null&&(s.message.startsWith(\"Response code\")?o=\"The remote server failed to provide the requested resource\":o=s.message),s instanceof z6.TimeoutError&&s.event===\"socket\"&&(o+=`(can be increased via ${$e(e,\"httpTimeout\",Ue.SETTING)})`);let a=new at(35,o,l=>{s.response&&l.reportError(35,`  ${Ho(e,{label:\"Response Code\",value:no(Ue.NO_HINT,$De(s.response,e))})}`),s.request&&(l.reportError(35,`  ${Ho(e,{label:\"Request Method\",value:no(Ue.NO_HINT,s.request.options.method)})}`),l.reportError(35,`  ${Ho(e,{label:\"Request URL\",value:no(Ue.URL,s.request.requestUrl)})}`)),s.request.redirects.length>0&&l.reportError(35,`  ${Ho(e,{label:\"Request Redirects\",value:no(Ue.NO_HINT,tP(e,s.request.redirects,Ue.URL))})}`),s.request.retryCount===s.request.options.retry.limit&&l.reportError(35,`  ${Ho(e,{label:\"Request Retry Count\",value:no(Ue.NO_HINT,`${$e(e,s.request.retryCount,Ue.NUMBER)} (can be increased via ${$e(e,\"httpRetry\",Ue.SETTING)})`)})}`)});throw a.originalError=s,a}}function Z6(r,e){let t=[...e.configuration.get(\"networkSettings\")].sort(([o],[a])=>a.length-o.length),i={enableNetwork:void 0,caFilePath:void 0,httpProxy:void 0,httpsProxy:void 0,httpsKeyFilePath:void 0,httpsCertFilePath:void 0},n=Object.keys(i),s=typeof r==\"string\"?new mB.URL(r):r;for(let[o,a]of t)if(DR.default.isMatch(s.hostname,o))for(let l of n){let c=a.get(l);c!==null&&typeof i[l]>\"u\"&&(i[l]=c)}for(let o of n)typeof i[o]>\"u\"&&(i[o]=e.configuration.get(o));return i}var _6=(n=>(n.GET=\"GET\",n.PUT=\"PUT\",n.POST=\"POST\",n.DELETE=\"DELETE\",n))(_6||{});async function vC(r,e,{configuration:t,headers:i,jsonRequest:n,jsonResponse:s,method:o=\"GET\"}){let a=async()=>await ike(r,e,{configuration:t,headers:i,jsonRequest:n,jsonResponse:s,method:o});return await(await t.reduceHook(c=>c.wrapNetworkRequest,a,{target:r,body:e,configuration:t,headers:i,jsonRequest:n,jsonResponse:s,method:o}))()}async function eke(r,{configuration:e,jsonResponse:t,...i}){let n=Ta(q6,r,()=>EB(vC(r,null,{configuration:e,...i}),{configuration:e}).then(s=>(q6.set(r,s.body),s.body)));return Buffer.isBuffer(n)===!1&&(n=await n),t?JSON.parse(n.toString()):n}async function tke(r,e,{customErrorMessage:t,...i}){return(await EB(vC(r,e,{...i,method:\"PUT\"}),i)).body}async function kR(r,e,{customErrorMessage:t,...i}){return(await EB(vC(r,e,{...i,method:\"POST\"}),i)).body}async function rke(r,{customErrorMessage:e,...t}){return(await EB(vC(r,null,{...t,method:\"DELETE\"}),t)).body}async function ike(r,e,{configuration:t,headers:i,jsonRequest:n,jsonResponse:s,method:o=\"GET\"}){let a=typeof r==\"string\"?new mB.URL(r):r,l=Z6(a,{configuration:t});if(l.enableNetwork===!1)throw new Error(`Request to '${a.href}' has been blocked because of your configuration settings`);if(a.protocol===\"http:\"&&!DR.default.isMatch(a.hostname,t.get(\"unsafeHttpWhitelist\")))throw new Error(`Unsafe http requests must be explicitly whitelisted in your configuration (${a.hostname})`);let u={agent:{http:l.httpProxy?PR.default.httpOverHttp(W6(l.httpProxy)):ZDe,https:l.httpsProxy?PR.default.httpsOverHttp(W6(l.httpsProxy)):_De},headers:i,method:o};u.responseType=s?\"json\":\"buffer\",e!==null&&(Buffer.isBuffer(e)||!n&&typeof e==\"string\"?u.body=e:u.json=e);let g=t.get(\"httpTimeout\"),f=t.get(\"httpRetry\"),h=t.get(\"enableStrictSsl\"),p=l.caFilePath,C=l.httpsCertFilePath,y=l.httpsKeyFilePath,{default:B}=await Promise.resolve().then(()=>Pe(CB())),v=p?await xR(p):void 0,D=C?await xR(C):void 0,T=y?await xR(y):void 0,H=B.extend({timeout:{socket:g},retry:f,https:{rejectUnauthorized:h,certificateAuthority:v,certificate:D,key:T},...u});return t.getLimit(\"networkConcurrency\")(()=>H(a))}var Wt={};ut(Wt,{PackageManager:()=>u9,detectPackageManager:()=>g9,executePackageAccessibleBinary:()=>C9,executePackageScript:()=>TB,executePackageShellcode:()=>JR,executeWorkspaceAccessibleBinary:()=>wRe,executeWorkspaceLifecycleScript:()=>p9,executeWorkspaceScript:()=>h9,getPackageAccessibleBinaries:()=>LB,getWorkspaceAccessibleBinaries:()=>d9,hasPackageScript:()=>ERe,hasWorkspaceScript:()=>WR,makeScriptEnv:()=>FC,maybeExecuteWorkspaceLifecycleScript:()=>yRe,prepareExternalProject:()=>mRe});var xC={};ut(xC,{getLibzipPromise:()=>an,getLibzipSync:()=>sV});var nV=Pe(tV());var Ja=[\"number\",\"number\"],rV=(F=>(F[F.ZIP_ER_OK=0]=\"ZIP_ER_OK\",F[F.ZIP_ER_MULTIDISK=1]=\"ZIP_ER_MULTIDISK\",F[F.ZIP_ER_RENAME=2]=\"ZIP_ER_RENAME\",F[F.ZIP_ER_CLOSE=3]=\"ZIP_ER_CLOSE\",F[F.ZIP_ER_SEEK=4]=\"ZIP_ER_SEEK\",F[F.ZIP_ER_READ=5]=\"ZIP_ER_READ\",F[F.ZIP_ER_WRITE=6]=\"ZIP_ER_WRITE\",F[F.ZIP_ER_CRC=7]=\"ZIP_ER_CRC\",F[F.ZIP_ER_ZIPCLOSED=8]=\"ZIP_ER_ZIPCLOSED\",F[F.ZIP_ER_NOENT=9]=\"ZIP_ER_NOENT\",F[F.ZIP_ER_EXISTS=10]=\"ZIP_ER_EXISTS\",F[F.ZIP_ER_OPEN=11]=\"ZIP_ER_OPEN\",F[F.ZIP_ER_TMPOPEN=12]=\"ZIP_ER_TMPOPEN\",F[F.ZIP_ER_ZLIB=13]=\"ZIP_ER_ZLIB\",F[F.ZIP_ER_MEMORY=14]=\"ZIP_ER_MEMORY\",F[F.ZIP_ER_CHANGED=15]=\"ZIP_ER_CHANGED\",F[F.ZIP_ER_COMPNOTSUPP=16]=\"ZIP_ER_COMPNOTSUPP\",F[F.ZIP_ER_EOF=17]=\"ZIP_ER_EOF\",F[F.ZIP_ER_INVAL=18]=\"ZIP_ER_INVAL\",F[F.ZIP_ER_NOZIP=19]=\"ZIP_ER_NOZIP\",F[F.ZIP_ER_INTERNAL=20]=\"ZIP_ER_INTERNAL\",F[F.ZIP_ER_INCONS=21]=\"ZIP_ER_INCONS\",F[F.ZIP_ER_REMOVE=22]=\"ZIP_ER_REMOVE\",F[F.ZIP_ER_DELETED=23]=\"ZIP_ER_DELETED\",F[F.ZIP_ER_ENCRNOTSUPP=24]=\"ZIP_ER_ENCRNOTSUPP\",F[F.ZIP_ER_RDONLY=25]=\"ZIP_ER_RDONLY\",F[F.ZIP_ER_NOPASSWD=26]=\"ZIP_ER_NOPASSWD\",F[F.ZIP_ER_WRONGPASSWD=27]=\"ZIP_ER_WRONGPASSWD\",F[F.ZIP_ER_OPNOTSUPP=28]=\"ZIP_ER_OPNOTSUPP\",F[F.ZIP_ER_INUSE=29]=\"ZIP_ER_INUSE\",F[F.ZIP_ER_TELL=30]=\"ZIP_ER_TELL\",F[F.ZIP_ER_COMPRESSED_DATA=31]=\"ZIP_ER_COMPRESSED_DATA\",F))(rV||{}),iV=r=>({get HEAP8(){return r.HEAP8},get HEAPU8(){return r.HEAPU8},errors:rV,SEEK_SET:0,SEEK_CUR:1,SEEK_END:2,ZIP_CHECKCONS:4,ZIP_CREATE:1,ZIP_EXCL:2,ZIP_TRUNCATE:8,ZIP_RDONLY:16,ZIP_FL_OVERWRITE:8192,ZIP_FL_COMPRESSED:4,ZIP_OPSYS_DOS:0,ZIP_OPSYS_AMIGA:1,ZIP_OPSYS_OPENVMS:2,ZIP_OPSYS_UNIX:3,ZIP_OPSYS_VM_CMS:4,ZIP_OPSYS_ATARI_ST:5,ZIP_OPSYS_OS_2:6,ZIP_OPSYS_MACINTOSH:7,ZIP_OPSYS_Z_SYSTEM:8,ZIP_OPSYS_CPM:9,ZIP_OPSYS_WINDOWS_NTFS:10,ZIP_OPSYS_MVS:11,ZIP_OPSYS_VSE:12,ZIP_OPSYS_ACORN_RISC:13,ZIP_OPSYS_VFAT:14,ZIP_OPSYS_ALTERNATE_MVS:15,ZIP_OPSYS_BEOS:16,ZIP_OPSYS_TANDEM:17,ZIP_OPSYS_OS_400:18,ZIP_OPSYS_OS_X:19,ZIP_CM_DEFAULT:-1,ZIP_CM_STORE:0,ZIP_CM_DEFLATE:8,uint08S:r._malloc(1),uint16S:r._malloc(2),uint32S:r._malloc(4),uint64S:r._malloc(8),malloc:r._malloc,free:r._free,getValue:r.getValue,open:r.cwrap(\"zip_open\",\"number\",[\"string\",\"number\",\"number\"]),openFromSource:r.cwrap(\"zip_open_from_source\",\"number\",[\"number\",\"number\",\"number\"]),close:r.cwrap(\"zip_close\",\"number\",[\"number\"]),discard:r.cwrap(\"zip_discard\",null,[\"number\"]),getError:r.cwrap(\"zip_get_error\",\"number\",[\"number\"]),getName:r.cwrap(\"zip_get_name\",\"string\",[\"number\",\"number\",\"number\"]),getNumEntries:r.cwrap(\"zip_get_num_entries\",\"number\",[\"number\",\"number\"]),delete:r.cwrap(\"zip_delete\",\"number\",[\"number\",\"number\"]),stat:r.cwrap(\"zip_stat\",\"number\",[\"number\",\"string\",\"number\",\"number\"]),statIndex:r.cwrap(\"zip_stat_index\",\"number\",[\"number\",...Ja,\"number\",\"number\"]),fopen:r.cwrap(\"zip_fopen\",\"number\",[\"number\",\"string\",\"number\"]),fopenIndex:r.cwrap(\"zip_fopen_index\",\"number\",[\"number\",...Ja,\"number\"]),fread:r.cwrap(\"zip_fread\",\"number\",[\"number\",\"number\",\"number\",\"number\"]),fclose:r.cwrap(\"zip_fclose\",\"number\",[\"number\"]),dir:{add:r.cwrap(\"zip_dir_add\",\"number\",[\"number\",\"string\"])},file:{add:r.cwrap(\"zip_file_add\",\"number\",[\"number\",\"string\",\"number\",\"number\"]),getError:r.cwrap(\"zip_file_get_error\",\"number\",[\"number\"]),getExternalAttributes:r.cwrap(\"zip_file_get_external_attributes\",\"number\",[\"number\",...Ja,\"number\",\"number\",\"number\"]),setExternalAttributes:r.cwrap(\"zip_file_set_external_attributes\",\"number\",[\"number\",...Ja,\"number\",\"number\",\"number\"]),setMtime:r.cwrap(\"zip_file_set_mtime\",\"number\",[\"number\",...Ja,\"number\",\"number\"]),setCompression:r.cwrap(\"zip_set_file_compression\",\"number\",[\"number\",...Ja,\"number\",\"number\"])},ext:{countSymlinks:r.cwrap(\"zip_ext_count_symlinks\",\"number\",[\"number\"])},error:{initWithCode:r.cwrap(\"zip_error_init_with_code\",null,[\"number\",\"number\"]),strerror:r.cwrap(\"zip_error_strerror\",\"string\",[\"number\"])},name:{locate:r.cwrap(\"zip_name_locate\",\"number\",[\"number\",\"string\",\"number\"])},source:{fromUnattachedBuffer:r.cwrap(\"zip_source_buffer_create\",\"number\",[\"number\",...Ja,\"number\",\"number\"]),fromBuffer:r.cwrap(\"zip_source_buffer\",\"number\",[\"number\",\"number\",...Ja,\"number\"]),free:r.cwrap(\"zip_source_free\",null,[\"number\"]),keep:r.cwrap(\"zip_source_keep\",null,[\"number\"]),open:r.cwrap(\"zip_source_open\",\"number\",[\"number\"]),close:r.cwrap(\"zip_source_close\",\"number\",[\"number\"]),seek:r.cwrap(\"zip_source_seek\",\"number\",[\"number\",...Ja,\"number\"]),tell:r.cwrap(\"zip_source_tell\",\"number\",[\"number\"]),read:r.cwrap(\"zip_source_read\",\"number\",[\"number\",\"number\",\"number\"]),error:r.cwrap(\"zip_source_error\",\"number\",[\"number\"]),setMtime:r.cwrap(\"zip_source_set_mtime\",\"number\",[\"number\",\"number\"])},struct:{stat:r.cwrap(\"zipstruct_stat\",\"number\",[]),statS:r.cwrap(\"zipstruct_statS\",\"number\",[]),statName:r.cwrap(\"zipstruct_stat_name\",\"string\",[\"number\"]),statIndex:r.cwrap(\"zipstruct_stat_index\",\"number\",[\"number\"]),statSize:r.cwrap(\"zipstruct_stat_size\",\"number\",[\"number\"]),statCompSize:r.cwrap(\"zipstruct_stat_comp_size\",\"number\",[\"number\"]),statCompMethod:r.cwrap(\"zipstruct_stat_comp_method\",\"number\",[\"number\"]),statMtime:r.cwrap(\"zipstruct_stat_mtime\",\"number\",[\"number\"]),statCrc:r.cwrap(\"zipstruct_stat_crc\",\"number\",[\"number\"]),error:r.cwrap(\"zipstruct_error\",\"number\",[]),errorS:r.cwrap(\"zipstruct_errorS\",\"number\",[]),errorCodeZip:r.cwrap(\"zipstruct_error_code_zip\",\"number\",[\"number\"])}});var NR=null;function sV(){return NR===null&&(NR=iV((0,nV.default)())),NR}async function an(){return sV()}var RC={};ut(RC,{ShellError:()=>zn,execute:()=>xB,globUtils:()=>BB});var EV=Pe(wx()),IV=J(\"os\"),Vn=J(\"stream\"),yV=J(\"util\");var zn=class extends Error{constructor(e){super(e),this.name=\"ShellError\"}};var BB={};ut(BB,{fastGlobOptions:()=>AV,isBraceExpansion:()=>TR,isGlobPattern:()=>nke,match:()=>ske,micromatchOptions:()=>wB});var oV=Pe(dw()),aV=Pe(J(\"fs\")),yB=Pe(Bn()),wB={strictBrackets:!0},AV={onlyDirectories:!1,onlyFiles:!1};function nke(r){if(!yB.default.scan(r,wB).isGlob)return!1;try{yB.default.parse(r,wB)}catch{return!1}return!0}function ske(r,{cwd:e,baseFs:t}){return(0,oV.default)(r,{...AV,cwd:K.fromPortablePath(e),fs:AI(aV.default,new vg(t))})}function TR(r){return yB.default.scan(r,wB).isBrace}var cV=Pe(TS()),Vo=J(\"stream\"),uV=J(\"string_decoder\");var Mc=new Set;function LR(){}function OR(){for(let r of Mc)r.kill()}function gV(r,e,t,i){return n=>{let s=n[0]instanceof Vo.Transform?\"pipe\":n[0],o=n[1]instanceof Vo.Transform?\"pipe\":n[1],a=n[2]instanceof Vo.Transform?\"pipe\":n[2],l=(0,cV.default)(r,e,{...i,stdio:[s,o,a]});return Mc.add(l),Mc.size===1&&(process.on(\"SIGINT\",LR),process.on(\"SIGTERM\",OR)),n[0]instanceof Vo.Transform&&n[0].pipe(l.stdin),n[1]instanceof Vo.Transform&&l.stdout.pipe(n[1],{end:!1}),n[2]instanceof Vo.Transform&&l.stderr.pipe(n[2],{end:!1}),{stdin:l.stdin,promise:new Promise(c=>{l.on(\"error\",u=>{switch(Mc.delete(l),Mc.size===0&&(process.off(\"SIGINT\",LR),process.off(\"SIGTERM\",OR)),u.code){case\"ENOENT\":n[2].write(`command not found: ${r}\n`),c(127);break;case\"EACCES\":n[2].write(`permission denied: ${r}\n`),c(128);break;default:n[2].write(`uncaught error: ${u.message}\n`),c(1);break}}),l.on(\"close\",u=>{Mc.delete(l),Mc.size===0&&(process.off(\"SIGINT\",LR),process.off(\"SIGTERM\",OR)),c(u!==null?u:129)})})}}}function fV(r){return e=>{let t=e[0]===\"pipe\"?new Vo.PassThrough:e[0];return{stdin:t,promise:Promise.resolve().then(()=>r({stdin:t,stdout:e[1],stderr:e[2]}))}}}var Ss=class{constructor(e){this.stream=e}close(){}get(){return this.stream}},MR=class{constructor(){this.stream=null}close(){if(this.stream===null)throw new Error(\"Assertion failed: No stream attached\");this.stream.end()}attach(e){this.stream=e}get(){if(this.stream===null)throw new Error(\"Assertion failed: No stream attached\");return this.stream}},zf=class{constructor(e,t){this.stdin=null;this.stdout=null;this.stderr=null;this.pipe=null;this.ancestor=e,this.implementation=t}static start(e,{stdin:t,stdout:i,stderr:n}){let s=new zf(null,e);return s.stdin=t,s.stdout=i,s.stderr=n,s}pipeTo(e,t=1){let i=new zf(this,e),n=new MR;return i.pipe=n,i.stdout=this.stdout,i.stderr=this.stderr,(t&1)===1?this.stdout=n:this.ancestor!==null&&(this.stderr=this.ancestor.stdout),(t&2)===2?this.stderr=n:this.ancestor!==null&&(this.stderr=this.ancestor.stderr),i}async exec(){let e=[\"ignore\",\"ignore\",\"ignore\"];if(this.pipe)e[0]=\"pipe\";else{if(this.stdin===null)throw new Error(\"Assertion failed: No input stream registered\");e[0]=this.stdin.get()}let t;if(this.stdout===null)throw new Error(\"Assertion failed: No output stream registered\");t=this.stdout,e[1]=t.get();let i;if(this.stderr===null)throw new Error(\"Assertion failed: No error stream registered\");i=this.stderr,e[2]=i.get();let n=this.implementation(e);return this.pipe&&this.pipe.attach(n.stdin),await n.promise.then(s=>(t.close(),i.close(),s))}async run(){let e=[];for(let i=this;i;i=i.ancestor)e.push(i.exec());return(await Promise.all(e))[0]}};function QB(r,e){return zf.start(r,e)}function lV(r,e=null){let t=new Vo.PassThrough,i=new uV.StringDecoder,n=\"\";return t.on(\"data\",s=>{let o=i.write(s),a;do if(a=o.indexOf(`\n`),a!==-1){let l=n+o.substring(0,a);o=o.substring(a+1),n=\"\",r(e!==null?`${e} ${l}`:l)}while(a!==-1);n+=o}),t.on(\"end\",()=>{let s=i.end();s!==\"\"&&r(e!==null?`${e} ${s}`:s)}),t}function hV(r,{prefix:e}){return{stdout:lV(t=>r.stdout.write(`${t}\n`),r.stdout.isTTY?e:null),stderr:lV(t=>r.stderr.write(`${t}\n`),r.stderr.isTTY?e:null)}}var oke=(0,yV.promisify)(setTimeout);function pV(r,e,t){let i=new Vn.PassThrough({autoDestroy:!0});switch(r){case 0:(e&1)===1&&t.stdin.pipe(i,{end:!1}),(e&2)===2&&t.stdin instanceof Vn.Writable&&i.pipe(t.stdin,{end:!1});break;case 1:(e&1)===1&&t.stdout.pipe(i,{end:!1}),(e&2)===2&&i.pipe(t.stdout,{end:!1});break;case 2:(e&1)===1&&t.stderr.pipe(i,{end:!1}),(e&2)===2&&i.pipe(t.stderr,{end:!1});break;default:throw new zn(`Bad file descriptor: \"${r}\"`)}return i}function SB(r,e={}){let t={...r,...e};return t.environment={...r.environment,...e.environment},t.variables={...r.variables,...e.variables},t}var ake=new Map([[\"cd\",async([r=(0,IV.homedir)(),...e],t,i)=>{let n=x.resolve(i.cwd,K.toPortablePath(r));if(!(await t.baseFs.statPromise(n).catch(o=>{throw o.code===\"ENOENT\"?new zn(`cd: no such file or directory: ${r}`):o})).isDirectory())throw new zn(`cd: not a directory: ${r}`);return i.cwd=n,0}],[\"pwd\",async(r,e,t)=>(t.stdout.write(`${K.fromPortablePath(t.cwd)}\n`),0)],[\":\",async(r,e,t)=>0],[\"true\",async(r,e,t)=>0],[\"false\",async(r,e,t)=>1],[\"exit\",async([r,...e],t,i)=>i.exitCode=parseInt(r!=null?r:i.variables[\"?\"],10)],[\"echo\",async(r,e,t)=>(t.stdout.write(`${r.join(\" \")}\n`),0)],[\"sleep\",async([r],e,t)=>{if(typeof r>\"u\")throw new zn(\"sleep: missing operand\");let i=Number(r);if(Number.isNaN(i))throw new zn(`sleep: invalid time interval '${r}'`);return await oke(1e3*i,0)}],[\"__ysh_run_procedure\",async(r,e,t)=>{let i=t.procedures[r[0]];return await QB(i,{stdin:new Ss(t.stdin),stdout:new Ss(t.stdout),stderr:new Ss(t.stderr)}).run()}],[\"__ysh_set_redirects\",async(r,e,t)=>{let i=t.stdin,n=t.stdout,s=t.stderr,o=[],a=[],l=[],c=0;for(;r[c]!==\"--\";){let g=r[c++],{type:f,fd:h}=JSON.parse(g),p=v=>{switch(h){case null:case 0:o.push(v);break;default:throw new Error(`Unsupported file descriptor: \"${h}\"`)}},C=v=>{switch(h){case null:case 1:a.push(v);break;case 2:l.push(v);break;default:throw new Error(`Unsupported file descriptor: \"${h}\"`)}},y=Number(r[c++]),B=c+y;for(let v=c;v<B;++c,++v)switch(f){case\"<\":p(()=>e.baseFs.createReadStream(x.resolve(t.cwd,K.toPortablePath(r[v]))));break;case\"<<<\":p(()=>{let D=new Vn.PassThrough;return process.nextTick(()=>{D.write(`${r[v]}\n`),D.end()}),D});break;case\"<&\":p(()=>pV(Number(r[v]),1,t));break;case\">\":case\">>\":{let D=x.resolve(t.cwd,K.toPortablePath(r[v]));C(D===\"/dev/null\"?new Vn.Writable({autoDestroy:!0,emitClose:!0,write(T,H,j){setImmediate(j)}}):e.baseFs.createWriteStream(D,f===\">>\"?{flags:\"a\"}:void 0))}break;case\">&\":C(pV(Number(r[v]),2,t));break;default:throw new Error(`Assertion failed: Unsupported redirection type: \"${f}\"`)}}if(o.length>0){let g=new Vn.PassThrough;i=g;let f=h=>{if(h===o.length)g.end();else{let p=o[h]();p.pipe(g,{end:!1}),p.on(\"end\",()=>{f(h+1)})}};f(0)}if(a.length>0){let g=new Vn.PassThrough;n=g;for(let f of a)g.pipe(f)}if(l.length>0){let g=new Vn.PassThrough;s=g;for(let f of l)g.pipe(f)}let u=await QB(DC(r.slice(c+1),e,t),{stdin:new Ss(i),stdout:new Ss(n),stderr:new Ss(s)}).run();return await Promise.all(a.map(g=>new Promise((f,h)=>{g.on(\"error\",p=>{h(p)}),g.on(\"close\",()=>{f()}),g.end()}))),await Promise.all(l.map(g=>new Promise((f,h)=>{g.on(\"error\",p=>{h(p)}),g.on(\"close\",()=>{f()}),g.end()}))),u}]]);async function Ake(r,e,t){let i=[],n=new Vn.PassThrough;return n.on(\"data\",s=>i.push(s)),await vB(r,e,SB(t,{stdout:n})),Buffer.concat(i).toString().replace(/[\\r\\n]+$/,\"\")}async function dV(r,e,t){let i=r.map(async s=>{let o=await Kc(s.args,e,t);return{name:s.name,value:o.join(\" \")}});return(await Promise.all(i)).reduce((s,o)=>(s[o.name]=o.value,s),{})}function bB(r){return r.match(/[^ \\r\\n\\t]+/g)||[]}async function wV(r,e,t,i,n=i){switch(r.name){case\"$\":i(String(process.pid));break;case\"#\":i(String(e.args.length));break;case\"@\":if(r.quoted)for(let s of e.args)n(s);else for(let s of e.args){let o=bB(s);for(let a=0;a<o.length-1;++a)n(o[a]);i(o[o.length-1])}break;case\"*\":{let s=e.args.join(\" \");if(r.quoted)i(s);else for(let o of bB(s))n(o)}break;case\"PPID\":i(String(process.ppid));break;case\"RANDOM\":i(String(Math.floor(Math.random()*32768)));break;default:{let s=parseInt(r.name,10),o,a=Number.isFinite(s);if(a?s>=0&&s<e.args.length&&(o=e.args[s]):Object.prototype.hasOwnProperty.call(t.variables,r.name)?o=t.variables[r.name]:Object.prototype.hasOwnProperty.call(t.environment,r.name)&&(o=t.environment[r.name]),typeof o<\"u\"&&r.alternativeValue?o=(await Kc(r.alternativeValue,e,t)).join(\" \"):typeof o>\"u\"&&(r.defaultValue?o=(await Kc(r.defaultValue,e,t)).join(\" \"):r.alternativeValue&&(o=\"\")),typeof o>\"u\")throw a?new zn(`Unbound argument #${s}`):new zn(`Unbound variable \"${r.name}\"`);if(r.quoted)i(o);else{let l=bB(o);for(let u=0;u<l.length-1;++u)n(l[u]);let c=l[l.length-1];typeof c<\"u\"&&i(c)}}break}}var lke={addition:(r,e)=>r+e,subtraction:(r,e)=>r-e,multiplication:(r,e)=>r*e,division:(r,e)=>Math.trunc(r/e)};async function PC(r,e,t){if(r.type===\"number\"){if(Number.isInteger(r.value))return r.value;throw new Error(`Invalid number: \"${r.value}\", only integers are allowed`)}else if(r.type===\"variable\"){let i=[];await wV({...r,quoted:!0},e,t,s=>i.push(s));let n=Number(i.join(\" \"));return Number.isNaN(n)?PC({type:\"variable\",name:i.join(\" \")},e,t):PC({type:\"number\",value:n},e,t)}else return lke[r.type](await PC(r.left,e,t),await PC(r.right,e,t))}async function Kc(r,e,t){let i=new Map,n=[],s=[],o=u=>{s.push(u)},a=()=>{s.length>0&&n.push(s.join(\"\")),s=[]},l=u=>{o(u),a()},c=(u,g,f)=>{let h=JSON.stringify({type:u,fd:g}),p=i.get(h);typeof p>\"u\"&&i.set(h,p=[]),p.push(f)};for(let u of r){let g=!1;switch(u.type){case\"redirection\":{let f=await Kc(u.args,e,t);for(let h of f)c(u.subtype,u.fd,h)}break;case\"argument\":for(let f of u.segments)switch(f.type){case\"text\":o(f.text);break;case\"glob\":o(f.pattern),g=!0;break;case\"shell\":{let h=await Ake(f.shell,e,t);if(f.quoted)o(h);else{let p=bB(h);for(let C=0;C<p.length-1;++C)l(p[C]);o(p[p.length-1])}}break;case\"variable\":await wV(f,e,t,o,l);break;case\"arithmetic\":o(String(await PC(f.arithmetic,e,t)));break}break}if(a(),g){let f=n.pop();if(typeof f>\"u\")throw new Error(\"Assertion failed: Expected a glob pattern to have been set\");let h=await e.glob.match(f,{cwd:t.cwd,baseFs:e.baseFs});if(h.length===0){let p=TR(f)?\". Note: Brace expansion of arbitrary strings isn't currently supported. For more details, please read this issue: https://github.com/yarnpkg/berry/issues/22\":\"\";throw new zn(`No matches found: \"${f}\"${p}`)}for(let p of h.sort())l(p)}}if(i.size>0){let u=[];for(let[g,f]of i.entries())u.splice(u.length,0,g,String(f.length),...f);n.splice(0,0,\"__ysh_set_redirects\",...u,\"--\")}return n}function DC(r,e,t){e.builtins.has(r[0])||(r=[\"command\",...r]);let i=K.fromPortablePath(t.cwd),n=t.environment;typeof n.PWD<\"u\"&&(n={...n,PWD:i});let[s,...o]=r;if(s===\"command\")return gV(o[0],o.slice(1),e,{cwd:i,env:n});let a=e.builtins.get(s);if(typeof a>\"u\")throw new Error(`Assertion failed: A builtin should exist for \"${s}\"`);return fV(async({stdin:l,stdout:c,stderr:u})=>{let{stdin:g,stdout:f,stderr:h}=t;t.stdin=l,t.stdout=c,t.stderr=u;try{return await a(o,e,t)}finally{t.stdin=g,t.stdout=f,t.stderr=h}})}function cke(r,e,t){return i=>{let n=new Vn.PassThrough,s=vB(r,e,SB(t,{stdin:n}));return{stdin:n,promise:s}}}function uke(r,e,t){return i=>{let n=new Vn.PassThrough,s=vB(r,e,t);return{stdin:n,promise:s}}}function CV(r,e,t,i){if(e.length===0)return r;{let n;do n=String(Math.random());while(Object.prototype.hasOwnProperty.call(i.procedures,n));return i.procedures={...i.procedures},i.procedures[n]=r,DC([...e,\"__ysh_run_procedure\",n],t,i)}}async function mV(r,e,t){let i=r,n=null,s=null;for(;i;){let o=i.then?{...t}:t,a;switch(i.type){case\"command\":{let l=await Kc(i.args,e,t),c=await dV(i.envs,e,t);a=i.envs.length?DC(l,e,SB(o,{environment:c})):DC(l,e,o)}break;case\"subshell\":{let l=await Kc(i.args,e,t),c=cke(i.subshell,e,o);a=CV(c,l,e,o)}break;case\"group\":{let l=await Kc(i.args,e,t),c=uke(i.group,e,o);a=CV(c,l,e,o)}break;case\"envs\":{let l=await dV(i.envs,e,t);o.environment={...o.environment,...l},a=DC([\"true\"],e,o)}break}if(typeof a>\"u\")throw new Error(\"Assertion failed: An action should have been generated\");if(n===null)s=QB(a,{stdin:new Ss(o.stdin),stdout:new Ss(o.stdout),stderr:new Ss(o.stderr)});else{if(s===null)throw new Error(\"Assertion failed: The execution pipeline should have been setup\");switch(n){case\"|\":s=s.pipeTo(a,1);break;case\"|&\":s=s.pipeTo(a,3);break}}i.then?(n=i.then.type,i=i.then.chain):i=null}if(s===null)throw new Error(\"Assertion failed: The execution pipeline should have been setup\");return await s.run()}async function gke(r,e,t,{background:i=!1}={}){function n(s){let o=[\"#2E86AB\",\"#A23B72\",\"#F18F01\",\"#C73E1D\",\"#CCE2A3\"],a=o[s%o.length];return EV.default.hex(a)}if(i){let s=t.nextBackgroundJobIndex++,o=n(s),a=`[${s}]`,l=o(a),{stdout:c,stderr:u}=hV(t,{prefix:l});return t.backgroundJobs.push(mV(r,e,SB(t,{stdout:c,stderr:u})).catch(g=>u.write(`${g.message}\n`)).finally(()=>{t.stdout.isTTY&&t.stdout.write(`Job ${l}, '${o(Fg(r))}' has ended\n`)})),0}return await mV(r,e,t)}async function fke(r,e,t,{background:i=!1}={}){let n,s=a=>{n=a,t.variables[\"?\"]=String(a)},o=async a=>{try{return await gke(a.chain,e,t,{background:i&&typeof a.then>\"u\"})}catch(l){if(!(l instanceof zn))throw l;return t.stderr.write(`${l.message}\n`),1}};for(s(await o(r));r.then;){if(t.exitCode!==null)return t.exitCode;switch(r.then.type){case\"&&\":n===0&&s(await o(r.then.line));break;case\"||\":n!==0&&s(await o(r.then.line));break;default:throw new Error(`Assertion failed: Unsupported command type: \"${r.then.type}\"`)}r=r.then.line}return n}async function vB(r,e,t){let i=t.backgroundJobs;t.backgroundJobs=[];let n=0;for(let{command:s,type:o}of r){if(n=await fke(s,e,t,{background:o===\"&\"}),t.exitCode!==null)return t.exitCode;t.variables[\"?\"]=String(n)}return await Promise.all(t.backgroundJobs),t.backgroundJobs=i,n}function BV(r){switch(r.type){case\"variable\":return r.name===\"@\"||r.name===\"#\"||r.name===\"*\"||Number.isFinite(parseInt(r.name,10))||\"defaultValue\"in r&&!!r.defaultValue&&r.defaultValue.some(e=>kC(e))||\"alternativeValue\"in r&&!!r.alternativeValue&&r.alternativeValue.some(e=>kC(e));case\"arithmetic\":return KR(r.arithmetic);case\"shell\":return UR(r.shell);default:return!1}}function kC(r){switch(r.type){case\"redirection\":return r.args.some(e=>kC(e));case\"argument\":return r.segments.some(e=>BV(e));default:throw new Error(`Assertion failed: Unsupported argument type: \"${r.type}\"`)}}function KR(r){switch(r.type){case\"variable\":return BV(r);case\"number\":return!1;default:return KR(r.left)||KR(r.right)}}function UR(r){return r.some(({command:e})=>{for(;e;){let t=e.chain;for(;t;){let i;switch(t.type){case\"subshell\":i=UR(t.subshell);break;case\"command\":i=t.envs.some(n=>n.args.some(s=>kC(s)))||t.args.some(n=>kC(n));break}if(i)return!0;if(!t.then)break;t=t.then.chain}if(!e.then)break;e=e.then.line}return!1})}async function xB(r,e=[],{baseFs:t=new $t,builtins:i={},cwd:n=K.toPortablePath(process.cwd()),env:s=process.env,stdin:o=process.stdin,stdout:a=process.stdout,stderr:l=process.stderr,variables:c={},glob:u=BB}={}){let g={};for(let[p,C]of Object.entries(s))typeof C<\"u\"&&(g[p]=C);let f=new Map(ake);for(let[p,C]of Object.entries(i))f.set(p,C);o===null&&(o=new Vn.PassThrough,o.end());let h=uI(r,u);if(!UR(h)&&h.length>0&&e.length>0){let{command:p}=h[h.length-1];for(;p.then;)p=p.then.line;let C=p.chain;for(;C.then;)C=C.then.chain;C.type===\"command\"&&(C.args=C.args.concat(e.map(y=>({type:\"argument\",segments:[{type:\"text\",text:y}]}))))}return await vB(h,{args:e,baseFs:t,builtins:f,initialStdin:o,initialStdout:a,initialStderr:l,glob:u},{cwd:n,environment:g,exitCode:null,procedures:{},stdin:o,stdout:a,stderr:l,variables:Object.assign({},c,{[\"?\"]:0}),nextBackgroundJobIndex:1,backgroundJobs:[]})}var l9=Pe(PB()),c9=Pe(Jg()),tl=J(\"stream\");var a9=Pe(i9()),FB=Pe(Ac());var n9=[\"\\u280B\",\"\\u2819\",\"\\u2839\",\"\\u2838\",\"\\u283C\",\"\\u2834\",\"\\u2826\",\"\\u2827\",\"\\u2807\",\"\\u280F\"],s9=80,uRe=new Set([13,19]),gRe=5,RB=FB.default.GITHUB_ACTIONS?{start:r=>`::group::${r}\n`,end:r=>`::endgroup::\n`}:FB.default.TRAVIS?{start:r=>`travis_fold:start:${r}\n`,end:r=>`travis_fold:end:${r}\n`}:FB.default.GITLAB?{start:r=>`section_start:${Math.floor(Date.now()/1e3)}:${r.toLowerCase().replace(/\\W+/g,\"_\")}[collapsed=true]\\r\\x1B[0K${r}\n`,end:r=>`section_end:${Math.floor(Date.now()/1e3)}:${r.toLowerCase().replace(/\\W+/g,\"_\")}\\r\\x1B[0K`}:null,o9=new Date,fRe=[\"iTerm.app\",\"Apple_Terminal\",\"WarpTerminal\",\"vscode\"].includes(process.env.TERM_PROGRAM)||!!process.env.WT_SESSION,hRe=r=>r,NB=hRe({patrick:{date:[17,3],chars:[\"\\u{1F340}\",\"\\u{1F331}\"],size:40},simba:{date:[19,7],chars:[\"\\u{1F981}\",\"\\u{1F334}\"],size:40},jack:{date:[31,10],chars:[\"\\u{1F383}\",\"\\u{1F987}\"],size:40},hogsfather:{date:[31,12],chars:[\"\\u{1F389}\",\"\\u{1F384}\"],size:40},default:{chars:[\"=\",\"-\"],size:80}}),pRe=fRe&&Object.keys(NB).find(r=>{let e=NB[r];return!(e.date&&(e.date[0]!==o9.getDate()||e.date[1]!==o9.getMonth()+1))})||\"default\";function A9(r,{configuration:e,json:t}){if(!e.get(\"enableMessageNames\"))return\"\";let n=NA(r===null?0:r);return!t&&r===null?$e(e,n,\"grey\"):n}function qR(r,{configuration:e,json:t}){let i=A9(r,{configuration:e,json:t});if(!i||r===null||r===0)return i;let n=Ct[r],s=`https://yarnpkg.com/advanced/error-codes#${i}---${n}`.toLowerCase();return If(e,i,s)}var Ge=class extends vi{constructor({configuration:t,stdout:i,json:n=!1,includePrefix:s=!0,includeFooter:o=!0,includeLogs:a=!n,includeInfos:l=a,includeWarnings:c=a,forgettableBufferSize:u=gRe,forgettableNames:g=new Set}){super();this.uncommitted=new Set;this.cacheHitCount=0;this.cacheMissCount=0;this.lastCacheMiss=null;this.warningCount=0;this.errors=[];this.startTime=Date.now();this.indent=0;this.progress=new Map;this.progressTime=0;this.progressFrame=0;this.progressTimeout=null;this.progressStyle=null;this.progressMaxScaledSize=null;this.forgettableLines=[];if(Xd(this,{configuration:t}),this.configuration=t,this.forgettableBufferSize=u,this.forgettableNames=new Set([...g,...uRe]),this.includePrefix=s,this.includeFooter=o,this.includeInfos=l,this.includeWarnings=c,this.json=n,this.stdout=i,t.get(\"enableProgressBars\")&&!n&&i.isTTY&&i.columns>22){let f=t.get(\"progressBarStyle\")||pRe;if(!Object.prototype.hasOwnProperty.call(NB,f))throw new Error(\"Assertion failed: Invalid progress bar style\");this.progressStyle=NB[f];let h=12,p=Math.max(0,Math.min(i.columns-h,80));this.progressMaxScaledSize=Math.floor(this.progressStyle.size*p/80)}}static async start(t,i){let n=new this(t),s=process.emitWarning;process.emitWarning=(o,a)=>{if(typeof o!=\"string\"){let c=o;o=c.message,a=a!=null?a:c.name}let l=typeof a<\"u\"?`${a}: ${o}`:o;n.reportWarning(0,l)};try{await i(n)}catch(o){n.reportExceptionOnce(o)}finally{await n.finalize(),process.emitWarning=s}return n}hasErrors(){return this.errors.length>0}exitCode(){return this.hasErrors()?1:0}reportCacheHit(t){this.cacheHitCount+=1}reportCacheMiss(t,i){this.lastCacheMiss=t,this.cacheMissCount+=1,typeof i<\"u\"&&!this.configuration.get(\"preferAggregateCacheInfo\")&&this.reportInfo(13,i)}startSectionSync({reportHeader:t,reportFooter:i,skipIfEmpty:n},s){let o={committed:!1,action:()=>{t==null||t()}};n?this.uncommitted.add(o):(o.action(),o.committed=!0);let a=Date.now();try{return s()}catch(l){throw this.reportExceptionOnce(l),l}finally{let l=Date.now();this.uncommitted.delete(o),o.committed&&(i==null||i(l-a))}}async startSectionPromise({reportHeader:t,reportFooter:i,skipIfEmpty:n},s){let o={committed:!1,action:()=>{t==null||t()}};n?this.uncommitted.add(o):(o.action(),o.committed=!0);let a=Date.now();try{return await s()}catch(l){throw this.reportExceptionOnce(l),l}finally{let l=Date.now();this.uncommitted.delete(o),o.committed&&(i==null||i(l-a))}}startTimerImpl(t,i,n){return{cb:typeof i==\"function\"?i:n,reportHeader:()=>{this.reportInfo(null,`\\u250C ${t}`),this.indent+=1,RB!==null&&!this.json&&this.includeInfos&&this.stdout.write(RB.start(t))},reportFooter:a=>{if(this.indent-=1,RB!==null&&!this.json&&this.includeInfos){this.stdout.write(RB.end(t));for(let[l,c]of this.errors)this.reportErrorImpl(l,c)}this.configuration.get(\"enableTimers\")&&a>200?this.reportInfo(null,`\\u2514 Completed in ${$e(this.configuration,a,Ue.DURATION)}`):this.reportInfo(null,\"\\u2514 Completed\")},skipIfEmpty:(typeof i==\"function\"?{}:i).skipIfEmpty}}startTimerSync(t,i,n){let{cb:s,...o}=this.startTimerImpl(t,i,n);return this.startSectionSync(o,s)}async startTimerPromise(t,i,n){let{cb:s,...o}=this.startTimerImpl(t,i,n);return this.startSectionPromise(o,s)}async startCacheReport(t){let i=this.configuration.get(\"preferAggregateCacheInfo\")?{cacheHitCount:this.cacheHitCount,cacheMissCount:this.cacheMissCount}:null;try{return await t()}catch(n){throw this.reportExceptionOnce(n),n}finally{i!==null&&this.reportCacheChanges(i)}}reportSeparator(){this.indent===0?this.writeLineWithForgettableReset(\"\"):this.reportInfo(null,\"\")}reportInfo(t,i){if(!this.includeInfos)return;this.commit();let n=this.formatNameWithHyperlink(t),s=n?`${n}: `:\"\",o=`${this.formatPrefix(s,\"blueBright\")}${i}`;if(this.json)this.reportJson({type:\"info\",name:t,displayName:this.formatName(t),indent:this.formatIndent(),data:i});else if(this.forgettableNames.has(t))if(this.forgettableLines.push(o),this.forgettableLines.length>this.forgettableBufferSize){for(;this.forgettableLines.length>this.forgettableBufferSize;)this.forgettableLines.shift();this.writeLines(this.forgettableLines,{truncate:!0})}else this.writeLine(o,{truncate:!0});else this.writeLineWithForgettableReset(o)}reportWarning(t,i){if(this.warningCount+=1,!this.includeWarnings)return;this.commit();let n=this.formatNameWithHyperlink(t),s=n?`${n}: `:\"\";this.json?this.reportJson({type:\"warning\",name:t,displayName:this.formatName(t),indent:this.formatIndent(),data:i}):this.writeLineWithForgettableReset(`${this.formatPrefix(s,\"yellowBright\")}${i}`)}reportError(t,i){this.errors.push([t,i]),this.reportErrorImpl(t,i)}reportErrorImpl(t,i){this.commit();let n=this.formatNameWithHyperlink(t),s=n?`${n}: `:\"\";this.json?this.reportJson({type:\"error\",name:t,displayName:this.formatName(t),indent:this.formatIndent(),data:i}):this.writeLineWithForgettableReset(`${this.formatPrefix(s,\"redBright\")}${i}`,{truncate:!1})}reportProgress(t){if(this.progressStyle===null)return{...Promise.resolve(),stop:()=>{}};if(t.hasProgress&&t.hasTitle)throw new Error(\"Unimplemented: Progress bars can't have both progress and titles.\");let i=!1,n=Promise.resolve().then(async()=>{let o={progress:t.hasProgress?0:void 0,title:t.hasTitle?\"\":void 0};this.progress.set(t,{definition:o,lastScaledSize:t.hasProgress?-1:void 0,lastTitle:void 0}),this.refreshProgress({delta:-1});for await(let{progress:a,title:l}of t)i||o.progress===a&&o.title===l||(o.progress=a,o.title=l,this.refreshProgress());s()}),s=()=>{i||(i=!0,this.progress.delete(t),this.refreshProgress({delta:1}))};return{...n,stop:s}}reportJson(t){this.json&&this.writeLineWithForgettableReset(`${JSON.stringify(t)}`)}async finalize(){if(!this.includeFooter)return;let t=\"\";this.errors.length>0?t=\"Failed with errors\":this.warningCount>0?t=\"Done with warnings\":t=\"Done\";let i=$e(this.configuration,Date.now()-this.startTime,Ue.DURATION),n=this.configuration.get(\"enableTimers\")?`${t} in ${i}`:t;this.errors.length>0?this.reportError(0,n):this.warningCount>0?this.reportWarning(0,n):this.reportInfo(0,n)}writeLine(t,{truncate:i}={}){this.clearProgress({clear:!0}),this.stdout.write(`${this.truncate(t,{truncate:i})}\n`),this.writeProgress()}writeLineWithForgettableReset(t,{truncate:i}={}){this.forgettableLines=[],this.writeLine(t,{truncate:i})}writeLines(t,{truncate:i}={}){this.clearProgress({delta:t.length});for(let n of t)this.stdout.write(`${this.truncate(n,{truncate:i})}\n`);this.writeProgress()}reportCacheChanges({cacheHitCount:t,cacheMissCount:i}){let n=this.cacheHitCount-t,s=this.cacheMissCount-i;if(n===0&&s===0)return;let o=\"\";this.cacheHitCount>1?o+=`${this.cacheHitCount} packages were already cached`:this.cacheHitCount===1?o+=\" - one package was already cached\":o+=\"No packages were cached\",this.cacheHitCount>0?this.cacheMissCount>1?o+=`, ${this.cacheMissCount} had to be fetched`:this.cacheMissCount===1&&(o+=`, one had to be fetched (${mt(this.configuration,this.lastCacheMiss)})`):this.cacheMissCount>1?o+=` - ${this.cacheMissCount} packages had to be fetched`:this.cacheMissCount===1&&(o+=` - one package had to be fetched (${mt(this.configuration,this.lastCacheMiss)})`),this.reportInfo(13,o)}commit(){let t=this.uncommitted;this.uncommitted=new Set;for(let i of t)i.committed=!0,i.action()}clearProgress({delta:t=0,clear:i=!1}){this.progressStyle!==null&&this.progress.size+t>0&&(this.stdout.write(`\\x1B[${this.progress.size+t}A`),(t>0||i)&&this.stdout.write(\"\\x1B[0J\"))}writeProgress(){if(this.progressStyle===null||(this.progressTimeout!==null&&clearTimeout(this.progressTimeout),this.progressTimeout=null,this.progress.size===0))return;let t=Date.now();t-this.progressTime>s9&&(this.progressFrame=(this.progressFrame+1)%n9.length,this.progressTime=t);let i=n9[this.progressFrame];for(let n of this.progress.values()){let s=\"\";if(typeof n.lastScaledSize<\"u\"){let c=this.progressStyle.chars[0].repeat(n.lastScaledSize),u=this.progressStyle.chars[1].repeat(this.progressMaxScaledSize-n.lastScaledSize);s=` ${c}${u}`}let o=this.formatName(null),a=o?`${o}: `:\"\",l=n.definition.title?` ${n.definition.title}`:\"\";this.stdout.write(`${$e(this.configuration,\"\\u27A4\",\"blueBright\")} ${a}${i}${s}${l}\n`)}this.progressTimeout=setTimeout(()=>{this.refreshProgress({force:!0})},s9)}refreshProgress({delta:t=0,force:i=!1}={}){let n=!1,s=!1;if(i||this.progress.size===0)n=!0;else for(let o of this.progress.values()){let a=typeof o.definition.progress<\"u\"?Math.trunc(this.progressMaxScaledSize*o.definition.progress):void 0,l=o.lastScaledSize;o.lastScaledSize=a;let c=o.lastTitle;if(o.lastTitle=o.definition.title,a!==l||(s=c!==o.definition.title)){n=!0;break}}n&&(this.clearProgress({delta:t,clear:s}),this.writeProgress())}truncate(t,{truncate:i}={}){return this.progressStyle===null&&(i=!1),typeof i>\"u\"&&(i=this.configuration.get(\"preferTruncatedLines\")),i&&(t=(0,a9.default)(t,0,this.stdout.columns-1)),t}formatName(t){return A9(t,{configuration:this.configuration,json:this.json})}formatPrefix(t,i){return this.includePrefix?`${$e(this.configuration,\"\\u27A4\",i)} ${t}${this.formatIndent()}`:\"\"}formatNameWithHyperlink(t){return qR(t,{configuration:this.configuration,json:this.json})}formatIndent(){return\"\\u2502 \".repeat(this.indent)}};var Tr=\"3.6.0\";var u9=(n=>(n.Yarn1=\"Yarn Classic\",n.Yarn2=\"Yarn\",n.Npm=\"npm\",n.Pnpm=\"pnpm\",n))(u9||{});async function Wa(r,e,t,i=[]){if(process.platform===\"win32\"){let n=`@goto #_undefined_# 2>NUL || @title %COMSPEC% & @setlocal & @\"${t}\" ${i.map(s=>`\"${s.replace('\"','\"\"')}\"`).join(\" \")} %*`;await M.writeFilePromise(x.format({dir:r,name:e,ext:\".cmd\"}),n)}await M.writeFilePromise(x.join(r,e),`#!/bin/sh\nexec \"${t}\" ${i.map(n=>`'${n.replace(/'/g,`'\"'\"'`)}'`).join(\" \")} \"$@\"\n`,{mode:493})}async function g9(r){let e=await ot.tryFind(r);if(e!=null&&e.packageManager){let i=vw(e.packageManager);if(i!=null&&i.name){let n=`found ${JSON.stringify({packageManager:e.packageManager})} in manifest`,[s]=i.reference.split(\".\");switch(i.name){case\"yarn\":return{packageManagerField:!0,packageManager:Number(s)===1?\"Yarn Classic\":\"Yarn\",reason:n};case\"npm\":return{packageManagerField:!0,packageManager:\"npm\",reason:n};case\"pnpm\":return{packageManagerField:!0,packageManager:\"pnpm\",reason:n}}}}let t;try{t=await M.readFilePromise(x.join(r,xt.lockfile),\"utf8\")}catch{}return t!==void 0?t.match(/^__metadata:$/m)?{packageManager:\"Yarn\",reason:'\"__metadata\" key found in yarn.lock'}:{packageManager:\"Yarn Classic\",reason:'\"__metadata\" key not found in yarn.lock, must be a Yarn classic lockfile'}:M.existsSync(x.join(r,\"package-lock.json\"))?{packageManager:\"npm\",reason:`found npm's \"package-lock.json\" lockfile`}:M.existsSync(x.join(r,\"pnpm-lock.yaml\"))?{packageManager:\"pnpm\",reason:`found pnpm's \"pnpm-lock.yaml\" lockfile`}:null}async function FC({project:r,locator:e,binFolder:t,ignoreCorepack:i,lifecycleScript:n}){var c,u;let s={};for(let[g,f]of Object.entries(process.env))typeof f<\"u\"&&(s[g.toLowerCase()!==\"path\"?g:\"PATH\"]=f);let o=K.fromPortablePath(t);s.BERRY_BIN_FOLDER=K.fromPortablePath(o);let a=process.env.COREPACK_ROOT&&!i?K.join(process.env.COREPACK_ROOT,\"dist/yarn.js\"):process.argv[1];if(await Promise.all([Wa(t,\"node\",process.execPath),...Tr!==null?[Wa(t,\"run\",process.execPath,[a,\"run\"]),Wa(t,\"yarn\",process.execPath,[a]),Wa(t,\"yarnpkg\",process.execPath,[a]),Wa(t,\"node-gyp\",process.execPath,[a,\"run\",\"--top-level\",\"node-gyp\"])]:[]]),r&&(s.INIT_CWD=K.fromPortablePath(r.configuration.startingCwd),s.PROJECT_CWD=K.fromPortablePath(r.cwd)),s.PATH=s.PATH?`${o}${K.delimiter}${s.PATH}`:`${o}`,s.npm_execpath=`${o}${K.sep}yarn`,s.npm_node_execpath=`${o}${K.sep}node`,e){if(!r)throw new Error(\"Assertion failed: Missing project\");let g=r.tryWorkspaceByLocator(e),f=g?(c=g.manifest.version)!=null?c:\"\":(u=r.storedPackages.get(e.locatorHash).version)!=null?u:\"\";s.npm_package_name=Ot(e),s.npm_package_version=f;let h;if(g)h=g.cwd;else{let p=r.storedPackages.get(e.locatorHash);if(!p)throw new Error(`Package for ${mt(r.configuration,e)} not found in the project`);let C=r.configuration.getLinkers(),y={project:r,report:new Ge({stdout:new tl.PassThrough,configuration:r.configuration})},B=C.find(v=>v.supportsPackage(p,y));if(!B)throw new Error(`The package ${mt(r.configuration,p)} isn't supported by any of the available linkers`);h=await B.findPackageLocation(p,y)}s.npm_package_json=K.fromPortablePath(x.join(h,xt.manifest))}let l=Tr!==null?`yarn/${Tr}`:`yarn/${mf(\"@yarnpkg/core\").version}-core`;return s.npm_config_user_agent=`${l} npm/? node/${process.version} ${process.platform} ${process.arch}`,n&&(s.npm_lifecycle_event=n),r&&await r.configuration.triggerHook(g=>g.setupScriptEnvironment,r,s,async(g,f,h)=>await Wa(t,Ur(g),f,h)),s}var dRe=2,CRe=(0,c9.default)(dRe);async function mRe(r,e,{configuration:t,report:i,workspace:n=null,locator:s=null}){await CRe(async()=>{await M.mktempPromise(async o=>{let a=x.join(o,\"pack.log\"),l=null,{stdout:c,stderr:u}=t.getSubprocessStreams(a,{prefix:K.fromPortablePath(r),report:i}),g=s&&jo(s)?nC(s):s,f=g?Es(g):\"an external project\";c.write(`Packing ${f} from sources\n`);let h=await g9(r),p;h!==null?(c.write(`Using ${h.packageManager} for bootstrap. Reason: ${h.reason}\n\n`),p=h.packageManager):(c.write(`No package manager configuration detected; defaulting to Yarn\n\n`),p=\"Yarn\");let C=p===\"Yarn\"&&!(h!=null&&h.packageManagerField);await M.mktempPromise(async y=>{let B=await FC({binFolder:y,ignoreCorepack:C}),D=new Map([[\"Yarn Classic\",async()=>{let H=n!==null?[\"workspace\",n]:[],j=x.join(r,xt.manifest),$=await M.readFilePromise(j),V=await Wo(process.execPath,[process.argv[1],\"set\",\"version\",\"classic\",\"--only-if-needed\"],{cwd:r,env:B,stdin:l,stdout:c,stderr:u,end:1});if(V.code!==0)return V.code;await M.writeFilePromise(j,$),await M.appendFilePromise(x.join(r,\".npmignore\"),`/.yarn\n`),c.write(`\n`),delete B.NODE_ENV;let W=await Wo(\"yarn\",[\"install\"],{cwd:r,env:B,stdin:l,stdout:c,stderr:u,end:1});if(W.code!==0)return W.code;c.write(`\n`);let _=await Wo(\"yarn\",[...H,\"pack\",\"--filename\",K.fromPortablePath(e)],{cwd:r,env:B,stdin:l,stdout:c,stderr:u});return _.code!==0?_.code:0}],[\"Yarn\",async()=>{let H=n!==null?[\"workspace\",n]:[];B.YARN_ENABLE_INLINE_BUILDS=\"1\";let j=x.join(r,xt.lockfile);await M.existsPromise(j)||await M.writeFilePromise(j,\"\");let $=await Wo(\"yarn\",[...H,\"pack\",\"--install-if-needed\",\"--filename\",K.fromPortablePath(e)],{cwd:r,env:B,stdin:l,stdout:c,stderr:u});return $.code!==0?$.code:0}],[\"npm\",async()=>{if(n!==null){let Ae=new tl.PassThrough,ge=Cf(Ae);Ae.pipe(c,{end:!1});let re=await Wo(\"npm\",[\"--version\"],{cwd:r,env:B,stdin:l,stdout:Ae,stderr:u,end:0});if(Ae.end(),re.code!==0)return c.end(),u.end(),re.code;let O=(await ge).toString().trim();if(!kc(O,\">=7.x\")){let F=qo(null,\"npm\"),ue=_t(F,O),pe=_t(F,\">=7.x\");throw new Error(`Workspaces aren't supported by ${tr(t,ue)}; please upgrade to ${tr(t,pe)} (npm has been detected as the primary package manager for ${$e(t,r,Ue.PATH)})`)}}let H=n!==null?[\"--workspace\",n]:[];delete B.npm_config_user_agent,delete B.npm_config_production,delete B.NPM_CONFIG_PRODUCTION,delete B.NODE_ENV;let j=await Wo(\"npm\",[\"install\"],{cwd:r,env:B,stdin:l,stdout:c,stderr:u,end:1});if(j.code!==0)return j.code;let $=new tl.PassThrough,V=Cf($);$.pipe(c);let W=await Wo(\"npm\",[\"pack\",\"--silent\",...H],{cwd:r,env:B,stdin:l,stdout:$,stderr:u});if(W.code!==0)return W.code;let _=(await V).toString().trim().replace(/^.*\\n/s,\"\"),A=x.resolve(r,K.toPortablePath(_));return await M.renamePromise(A,e),0}]]).get(p);if(typeof D>\"u\")throw new Error(\"Assertion failed: Unsupported workflow\");let T=await D();if(!(T===0||typeof T>\"u\"))throw M.detachTemp(o),new at(58,`Packing the package failed (exit code ${T}, logs can be found here: ${$e(t,a,Ue.PATH)})`)})})})}async function ERe(r,e,{project:t}){let i=t.tryWorkspaceByLocator(r);if(i!==null)return WR(i,e);let n=t.storedPackages.get(r.locatorHash);if(!n)throw new Error(`Package for ${mt(t.configuration,r)} not found in the project`);return await Kn.openPromise(async s=>{let o=t.configuration,a=t.configuration.getLinkers(),l={project:t,report:new Ge({stdout:new tl.PassThrough,configuration:o})},c=a.find(h=>h.supportsPackage(n,l));if(!c)throw new Error(`The package ${mt(t.configuration,n)} isn't supported by any of the available linkers`);let u=await c.findPackageLocation(n,l),g=new qt(u,{baseFs:s});return(await ot.find(Oe.dot,{baseFs:g})).scripts.has(e)},{libzip:await an()})}async function TB(r,e,t,{cwd:i,project:n,stdin:s,stdout:o,stderr:a}){return await M.mktempPromise(async l=>{let{manifest:c,env:u,cwd:g}=await f9(r,{project:n,binFolder:l,cwd:i,lifecycleScript:e}),f=c.scripts.get(e);if(typeof f>\"u\")return 1;let h=async()=>await xB(f,t,{cwd:g,env:u,stdin:s,stdout:o,stderr:a});return await(await n.configuration.reduceHook(C=>C.wrapScriptExecution,h,n,r,e,{script:f,args:t,cwd:g,env:u,stdin:s,stdout:o,stderr:a}))()})}async function JR(r,e,t,{cwd:i,project:n,stdin:s,stdout:o,stderr:a}){return await M.mktempPromise(async l=>{let{env:c,cwd:u}=await f9(r,{project:n,binFolder:l,cwd:i});return await xB(e,t,{cwd:u,env:c,stdin:s,stdout:o,stderr:a})})}async function IRe(r,{binFolder:e,cwd:t,lifecycleScript:i}){let n=await FC({project:r.project,locator:r.anchoredLocator,binFolder:e,lifecycleScript:i});return await Promise.all(Array.from(await d9(r),([s,[,o]])=>Wa(e,Ur(s),process.execPath,[o]))),typeof t>\"u\"&&(t=x.dirname(await M.realpathPromise(x.join(r.cwd,\"package.json\")))),{manifest:r.manifest,binFolder:e,env:n,cwd:t}}async function f9(r,{project:e,binFolder:t,cwd:i,lifecycleScript:n}){let s=e.tryWorkspaceByLocator(r);if(s!==null)return IRe(s,{binFolder:t,cwd:i,lifecycleScript:n});let o=e.storedPackages.get(r.locatorHash);if(!o)throw new Error(`Package for ${mt(e.configuration,r)} not found in the project`);return await Kn.openPromise(async a=>{let l=e.configuration,c=e.configuration.getLinkers(),u={project:e,report:new Ge({stdout:new tl.PassThrough,configuration:l})},g=c.find(y=>y.supportsPackage(o,u));if(!g)throw new Error(`The package ${mt(e.configuration,o)} isn't supported by any of the available linkers`);let f=await FC({project:e,locator:r,binFolder:t,lifecycleScript:n});await Promise.all(Array.from(await LB(r,{project:e}),([y,[,B]])=>Wa(t,Ur(y),process.execPath,[B])));let h=await g.findPackageLocation(o,u),p=new qt(h,{baseFs:a}),C=await ot.find(Oe.dot,{baseFs:p});return typeof i>\"u\"&&(i=h),{manifest:C,binFolder:t,env:f,cwd:i}},{libzip:await an()})}async function h9(r,e,t,{cwd:i,stdin:n,stdout:s,stderr:o}){return await TB(r.anchoredLocator,e,t,{cwd:i,project:r.project,stdin:n,stdout:s,stderr:o})}function WR(r,e){return r.manifest.scripts.has(e)}async function p9(r,e,{cwd:t,report:i}){let{configuration:n}=r.project,s=null;await M.mktempPromise(async o=>{let a=x.join(o,`${e}.log`),l=`# This file contains the result of Yarn calling the \"${e}\" lifecycle script inside a workspace (\"${K.fromPortablePath(r.cwd)}\")\n`,{stdout:c,stderr:u}=n.getSubprocessStreams(a,{report:i,prefix:mt(n,r.anchoredLocator),header:l});i.reportInfo(36,`Calling the \"${e}\" lifecycle script`);let g=await h9(r,e,[],{cwd:t,stdin:s,stdout:c,stderr:u});if(c.end(),u.end(),g!==0)throw M.detachTemp(o),new at(36,`${(0,l9.default)(e)} script failed (exit code ${$e(n,g,Ue.NUMBER)}, logs can be found here: ${$e(n,a,Ue.PATH)}); run ${$e(n,`yarn ${e}`,Ue.CODE)} to investigate`)})}async function yRe(r,e,t){WR(r,e)&&await p9(r,e,t)}async function LB(r,{project:e}){let t=e.configuration,i=new Map,n=e.storedPackages.get(r.locatorHash);if(!n)throw new Error(`Package for ${mt(t,r)} not found in the project`);let s=new tl.Writable,o=t.getLinkers(),a={project:e,report:new Ge({configuration:t,stdout:s})},l=new Set([r.locatorHash]);for(let u of n.dependencies.values()){let g=e.storedResolutions.get(u.descriptorHash);if(!g)throw new Error(`Assertion failed: The resolution (${tr(t,u)}) should have been registered`);l.add(g)}let c=await Promise.all(Array.from(l,async u=>{let g=e.storedPackages.get(u);if(!g)throw new Error(`Assertion failed: The package (${u}) should have been registered`);if(g.bin.size===0)return Uo.skip;let f=o.find(p=>p.supportsPackage(g,a));if(!f)return Uo.skip;let h=null;try{h=await f.findPackageLocation(g,a)}catch(p){if(p.code===\"LOCATOR_NOT_INSTALLED\")return Uo.skip;throw p}return{dependency:g,packageLocation:h}}));for(let u of c){if(u===Uo.skip)continue;let{dependency:g,packageLocation:f}=u;for(let[h,p]of g.bin)i.set(h,[g,K.fromPortablePath(x.resolve(f,p))])}return i}async function d9(r){return await LB(r.anchoredLocator,{project:r.project})}async function C9(r,e,t,{cwd:i,project:n,stdin:s,stdout:o,stderr:a,nodeArgs:l=[],packageAccessibleBinaries:c}){c!=null||(c=await LB(r,{project:n}));let u=c.get(e);if(!u)throw new Error(`Binary not found (${e}) for ${mt(n.configuration,r)}`);return await M.mktempPromise(async g=>{let[,f]=u,h=await FC({project:n,locator:r,binFolder:g});await Promise.all(Array.from(c,([C,[,y]])=>Wa(h.BERRY_BIN_FOLDER,Ur(C),process.execPath,[y])));let p;try{p=await Wo(process.execPath,[...l,f,...t],{cwd:i,env:h,stdin:s,stdout:o,stderr:a})}finally{await M.removePromise(h.BERRY_BIN_FOLDER)}return p.code})}async function wRe(r,e,t,{cwd:i,stdin:n,stdout:s,stderr:o,packageAccessibleBinaries:a}){return await C9(r.anchoredLocator,e,t,{project:r.project,cwd:i,stdin:n,stdout:s,stderr:o,packageAccessibleBinaries:a})}var mi={};ut(mi,{convertToZip:()=>VNe,extractArchiveTo:()=>ZNe,makeArchiveFromDirectory:()=>zNe});var aZ=J(\"stream\"),AZ=Pe(tZ());var rZ=Pe(Jg()),iZ=J(\"worker_threads\");var hl=Symbol(\"kTaskInfo\"),L0=class{constructor(e){this.source=e;this.workers=[];this.limit=(0,rZ.default)(ek());this.cleanupInterval=setInterval(()=>{if(this.limit.pendingCount===0&&this.limit.activeCount===0){let t=this.workers.pop();t?t.terminate():clearInterval(this.cleanupInterval)}},5e3).unref()}createWorker(){this.cleanupInterval.refresh();let e=new iZ.Worker(this.source,{eval:!0,execArgv:[...process.execArgv,\"--unhandled-rejections=strict\"]});return e.on(\"message\",t=>{if(!e[hl])throw new Error(\"Assertion failed: Worker sent a result without having a task assigned\");e[hl].resolve(t),e[hl]=null,e.unref(),this.workers.push(e)}),e.on(\"error\",t=>{var i;(i=e[hl])==null||i.reject(t),e[hl]=null}),e.on(\"exit\",t=>{var i;t!==0&&((i=e[hl])==null||i.reject(new Error(`Worker exited with code ${t}`))),e[hl]=null}),e}run(e){return this.limit(()=>{var i;let t=(i=this.workers.pop())!=null?i:this.createWorker();return t.ref(),new Promise((n,s)=>{t[hl]={resolve:n,reject:s},t.postMessage(e)})})}};var lZ=Pe(sZ());async function zNe(r,{baseFs:e=new $t,prefixPath:t=Oe.root,compressionLevel:i,inMemory:n=!1}={}){let s=await an(),o;if(n)o=new Wr(null,{libzip:s,level:i});else{let l=await M.mktempPromise(),c=x.join(l,\"archive.zip\");o=new Wr(c,{create:!0,libzip:s,level:i})}let a=x.resolve(Oe.root,t);return await o.copyPromise(a,r,{baseFs:e,stableTime:!0,stableSort:!0}),o}var oZ;async function VNe(r,e){let t=await M.mktempPromise(),i=x.join(t,\"archive.zip\");return oZ||(oZ=new L0((0,lZ.getContent)())),await oZ.run({tmpFile:i,tgz:r,opts:e}),new Wr(i,{libzip:await an(),level:e.compressionLevel})}async function*XNe(r){let e=new AZ.default.Parse,t=new aZ.PassThrough({objectMode:!0,autoDestroy:!0,emitClose:!0});e.on(\"entry\",i=>{t.write(i)}),e.on(\"error\",i=>{t.destroy(i)}),e.on(\"close\",()=>{t.destroyed||t.end()}),e.end(r);for await(let i of t){let n=i;yield n,n.resume()}}async function ZNe(r,e,{stripComponents:t=0,prefixPath:i=Oe.dot}={}){var s,o;function n(a){if(a.path[0]===\"/\")return!0;let l=a.path.split(/\\//g);return!!(l.some(c=>c===\"..\")||l.length<=t)}for await(let a of XNe(r)){if(n(a))continue;let l=x.normalize(K.toPortablePath(a.path)).replace(/\\/$/,\"\").split(/\\//g);if(l.length<=t)continue;let c=l.slice(t).join(\"/\"),u=x.join(i,c),g=420;switch((a.type===\"Directory\"||(((s=a.mode)!=null?s:0)&73)!==0)&&(g|=73),a.type){case\"Directory\":e.mkdirpSync(x.dirname(u),{chmod:493,utimes:[xr.SAFE_TIME,xr.SAFE_TIME]}),e.mkdirSync(u,{mode:g}),e.utimesSync(u,xr.SAFE_TIME,xr.SAFE_TIME);break;case\"OldFile\":case\"File\":e.mkdirpSync(x.dirname(u),{chmod:493,utimes:[xr.SAFE_TIME,xr.SAFE_TIME]}),e.writeFileSync(u,await Cf(a),{mode:g}),e.utimesSync(u,xr.SAFE_TIME,xr.SAFE_TIME);break;case\"SymbolicLink\":e.mkdirpSync(x.dirname(u),{chmod:493,utimes:[xr.SAFE_TIME,xr.SAFE_TIME]}),e.symlinkSync(a.linkpath,u),(o=e.lutimesSync)==null||o.call(e,u,xr.SAFE_TIME,xr.SAFE_TIME);break}}return e}var es={};ut(es,{emitList:()=>_Ne,emitTree:()=>pZ,treeNodeToJson:()=>hZ,treeNodeToTreeify:()=>fZ});var gZ=Pe(uZ());function fZ(r,{configuration:e}){let t={},i=(n,s)=>{let o=Array.isArray(n)?n.entries():Object.entries(n);for(let[a,{label:l,value:c,children:u}]of o){let g=[];typeof l<\"u\"&&g.push(Vy(e,l,2)),typeof c<\"u\"&&g.push($e(e,c[0],c[1])),g.length===0&&g.push(Vy(e,`${a}`,2));let f=g.join(\": \"),h=s[f]={};typeof u<\"u\"&&i(u,h)}};if(typeof r.children>\"u\")throw new Error(\"The root node must only contain children\");return i(r.children,t),t}function hZ(r){let e=t=>{var s;if(typeof t.children>\"u\"){if(typeof t.value>\"u\")throw new Error(\"Assertion failed: Expected a value to be set if the children are missing\");return Bc(t.value[0],t.value[1])}let i=Array.isArray(t.children)?t.children.entries():Object.entries((s=t.children)!=null?s:{}),n=Array.isArray(t.children)?[]:{};for(let[o,a]of i)n[o]=e(a);return typeof t.value>\"u\"?n:{value:Bc(t.value[0],t.value[1]),children:n}};return e(r)}function _Ne(r,{configuration:e,stdout:t,json:i}){let n=r.map(s=>({value:s}));pZ({children:n},{configuration:e,stdout:t,json:i})}function pZ(r,{configuration:e,stdout:t,json:i,separators:n=0}){var o;if(i){let a=Array.isArray(r.children)?r.children.values():Object.values((o=r.children)!=null?o:{});for(let l of a)t.write(`${JSON.stringify(hZ(l))}\n`);return}let s=(0,gZ.asTree)(fZ(r,{configuration:e}),!1,!1);if(n>=1&&(s=s.replace(/^([├└]─)/gm,`\\u2502\n$1`).replace(/^│\\n/,\"\")),n>=2)for(let a=0;a<2;++a)s=s.replace(/^([│ ].{2}[├│ ].{2}[^\\n]+\\n)(([│ ]).{2}[├└].{2}[^\\n]*\\n[│ ].{2}[│ ].{2}[├└]─)/gm,`$1$3  \\u2502\n$2`).replace(/^│\\n/,\"\");if(n>=3)throw new Error(\"Only the first two levels are accepted by treeUtils.emitTree\");t.write(s)}var dZ=J(\"crypto\"),PN=Pe(J(\"fs\"));var $Ne=8,Rt=class{constructor(e,{configuration:t,immutable:i=t.get(\"enableImmutableCache\"),check:n=!1}){this.markedFiles=new Set;this.mutexes=new Map;this.cacheId=`-${(0,dZ.randomBytes)(8).toString(\"hex\")}.tmp`;this.configuration=t,this.cwd=e,this.immutable=i,this.check=n;let s=t.get(\"cacheKeyOverride\");if(s!==null)this.cacheKey=`${s}`;else{let o=t.get(\"compressionLevel\"),a=o!==Xl?`c${o}`:\"\";this.cacheKey=[$Ne,a].join(\"\")}}static async find(e,{immutable:t,check:i}={}){let n=new Rt(e.get(\"cacheFolder\"),{configuration:e,immutable:t,check:i});return await n.setup(),n}get mirrorCwd(){if(!this.configuration.get(\"enableMirror\"))return null;let e=`${this.configuration.get(\"globalFolder\")}/cache`;return e!==this.cwd?e:null}getVersionFilename(e){return`${xf(e)}-${this.cacheKey}.zip`}getChecksumFilename(e,t){let n=eTe(t).slice(0,10);return`${xf(e)}-${n}.zip`}getLocatorPath(e,t,i={}){var s;return this.mirrorCwd===null||((s=i.unstablePackages)==null?void 0:s.has(e.locatorHash))?x.resolve(this.cwd,this.getVersionFilename(e)):t===null||xN(t)!==this.cacheKey?null:x.resolve(this.cwd,this.getChecksumFilename(e,t))}getLocatorMirrorPath(e){let t=this.mirrorCwd;return t!==null?x.resolve(t,this.getVersionFilename(e)):null}async setup(){if(!this.configuration.get(\"enableGlobalCache\"))if(this.immutable){if(!await M.existsPromise(this.cwd))throw new at(56,\"Cache path does not exist.\")}else{await M.mkdirPromise(this.cwd,{recursive:!0});let e=x.resolve(this.cwd,\".gitignore\");await M.changeFilePromise(e,`/.gitignore\n*.flock\n*.tmp\n`)}(this.mirrorCwd||!this.immutable)&&await M.mkdirPromise(this.mirrorCwd||this.cwd,{recursive:!0})}async fetchPackageFromCache(e,t,{onHit:i,onMiss:n,loader:s,...o}){var W;let a=this.getLocatorMirrorPath(e),l=new $t,c=()=>{let _=new Wr(null,{libzip:D}),A=x.join(Oe.root,qD(e));return _.mkdirSync(A,{recursive:!0}),_.writeJsonSync(x.join(A,xt.manifest),{name:Ot(e),mocked:!0}),_},u=async(_,A=null)=>{var ge;if(A===null&&((ge=o.unstablePackages)==null?void 0:ge.has(e.locatorHash)))return{isValid:!0,hash:null};let Ae=!o.skipIntegrityCheck||!t?`${this.cacheKey}/${await Qw(_)}`:t;if(A!==null){let re=!o.skipIntegrityCheck||!t?`${this.cacheKey}/${await Qw(A)}`:t;if(Ae!==re)throw new at(18,\"The remote archive doesn't match the local checksum - has the local cache been corrupted?\")}if(t!==null&&Ae!==t){let re;switch(this.check?re=\"throw\":xN(t)!==xN(Ae)?re=\"update\":re=this.configuration.get(\"checksumBehavior\"),re){case\"ignore\":return{isValid:!0,hash:t};case\"update\":return{isValid:!0,hash:Ae};case\"reset\":return{isValid:!1,hash:t};default:case\"throw\":throw new at(18,\"The remote archive doesn't match the expected checksum\")}}return{isValid:!0,hash:Ae}},g=async _=>{if(!s)throw new Error(`Cache check required but no loader configured for ${mt(this.configuration,e)}`);let A=await s(),Ae=A.getRealPath();A.saveAndClose(),await M.chmodPromise(Ae,420);let ge=await u(_,Ae);if(!ge.isValid)throw new Error(\"Assertion failed: Expected a valid checksum\");return ge.hash},f=async()=>{if(a===null||!await M.existsPromise(a)){let _=await s(),A=_.getRealPath();return _.saveAndClose(),{source:\"loader\",path:A}}return{source:\"mirror\",path:a}},h=async()=>{if(!s)throw new Error(`Cache entry required but missing for ${mt(this.configuration,e)}`);if(this.immutable)throw new at(56,`Cache entry required but missing for ${mt(this.configuration,e)}`);let{path:_,source:A}=await f(),Ae=(await u(_)).hash,ge=this.getLocatorPath(e,Ae,o);if(!ge)throw new Error(\"Assertion failed: Expected the cache path to be available\");let re=[];A!==\"mirror\"&&a!==null&&re.push(async()=>{let F=`${a}${this.cacheId}`;await M.copyFilePromise(_,F,PN.default.constants.COPYFILE_FICLONE),await M.chmodPromise(F,420),await M.renamePromise(F,a)}),(!o.mirrorWriteOnly||a===null)&&re.push(async()=>{let F=`${ge}${this.cacheId}`;await M.copyFilePromise(_,F,PN.default.constants.COPYFILE_FICLONE),await M.chmodPromise(F,420),await M.renamePromise(F,ge)});let O=o.mirrorWriteOnly&&a!=null?a:ge;return await Promise.all(re.map(F=>F())),[!1,O,Ae]},p=async()=>{let A=(async()=>{var ue;let Ae=this.getLocatorPath(e,t,o),ge=Ae!==null?await l.existsPromise(Ae):!1,re=!!((ue=o.mockedPackages)!=null&&ue.has(e.locatorHash))&&(!this.check||!ge),O=re||ge,F=O?i:n;if(F&&F(),O){let pe=null,ke=Ae;if(!re)if(this.check)pe=await g(ke);else{let Fe=await u(ke);if(Fe.isValid)pe=Fe.hash;else return h()}return[re,ke,pe]}else return h()})();this.mutexes.set(e.locatorHash,A);try{return await A}finally{this.mutexes.delete(e.locatorHash)}};for(let _;_=this.mutexes.get(e.locatorHash);)await _;let[C,y,B]=await p();this.markedFiles.add(y);let v,D=await an(),T=C?()=>c():()=>new Wr(y,{baseFs:l,libzip:D,readOnly:!0}),H=new Sg(()=>Jx(()=>v=T(),_=>`Failed to open the cache entry for ${mt(this.configuration,e)}: ${_}`),x),j=new bo(y,{baseFs:H,pathUtils:x}),$=()=>{v==null||v.discardAndClose()},V=(W=o.unstablePackages)!=null&&W.has(e.locatorHash)?null:B;return[j,$,V]}};function xN(r){let e=r.indexOf(\"/\");return e!==-1?r.slice(0,e):null}function eTe(r){let e=r.indexOf(\"/\");return e!==-1?r.slice(e+1):r}var O0=(t=>(t[t.SCRIPT=0]=\"SCRIPT\",t[t.SHELLCODE=1]=\"SHELLCODE\",t))(O0||{});var ra=class extends vi{constructor({configuration:t,stdout:i,suggestInstall:n=!0}){super();this.errorCount=0;Xd(this,{configuration:t}),this.configuration=t,this.stdout=i,this.suggestInstall=n}static async start(t,i){let n=new this(t);try{await i(n)}catch(s){n.reportExceptionOnce(s)}finally{await n.finalize()}return n}hasErrors(){return this.errorCount>0}exitCode(){return this.hasErrors()?1:0}reportCacheHit(t){}reportCacheMiss(t){}startSectionSync(t,i){return i()}async startSectionPromise(t,i){return await i()}startTimerSync(t,i,n){return(typeof i==\"function\"?i:n)()}async startTimerPromise(t,i,n){return await(typeof i==\"function\"?i:n)()}async startCacheReport(t){return await t()}reportSeparator(){}reportInfo(t,i){}reportWarning(t,i){}reportError(t,i){this.errorCount+=1,this.stdout.write(`${$e(this.configuration,\"\\u27A4\",\"redBright\")} ${this.formatNameWithHyperlink(t)}: ${i}\n`)}reportProgress(t){return{...Promise.resolve().then(async()=>{for await(let{}of t);}),stop:()=>{}}}reportJson(t){}async finalize(){this.errorCount>0&&(this.stdout.write(`\n`),this.stdout.write(`${$e(this.configuration,\"\\u27A4\",\"redBright\")} Errors happened when preparing the environment required to run this command.\n`),this.suggestInstall&&this.stdout.write(`${$e(this.configuration,\"\\u27A4\",\"redBright\")} This might be caused by packages being missing from the lockfile, in which case running \"yarn install\" might help.\n`))}formatNameWithHyperlink(t){return qR(t,{configuration:this.configuration,json:!1})}};var X0=J(\"crypto\");function iA(){}iA.prototype={diff:function(e,t){var i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},n=i.callback;typeof i==\"function\"&&(n=i,i={}),this.options=i;var s=this;function o(C){return n?(setTimeout(function(){n(void 0,C)},0),!0):C}e=this.castInput(e),t=this.castInput(t),e=this.removeEmpty(this.tokenize(e)),t=this.removeEmpty(this.tokenize(t));var a=t.length,l=e.length,c=1,u=a+l;i.maxEditLength&&(u=Math.min(u,i.maxEditLength));var g=[{newPos:-1,components:[]}],f=this.extractCommon(g[0],t,e,0);if(g[0].newPos+1>=a&&f+1>=l)return o([{value:this.join(t),count:t.length}]);function h(){for(var C=-1*c;C<=c;C+=2){var y=void 0,B=g[C-1],v=g[C+1],D=(v?v.newPos:0)-C;B&&(g[C-1]=void 0);var T=B&&B.newPos+1<a,H=v&&0<=D&&D<l;if(!T&&!H){g[C]=void 0;continue}if(!T||H&&B.newPos<v.newPos?(y=rTe(v),s.pushComponent(y.components,void 0,!0)):(y=B,y.newPos++,s.pushComponent(y.components,!0,void 0)),D=s.extractCommon(y,t,e,C),y.newPos+1>=a&&D+1>=l)return o(tTe(s,y.components,t,e,s.useLongestToken));g[C]=y}c++}if(n)(function C(){setTimeout(function(){if(c>u)return n();h()||C()},0)})();else for(;c<=u;){var p=h();if(p)return p}},pushComponent:function(e,t,i){var n=e[e.length-1];n&&n.added===t&&n.removed===i?e[e.length-1]={count:n.count+1,added:t,removed:i}:e.push({count:1,added:t,removed:i})},extractCommon:function(e,t,i,n){for(var s=t.length,o=i.length,a=e.newPos,l=a-n,c=0;a+1<s&&l+1<o&&this.equals(t[a+1],i[l+1]);)a++,l++,c++;return c&&e.components.push({count:c}),e.newPos=a,l},equals:function(e,t){return this.options.comparator?this.options.comparator(e,t):e===t||this.options.ignoreCase&&e.toLowerCase()===t.toLowerCase()},removeEmpty:function(e){for(var t=[],i=0;i<e.length;i++)e[i]&&t.push(e[i]);return t},castInput:function(e){return e},tokenize:function(e){return e.split(\"\")},join:function(e){return e.join(\"\")}};function tTe(r,e,t,i,n){for(var s=0,o=e.length,a=0,l=0;s<o;s++){var c=e[s];if(c.removed){if(c.value=r.join(i.slice(l,l+c.count)),l+=c.count,s&&e[s-1].added){var g=e[s-1];e[s-1]=e[s],e[s]=g}}else{if(!c.added&&n){var u=t.slice(a,a+c.count);u=u.map(function(h,p){var C=i[l+p];return C.length>h.length?C:h}),c.value=r.join(u)}else c.value=r.join(t.slice(a,a+c.count));a+=c.count,c.added||(l+=c.count)}}var f=e[o-1];return o>1&&typeof f.value==\"string\"&&(f.added||f.removed)&&r.equals(\"\",f.value)&&(e[o-2].value+=f.value,e.pop()),e}function rTe(r){return{newPos:r.newPos,components:r.components.slice(0)}}var Lat=new iA;var CZ=/^[A-Za-z\\xC0-\\u02C6\\u02C8-\\u02D7\\u02DE-\\u02FF\\u1E00-\\u1EFF]+$/,mZ=/\\S/,EZ=new iA;EZ.equals=function(r,e){return this.options.ignoreCase&&(r=r.toLowerCase(),e=e.toLowerCase()),r===e||this.options.ignoreWhitespace&&!mZ.test(r)&&!mZ.test(e)};EZ.tokenize=function(r){for(var e=r.split(/([^\\S\\r\\n]+|[()[\\]{}'\"\\r\\n]|\\b)/),t=0;t<e.length-1;t++)!e[t+1]&&e[t+2]&&CZ.test(e[t])&&CZ.test(e[t+2])&&(e[t]+=e[t+2],e.splice(t+1,2),t--);return e};var NN=new iA;NN.tokenize=function(r){var e=[],t=r.split(/(\\n|\\r\\n)/);t[t.length-1]||t.pop();for(var i=0;i<t.length;i++){var n=t[i];i%2&&!this.options.newlineIsToken?e[e.length-1]+=n:(this.options.ignoreWhitespace&&(n=n.trim()),e.push(n))}return e};function iTe(r,e,t){return NN.diff(r,e,t)}var nTe=new iA;nTe.tokenize=function(r){return r.split(/(\\S.+?[.!?])(?=\\s+|$)/)};var sTe=new iA;sTe.tokenize=function(r){return r.split(/([{}:;,]|\\s+)/)};function M0(r){return typeof Symbol==\"function\"&&typeof Symbol.iterator==\"symbol\"?M0=function(e){return typeof e}:M0=function(e){return e&&typeof Symbol==\"function\"&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},M0(r)}function DN(r){return oTe(r)||aTe(r)||ATe(r)||lTe()}function oTe(r){if(Array.isArray(r))return kN(r)}function aTe(r){if(typeof Symbol<\"u\"&&Symbol.iterator in Object(r))return Array.from(r)}function ATe(r,e){if(!!r){if(typeof r==\"string\")return kN(r,e);var t=Object.prototype.toString.call(r).slice(8,-1);if(t===\"Object\"&&r.constructor&&(t=r.constructor.name),t===\"Map\"||t===\"Set\")return Array.from(r);if(t===\"Arguments\"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t))return kN(r,e)}}function kN(r,e){(e==null||e>r.length)&&(e=r.length);for(var t=0,i=new Array(e);t<e;t++)i[t]=r[t];return i}function lTe(){throw new TypeError(`Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var cTe=Object.prototype.toString,ZC=new iA;ZC.useLongestToken=!0;ZC.tokenize=NN.tokenize;ZC.castInput=function(r){var e=this.options,t=e.undefinedReplacement,i=e.stringifyReplacer,n=i===void 0?function(s,o){return typeof o>\"u\"?t:o}:i;return typeof r==\"string\"?r:JSON.stringify(RN(r,null,null,n),n,\"  \")};ZC.equals=function(r,e){return iA.prototype.equals.call(ZC,r.replace(/,([\\r\\n])/g,\"$1\"),e.replace(/,([\\r\\n])/g,\"$1\"))};function RN(r,e,t,i,n){e=e||[],t=t||[],i&&(r=i(n,r));var s;for(s=0;s<e.length;s+=1)if(e[s]===r)return t[s];var o;if(cTe.call(r)===\"[object Array]\"){for(e.push(r),o=new Array(r.length),t.push(o),s=0;s<r.length;s+=1)o[s]=RN(r[s],e,t,i,n);return e.pop(),t.pop(),o}if(r&&r.toJSON&&(r=r.toJSON()),M0(r)===\"object\"&&r!==null){e.push(r),o={},t.push(o);var a=[],l;for(l in r)r.hasOwnProperty(l)&&a.push(l);for(a.sort(),s=0;s<a.length;s+=1)l=a[s],o[l]=RN(r[l],e,t,i,l);e.pop(),t.pop()}else o=r;return o}var FN=new iA;FN.tokenize=function(r){return r.slice()};FN.join=FN.removeEmpty=function(r){return r};function IZ(r,e,t,i,n,s,o){o||(o={}),typeof o.context>\"u\"&&(o.context=4);var a=iTe(t,i,o);if(!a)return;a.push({value:\"\",lines:[]});function l(B){return B.map(function(v){return\" \"+v})}for(var c=[],u=0,g=0,f=[],h=1,p=1,C=function(v){var D=a[v],T=D.lines||D.value.replace(/\\n$/,\"\").split(`\n`);if(D.lines=T,D.added||D.removed){var H;if(!u){var j=a[v-1];u=h,g=p,j&&(f=o.context>0?l(j.lines.slice(-o.context)):[],u-=f.length,g-=f.length)}(H=f).push.apply(H,DN(T.map(function(re){return(D.added?\"+\":\"-\")+re}))),D.added?p+=T.length:h+=T.length}else{if(u)if(T.length<=o.context*2&&v<a.length-2){var $;($=f).push.apply($,DN(l(T)))}else{var V,W=Math.min(T.length,o.context);(V=f).push.apply(V,DN(l(T.slice(0,W))));var _={oldStart:u,oldLines:h-u+W,newStart:g,newLines:p-g+W,lines:f};if(v>=a.length-2&&T.length<=o.context){var A=/\\n$/.test(t),Ae=/\\n$/.test(i),ge=T.length==0&&f.length>_.oldLines;!A&&ge&&t.length>0&&f.splice(_.oldLines,0,\"\\\\ No newline at end of file\"),(!A&&!ge||!Ae)&&f.push(\"\\\\ No newline at end of file\")}c.push(_),u=0,g=0,f=[]}h+=T.length,p+=T.length}},y=0;y<a.length;y++)C(y);return{oldFileName:r,newFileName:e,oldHeader:n,newHeader:s,hunks:c}}var Z0=Pe(S$()),_0=Pe(Jg()),k$=Pe(Xr()),JN=J(\"util\"),qN=Pe(J(\"v8\")),WN=Pe(J(\"zlib\"));var MMe=[[/^(git(?:\\+(?:https|ssh))?:\\/\\/.*(?:\\.git)?)#(.*)$/,(r,e,t,i)=>`${t}#commit=${i}`],[/^https:\\/\\/((?:[^/]+?)@)?codeload\\.github\\.com\\/([^/]+\\/[^/]+)\\/tar\\.gz\\/([0-9a-f]+)$/,(r,e,t=\"\",i,n)=>`https://${t}github.com/${i}.git#commit=${n}`],[/^https:\\/\\/((?:[^/]+?)@)?github\\.com\\/([^/]+\\/[^/]+?)(?:\\.git)?#([0-9a-f]+)$/,(r,e,t=\"\",i,n)=>`https://${t}github.com/${i}.git#commit=${n}`],[/^https?:\\/\\/[^/]+\\/(?:[^/]+\\/)*(?:@.+(?:\\/|(?:%2f)))?([^/]+)\\/(?:-|download)\\/\\1-[^/]+\\.tgz(?:#|$)/,r=>`npm:${r}`],[/^https:\\/\\/npm\\.pkg\\.github\\.com\\/download\\/(?:@[^/]+)\\/(?:[^/]+)\\/(?:[^/]+)\\/(?:[0-9a-f]+)(?:#|$)/,r=>`npm:${r}`],[/^https:\\/\\/npm\\.fontawesome\\.com\\/(?:@[^/]+)\\/([^/]+)\\/-\\/([^/]+)\\/\\1-\\2.tgz(?:#|$)/,r=>`npm:${r}`],[/^https?:\\/\\/[^/]+\\/.*\\/(@[^/]+)\\/([^/]+)\\/-\\/\\1\\/\\2-(?:[.\\d\\w-]+)\\.tgz(?:#|$)/,(r,e)=>xw({protocol:\"npm:\",source:null,selector:r,params:{__archiveUrl:e}})],[/^[^/]+\\.tgz#[0-9a-f]+$/,r=>`npm:${r}`]],W0=class{constructor(e){this.resolver=e;this.resolutions=null}async setup(e,{report:t}){let i=x.join(e.cwd,e.configuration.get(\"lockfileFilename\"));if(!M.existsSync(i))return;let n=await M.readFilePromise(i,\"utf8\"),s=yi(n);if(Object.prototype.hasOwnProperty.call(s,\"__metadata\"))return;let o=this.resolutions=new Map;for(let a of Object.keys(s)){let l=aC(a);if(!l){t.reportWarning(14,`Failed to parse the string \"${a}\" into a proper descriptor`);continue}let c=so(l.range)?_t(l,`npm:${l.range}`):l,{version:u,resolved:g}=s[a];if(!g)continue;let f;for(let[p,C]of MMe){let y=g.match(p);if(y){f=C(u,...y);break}}if(!f){t.reportWarning(14,`${tr(e.configuration,c)}: Only some patterns can be imported from legacy lockfiles (not \"${g}\")`);continue}let h=c;try{let p=vf(c.range),C=aC(p.selector,!0);C&&(h=C)}catch{}o.set(c.descriptorHash,nn(h,f))}}supportsDescriptor(e,t){return this.resolutions?this.resolutions.has(e.descriptorHash):!1}supportsLocator(e,t){return!1}shouldPersistResolution(e,t){throw new Error(\"Assertion failed: This resolver doesn't support resolving locators to packages\")}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){if(!this.resolutions)throw new Error(\"Assertion failed: The resolution store should have been setup\");let n=this.resolutions.get(e.descriptorHash);if(!n)throw new Error(\"Assertion failed: The resolution should have been registered\");return await this.resolver.getCandidates(HD(n),t,i)}async getSatisfying(e,t,i){return null}async resolve(e,t){throw new Error(\"Assertion failed: This resolver doesn't support resolving locators to packages\")}};var z0=class{constructor(e){this.resolver=e}supportsDescriptor(e,t){return!!(t.project.storedResolutions.get(e.descriptorHash)||t.project.originalPackages.has(Sw(e).locatorHash))}supportsLocator(e,t){return!!(t.project.originalPackages.has(e.locatorHash)&&!t.project.lockfileNeedsRefresh)}shouldPersistResolution(e,t){throw new Error(\"The shouldPersistResolution method shouldn't be called on the lockfile resolver, which would always answer yes\")}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){return this.resolver.getResolutionDependencies(e,t)}async getCandidates(e,t,i){let n=i.project.originalPackages.get(Sw(e).locatorHash);if(n)return[n];let s=i.project.storedResolutions.get(e.descriptorHash);if(!s)throw new Error(\"Expected the resolution to have been successful - resolution not found\");if(n=i.project.originalPackages.get(s),!n)throw new Error(\"Expected the resolution to have been successful - package not found\");return[n]}async getSatisfying(e,t,i){return null}async resolve(e,t){let i=t.project.originalPackages.get(e.locatorHash);if(!i)throw new Error(\"The lockfile resolver isn't meant to resolve packages - they should already have been stored into a cache\");return i}};var V0=class{constructor(e){this.resolver=e}supportsDescriptor(e,t){return this.resolver.supportsDescriptor(e,t)}supportsLocator(e,t){return this.resolver.supportsLocator(e,t)}shouldPersistResolution(e,t){return this.resolver.shouldPersistResolution(e,t)}bindDescriptor(e,t,i){return this.resolver.bindDescriptor(e,t,i)}getResolutionDependencies(e,t){return this.resolver.getResolutionDependencies(e,t)}async getCandidates(e,t,i){throw new at(20,`This package doesn't seem to be present in your lockfile; run \"yarn install\" to update the lockfile`)}async getSatisfying(e,t,i){throw new at(20,`This package doesn't seem to be present in your lockfile; run \"yarn install\" to update the lockfile`)}async resolve(e,t){throw new at(20,`This package doesn't seem to be present in your lockfile; run \"yarn install\" to update the lockfile`)}};var ti=class extends vi{reportCacheHit(e){}reportCacheMiss(e){}startSectionSync(e,t){return t()}async startSectionPromise(e,t){return await t()}startTimerSync(e,t,i){return(typeof t==\"function\"?t:i)()}async startTimerPromise(e,t,i){return await(typeof t==\"function\"?t:i)()}async startCacheReport(e){return await e()}reportSeparator(){}reportInfo(e,t){}reportWarning(e,t){}reportError(e,t){}reportProgress(e){return{...Promise.resolve().then(async()=>{for await(let{}of e);}),stop:()=>{}}}reportJson(e){}async finalize(){}};var v$=Pe(MD());var bh=class{constructor(e,{project:t}){this.workspacesCwds=new Set;this.dependencies=new Map;this.project=t,this.cwd=e}async setup(){var s;this.manifest=(s=await ot.tryFind(this.cwd))!=null?s:new ot,this.relativeCwd=x.relative(this.project.cwd,this.cwd)||Oe.dot;let e=this.manifest.name?this.manifest.name:qo(null,`${this.computeCandidateName()}-${rn(this.relativeCwd).substring(0,6)}`),t=this.manifest.version?this.manifest.version:\"0.0.0\";this.locator=nn(e,t),this.anchoredDescriptor=_t(this.locator,`${jr.protocol}${this.relativeCwd}`),this.anchoredLocator=nn(this.locator,`${jr.protocol}${this.relativeCwd}`);let i=this.manifest.workspaceDefinitions.map(({pattern:o})=>o);if(i.length===0)return;let n=await(0,v$.default)(i,{cwd:K.fromPortablePath(this.cwd),expandDirectories:!1,onlyDirectories:!0,onlyFiles:!1,ignore:[\"**/node_modules\",\"**/.git\",\"**/.yarn\"]});n.sort(),await n.reduce(async(o,a)=>{let l=x.resolve(this.cwd,K.toPortablePath(a)),c=await M.existsPromise(x.join(l,\"package.json\"));await o,c&&this.workspacesCwds.add(l)},Promise.resolve())}accepts(e){var o;let t=e.indexOf(\":\"),i=t!==-1?e.slice(0,t+1):null,n=t!==-1?e.slice(t+1):e;if(i===jr.protocol&&x.normalize(n)===this.relativeCwd||i===jr.protocol&&(n===\"*\"||n===\"^\"||n===\"~\"))return!0;let s=so(n);return s?i===jr.protocol?s.test((o=this.manifest.version)!=null?o:\"0.0.0\"):this.project.configuration.get(\"enableTransparentWorkspaces\")&&this.manifest.version!==null?s.test(this.manifest.version):!1:!1}computeCandidateName(){return this.cwd===this.project.cwd?\"root-workspace\":`${x.basename(this.cwd)}`||\"unnamed-workspace\"}getRecursiveWorkspaceDependencies({dependencies:e=ot.hardDependencies}={}){let t=new Set,i=n=>{for(let s of e)for(let o of n.manifest[s].values()){let a=this.project.tryWorkspaceByDescriptor(o);a===null||t.has(a)||(t.add(a),i(a))}};return i(this),t}getRecursiveWorkspaceDependents({dependencies:e=ot.hardDependencies}={}){let t=new Set,i=n=>{for(let s of this.project.workspaces)e.some(a=>[...s.manifest[a].values()].some(l=>{let c=this.project.tryWorkspaceByDescriptor(l);return c!==null&&oC(c.anchoredLocator,n.anchoredLocator)}))&&!t.has(s)&&(t.add(s),i(s))};return i(this),t}getRecursiveWorkspaceChildren(){let e=[];for(let t of this.workspacesCwds){let i=this.project.workspacesByCwd.get(t);i&&e.push(i,...i.getRecursiveWorkspaceChildren())}return e}async persistManifest(){let e={};this.manifest.exportTo(e);let t=x.join(this.cwd,ot.fileName),i=`${JSON.stringify(e,null,this.manifest.indent)}\n`;await M.changeFilePromise(t,i,{automaticNewlines:!0}),this.manifest.raw=e}};var x$=6,KMe=1,UMe=/ *, */g,P$=/\\/$/,HMe=32,GMe=(0,JN.promisify)(WN.default.gzip),YMe=(0,JN.promisify)(WN.default.gunzip),ts=(t=>(t.UpdateLockfile=\"update-lockfile\",t.SkipBuild=\"skip-build\",t))(ts||{}),jN={restoreInstallersCustomData:[\"installersCustomData\"],restoreResolutions:[\"accessibleLocators\",\"conditionalLocators\",\"disabledLocators\",\"optionalBuilds\",\"storedDescriptors\",\"storedResolutions\",\"storedPackages\",\"lockFileChecksum\"],restoreBuildState:[\"storedBuildState\"]},D$=r=>rn(`${KMe}`,r),je=class{constructor(e,{configuration:t}){this.resolutionAliases=new Map;this.workspaces=[];this.workspacesByCwd=new Map;this.workspacesByIdent=new Map;this.storedResolutions=new Map;this.storedDescriptors=new Map;this.storedPackages=new Map;this.storedChecksums=new Map;this.storedBuildState=new Map;this.accessibleLocators=new Set;this.conditionalLocators=new Set;this.disabledLocators=new Set;this.originalPackages=new Map;this.optionalBuilds=new Set;this.lockfileNeedsRefresh=!1;this.peerRequirements=new Map;this.installersCustomData=new Map;this.lockFileChecksum=null;this.installStateChecksum=null;this.configuration=t,this.cwd=e}static async find(e,t){var p,C,y;if(!e.projectCwd)throw new be(`No project found in ${t}`);let i=e.projectCwd,n=t,s=null;for(;s!==e.projectCwd;){if(s=n,M.existsSync(x.join(s,xt.manifest))){i=s;break}n=x.dirname(s)}let o=new je(e.projectCwd,{configuration:e});(p=ye.telemetry)==null||p.reportProject(o.cwd),await o.setupResolutions(),await o.setupWorkspaces(),(C=ye.telemetry)==null||C.reportWorkspaceCount(o.workspaces.length),(y=ye.telemetry)==null||y.reportDependencyCount(o.workspaces.reduce((B,v)=>B+v.manifest.dependencies.size+v.manifest.devDependencies.size,0));let a=o.tryWorkspaceByCwd(i);if(a)return{project:o,workspace:a,locator:a.anchoredLocator};let l=await o.findLocatorForLocation(`${i}/`,{strict:!0});if(l)return{project:o,locator:l,workspace:null};let c=$e(e,o.cwd,Ue.PATH),u=$e(e,x.relative(o.cwd,i),Ue.PATH),g=`- If ${c} isn't intended to be a project, remove any yarn.lock and/or package.json file there.`,f=`- If ${c} is intended to be a project, it might be that you forgot to list ${u} in its workspace configuration.`,h=`- Finally, if ${c} is fine and you intend ${u} to be treated as a completely separate project (not even a workspace), create an empty yarn.lock file in it.`;throw new be(`The nearest package directory (${$e(e,i,Ue.PATH)}) doesn't seem to be part of the project declared in ${$e(e,o.cwd,Ue.PATH)}.\n\n${[g,f,h].join(`\n`)}`)}async setupResolutions(){var i;this.storedResolutions=new Map,this.storedDescriptors=new Map,this.storedPackages=new Map,this.lockFileChecksum=null;let e=x.join(this.cwd,this.configuration.get(\"lockfileFilename\")),t=this.configuration.get(\"defaultLanguageName\");if(M.existsSync(e)){let n=await M.readFilePromise(e,\"utf8\");this.lockFileChecksum=D$(n);let s=yi(n);if(s.__metadata){let o=s.__metadata.version,a=s.__metadata.cacheKey;this.lockfileNeedsRefresh=o<x$;for(let l of Object.keys(s)){if(l===\"__metadata\")continue;let c=s[l];if(typeof c.resolution>\"u\")throw new Error(`Assertion failed: Expected the lockfile entry to have a resolution field (${l})`);let u=Dc(c.resolution,!0),g=new ot;g.load(c,{yamlCompatibilityMode:!0});let f=g.version,h=g.languageName||t,p=c.linkType.toUpperCase(),C=(i=c.conditions)!=null?i:null,y=g.dependencies,B=g.peerDependencies,v=g.dependenciesMeta,D=g.peerDependenciesMeta,T=g.bin;if(c.checksum!=null){let j=typeof a<\"u\"&&!c.checksum.includes(\"/\")?`${a}/${c.checksum}`:c.checksum;this.storedChecksums.set(u.locatorHash,j)}let H={...u,version:f,languageName:h,linkType:p,conditions:C,dependencies:y,peerDependencies:B,dependenciesMeta:v,peerDependenciesMeta:D,bin:T};this.originalPackages.set(H.locatorHash,H);for(let j of l.split(UMe)){let $=zA(j);this.storedDescriptors.set($.descriptorHash,$),this.storedResolutions.set($.descriptorHash,u.locatorHash)}}}}}async setupWorkspaces(){this.workspaces=[],this.workspacesByCwd=new Map,this.workspacesByIdent=new Map;let e=new Set,t=(0,_0.default)(4),i=async(n,s)=>{if(e.has(s))return n;e.add(s);let o=new bh(s,{project:this});await t(()=>o.setup());let a=n.then(()=>{this.addWorkspace(o);let l=this.storedPackages.get(o.anchoredLocator.locatorHash);l&&(o.dependencies=l.dependencies)});return Array.from(o.workspacesCwds).reduce(i,a)};await i(Promise.resolve(),this.cwd)}addWorkspace(e){let t=this.workspacesByIdent.get(e.locator.identHash);if(typeof t<\"u\")throw new Error(`Duplicate workspace name ${Ai(this.configuration,e.locator)}: ${K.fromPortablePath(e.cwd)} conflicts with ${K.fromPortablePath(t.cwd)}`);this.workspaces.push(e),this.workspacesByCwd.set(e.cwd,e),this.workspacesByIdent.set(e.locator.identHash,e)}get topLevelWorkspace(){return this.getWorkspaceByCwd(this.cwd)}tryWorkspaceByCwd(e){x.isAbsolute(e)||(e=x.resolve(this.cwd,e)),e=x.normalize(e).replace(/\\/+$/,\"\");let t=this.workspacesByCwd.get(e);return t||null}getWorkspaceByCwd(e){let t=this.tryWorkspaceByCwd(e);if(!t)throw new Error(`Workspace not found (${e})`);return t}tryWorkspaceByFilePath(e){let t=null;for(let i of this.workspaces)x.relative(i.cwd,e).startsWith(\"../\")||t&&t.cwd.length>=i.cwd.length||(t=i);return t||null}getWorkspaceByFilePath(e){let t=this.tryWorkspaceByFilePath(e);if(!t)throw new Error(`Workspace not found (${e})`);return t}tryWorkspaceByIdent(e){let t=this.workspacesByIdent.get(e.identHash);return typeof t>\"u\"?null:t}getWorkspaceByIdent(e){let t=this.tryWorkspaceByIdent(e);if(!t)throw new Error(`Workspace not found (${Ai(this.configuration,e)})`);return t}tryWorkspaceByDescriptor(e){let t=this.tryWorkspaceByIdent(e);return t===null||(WA(e)&&(e=iC(e)),!t.accepts(e.range))?null:t}getWorkspaceByDescriptor(e){let t=this.tryWorkspaceByDescriptor(e);if(t===null)throw new Error(`Workspace not found (${tr(this.configuration,e)})`);return t}tryWorkspaceByLocator(e){let t=this.tryWorkspaceByIdent(e);return t===null||(jo(e)&&(e=nC(e)),t.locator.locatorHash!==e.locatorHash&&t.anchoredLocator.locatorHash!==e.locatorHash)?null:t}getWorkspaceByLocator(e){let t=this.tryWorkspaceByLocator(e);if(!t)throw new Error(`Workspace not found (${mt(this.configuration,e)})`);return t}refreshWorkspaceDependencies(){for(let e of this.workspaces){let t=this.storedPackages.get(e.anchoredLocator.locatorHash);if(!t)throw new Error(`Assertion failed: Expected workspace ${lC(this.configuration,e)} (${$e(this.configuration,x.join(e.cwd,xt.manifest),Ue.PATH)}) to have been resolved. Run \"yarn install\" to update the lockfile`);e.dependencies=new Map(t.dependencies)}}deleteDescriptor(e){this.storedResolutions.delete(e),this.storedDescriptors.delete(e)}deleteLocator(e){this.originalPackages.delete(e),this.storedPackages.delete(e),this.accessibleLocators.delete(e)}forgetResolution(e){if(\"descriptorHash\"in e){let t=this.storedResolutions.get(e.descriptorHash);this.deleteDescriptor(e.descriptorHash);let i=new Set(this.storedResolutions.values());typeof t<\"u\"&&!i.has(t)&&this.deleteLocator(t)}if(\"locatorHash\"in e){this.deleteLocator(e.locatorHash);for(let[t,i]of this.storedResolutions)i===e.locatorHash&&this.deleteDescriptor(t)}}forgetTransientResolutions(){let e=this.configuration.makeResolver(),t=new Map;for(let[i,n]of this.storedResolutions.entries()){let s=t.get(n);s||t.set(n,s=new Set),s.add(i)}for(let i of this.originalPackages.values()){let n;try{n=e.shouldPersistResolution(i,{project:this,resolver:e})}catch{n=!1}if(!n){this.deleteLocator(i.locatorHash);let s=t.get(i.locatorHash);if(s){t.delete(i.locatorHash);for(let o of s)this.deleteDescriptor(o)}}}}forgetVirtualResolutions(){for(let e of this.storedPackages.values())for(let[t,i]of e.dependencies)WA(i)&&e.dependencies.set(t,iC(i))}getDependencyMeta(e,t){let i={},s=this.topLevelWorkspace.manifest.dependenciesMeta.get(Ot(e));if(!s)return i;let o=s.get(null);if(o&&Object.assign(i,o),t===null||!k$.default.valid(t))return i;for(let[a,l]of s)a!==null&&a===t&&Object.assign(i,l);return i}async findLocatorForLocation(e,{strict:t=!1}={}){let i=new ti,n=this.configuration.getLinkers(),s={project:this,report:i};for(let o of n){let a=await o.findPackageLocator(e,s);if(a){if(t&&(await o.findPackageLocation(a,s)).replace(P$,\"\")!==e.replace(P$,\"\"))continue;return a}}return null}async resolveEverything(e){if(!this.workspacesByCwd||!this.workspacesByIdent)throw new Error(\"Workspaces must have been setup before calling this function\");this.forgetVirtualResolutions(),e.lockfileOnly||this.forgetTransientResolutions();let t=e.resolver||this.configuration.makeResolver(),i=new W0(t);await i.setup(this,{report:e.report});let n=e.lockfileOnly?[new V0(t)]:[i,t],s=new kf([new z0(t),...n]),o=this.configuration.makeFetcher(),a=e.lockfileOnly?{project:this,report:e.report,resolver:s}:{project:this,report:e.report,resolver:s,fetchOptions:{project:this,cache:e.cache,checksums:this.storedChecksums,report:e.report,fetcher:o,cacheOptions:{mirrorWriteOnly:!0}}},l=new Map,c=new Map,u=new Map,g=new Map,f=new Map,h=new Map,p=this.topLevelWorkspace.anchoredLocator,C=new Set,y=[],B=$D(),v=this.configuration.getSupportedArchitectures();await e.report.startProgressPromise(vi.progressViaTitle(),async W=>{let _=async O=>{let F=await df(async()=>await s.resolve(O,a),ke=>`${mt(this.configuration,O)}: ${ke}`);if(!oC(O,F))throw new Error(`Assertion failed: The locator cannot be changed by the resolver (went from ${mt(this.configuration,O)} to ${mt(this.configuration,F)})`);g.set(F.locatorHash,F);let ue=this.configuration.normalizePackage(F);for(let[ke,Fe]of ue.dependencies){let Ne=await this.configuration.reduceHook(le=>le.reduceDependency,Fe,this,ue,Fe,{resolver:s,resolveOptions:a});if(!sC(Fe,Ne))throw new Error(\"Assertion failed: The descriptor ident cannot be changed through aliases\");let oe=s.bindDescriptor(Ne,O,a);ue.dependencies.set(ke,oe)}let pe=io([...ue.dependencies.values()].map(ke=>re(ke)));return y.push(pe),pe.catch(()=>{}),c.set(ue.locatorHash,ue),ue},A=async O=>{let F=f.get(O.locatorHash);if(typeof F<\"u\")return F;let ue=Promise.resolve().then(()=>_(O));return f.set(O.locatorHash,ue),ue},Ae=async(O,F)=>{let ue=await re(F);return l.set(O.descriptorHash,O),u.set(O.descriptorHash,ue.locatorHash),ue},ge=async O=>{W.setTitle(tr(this.configuration,O));let F=this.resolutionAliases.get(O.descriptorHash);if(typeof F<\"u\")return Ae(O,this.storedDescriptors.get(F));let ue=s.getResolutionDependencies(O,a),pe=new Map(await io(ue.map(async Ne=>{let oe=s.bindDescriptor(Ne,p,a),le=await re(oe);return C.add(le.locatorHash),[Ne.descriptorHash,le]}))),Fe=(await df(async()=>await s.getCandidates(O,pe,a),Ne=>`${tr(this.configuration,O)}: ${Ne}`))[0];if(typeof Fe>\"u\")throw new Error(`${tr(this.configuration,O)}: No candidates found`);return l.set(O.descriptorHash,O),u.set(O.descriptorHash,Fe.locatorHash),A(Fe)},re=O=>{let F=h.get(O.descriptorHash);if(typeof F<\"u\")return F;l.set(O.descriptorHash,O);let ue=Promise.resolve().then(()=>ge(O));return h.set(O.descriptorHash,ue),ue};for(let O of this.workspaces){let F=O.anchoredDescriptor;y.push(re(F))}for(;y.length>0;){let O=[...y];y.length=0,await io(O)}});let D=new Set(this.resolutionAliases.values()),T=new Set(c.keys()),H=new Set,j=new Map;jMe({project:this,report:e.report,accessibleLocators:H,volatileDescriptors:D,optionalBuilds:T,peerRequirements:j,allDescriptors:l,allResolutions:u,allPackages:c});for(let W of C)T.delete(W);for(let W of D)l.delete(W),u.delete(W);let $=new Set,V=new Set;for(let W of c.values())W.conditions!=null&&(!T.has(W.locatorHash)||(kw(W,v)||(kw(W,B)&&e.report.reportWarningOnce(77,`${mt(this.configuration,W)}: Your current architecture (${process.platform}-${process.arch}) is supported by this package, but is missing from the ${$e(this.configuration,\"supportedArchitectures\",xi.SETTING)} setting`),V.add(W.locatorHash)),$.add(W.locatorHash)));this.storedResolutions=u,this.storedDescriptors=l,this.storedPackages=c,this.accessibleLocators=H,this.conditionalLocators=$,this.disabledLocators=V,this.originalPackages=g,this.optionalBuilds=T,this.peerRequirements=j,this.refreshWorkspaceDependencies()}async fetchEverything({cache:e,report:t,fetcher:i,mode:n}){let s={mockedPackages:this.disabledLocators,unstablePackages:this.conditionalLocators},o=i||this.configuration.makeFetcher(),a={checksums:this.storedChecksums,project:this,cache:e,fetcher:o,report:t,cacheOptions:s},l=Array.from(new Set(Qn(this.storedResolutions.values(),[f=>{let h=this.storedPackages.get(f);if(!h)throw new Error(\"Assertion failed: The locator should have been registered\");return Es(h)}])));n===\"update-lockfile\"&&(l=l.filter(f=>!this.storedChecksums.has(f)));let c=!1,u=vi.progressViaCounter(l.length);await t.reportProgress(u);let g=(0,_0.default)(HMe);if(await t.startCacheReport(async()=>{await io(l.map(f=>g(async()=>{let h=this.storedPackages.get(f);if(!h)throw new Error(\"Assertion failed: The locator should have been registered\");if(jo(h))return;let p;try{p=await o.fetch(h,a)}catch(C){C.message=`${mt(this.configuration,h)}: ${C.message}`,t.reportExceptionOnce(C),c=C;return}p.checksum!=null?this.storedChecksums.set(h.locatorHash,p.checksum):this.storedChecksums.delete(h.locatorHash),p.releaseFs&&p.releaseFs()}).finally(()=>{u.tick()})))}),c)throw c}async linkEverything({cache:e,report:t,fetcher:i,mode:n}){var Ae,ge,re;let s={mockedPackages:this.disabledLocators,unstablePackages:this.conditionalLocators,skipIntegrityCheck:!0},o=i||this.configuration.makeFetcher(),a={checksums:this.storedChecksums,project:this,cache:e,fetcher:o,report:t,skipIntegrityCheck:!0,cacheOptions:s},l=this.configuration.getLinkers(),c={project:this,report:t},u=new Map(l.map(O=>{let F=O.makeInstaller(c),ue=F.getCustomDataKey(),pe=this.installersCustomData.get(ue);return typeof pe<\"u\"&&F.attachCustomData(pe),[O,F]})),g=new Map,f=new Map,h=new Map,p=new Map(await io([...this.accessibleLocators].map(async O=>{let F=this.storedPackages.get(O);if(!F)throw new Error(\"Assertion failed: The locator should have been registered\");return[O,await o.fetch(F,a)]}))),C=[];for(let O of this.accessibleLocators){let F=this.storedPackages.get(O);if(typeof F>\"u\")throw new Error(\"Assertion failed: The locator should have been registered\");let ue=p.get(F.locatorHash);if(typeof ue>\"u\")throw new Error(\"Assertion failed: The fetch result should have been registered\");let pe=[],ke=Ne=>{pe.push(Ne)},Fe=this.tryWorkspaceByLocator(F);if(Fe!==null){let Ne=[],{scripts:oe}=Fe.manifest;for(let Be of[\"preinstall\",\"install\",\"postinstall\"])oe.has(Be)&&Ne.push([0,Be]);try{for(let[Be,fe]of u)if(Be.supportsPackage(F,c)&&(await fe.installPackage(F,ue,{holdFetchResult:ke})).buildDirective!==null)throw new Error(\"Assertion failed: Linkers can't return build directives for workspaces; this responsibility befalls to the Yarn core\")}finally{pe.length===0?(Ae=ue.releaseFs)==null||Ae.call(ue):C.push(io(pe).catch(()=>{}).then(()=>{var Be;(Be=ue.releaseFs)==null||Be.call(ue)}))}let le=x.join(ue.packageFs.getRealPath(),ue.prefixPath);f.set(F.locatorHash,le),!jo(F)&&Ne.length>0&&h.set(F.locatorHash,{directives:Ne,buildLocations:[le]})}else{let Ne=l.find(Be=>Be.supportsPackage(F,c));if(!Ne)throw new at(12,`${mt(this.configuration,F)} isn't supported by any available linker`);let oe=u.get(Ne);if(!oe)throw new Error(\"Assertion failed: The installer should have been registered\");let le;try{le=await oe.installPackage(F,ue,{holdFetchResult:ke})}finally{pe.length===0?(ge=ue.releaseFs)==null||ge.call(ue):C.push(io(pe).then(()=>{}).then(()=>{var Be;(Be=ue.releaseFs)==null||Be.call(ue)}))}g.set(F.locatorHash,Ne),f.set(F.locatorHash,le.packageLocation),le.buildDirective&&le.buildDirective.length>0&&le.packageLocation&&h.set(F.locatorHash,{directives:le.buildDirective,buildLocations:[le.packageLocation]})}}let y=new Map;for(let O of this.accessibleLocators){let F=this.storedPackages.get(O);if(!F)throw new Error(\"Assertion failed: The locator should have been registered\");let ue=this.tryWorkspaceByLocator(F)!==null,pe=async(ke,Fe)=>{let Ne=f.get(F.locatorHash);if(typeof Ne>\"u\")throw new Error(`Assertion failed: The package (${mt(this.configuration,F)}) should have been registered`);let oe=[];for(let le of F.dependencies.values()){let Be=this.storedResolutions.get(le.descriptorHash);if(typeof Be>\"u\")throw new Error(`Assertion failed: The resolution (${tr(this.configuration,le)}, from ${mt(this.configuration,F)})should have been registered`);let fe=this.storedPackages.get(Be);if(typeof fe>\"u\")throw new Error(`Assertion failed: The package (${Be}, resolved from ${tr(this.configuration,le)}) should have been registered`);let ae=this.tryWorkspaceByLocator(fe)===null?g.get(Be):null;if(typeof ae>\"u\")throw new Error(`Assertion failed: The package (${Be}, resolved from ${tr(this.configuration,le)}) should have been registered`);ae===ke||ae===null?f.get(fe.locatorHash)!==null&&oe.push([le,fe]):!ue&&Ne!==null&&hf(y,Be).push(Ne)}Ne!==null&&await Fe.attachInternalDependencies(F,oe)};if(ue)for(let[ke,Fe]of u)ke.supportsPackage(F,c)&&await pe(ke,Fe);else{let ke=g.get(F.locatorHash);if(!ke)throw new Error(\"Assertion failed: The linker should have been found\");let Fe=u.get(ke);if(!Fe)throw new Error(\"Assertion failed: The installer should have been registered\");await pe(ke,Fe)}}for(let[O,F]of y){let ue=this.storedPackages.get(O);if(!ue)throw new Error(\"Assertion failed: The package should have been registered\");let pe=g.get(ue.locatorHash);if(!pe)throw new Error(\"Assertion failed: The linker should have been found\");let ke=u.get(pe);if(!ke)throw new Error(\"Assertion failed: The installer should have been registered\");await ke.attachExternalDependents(ue,F)}let B=new Map;for(let O of u.values()){let F=await O.finalizeInstall();for(let ue of(re=F==null?void 0:F.records)!=null?re:[])h.set(ue.locatorHash,{directives:ue.buildDirective,buildLocations:ue.buildLocations});typeof(F==null?void 0:F.customData)<\"u\"&&B.set(O.getCustomDataKey(),F.customData)}if(this.installersCustomData=B,await io(C),n===\"skip-build\")return;let v=new Set(this.storedPackages.keys()),D=new Set(h.keys());for(let O of D)v.delete(O);let T=(0,X0.createHash)(\"sha512\");T.update(process.versions.node),await this.configuration.triggerHook(O=>O.globalHashGeneration,this,O=>{T.update(\"\\0\"),T.update(O)});let H=T.digest(\"hex\"),j=new Map,$=O=>{let F=j.get(O.locatorHash);if(typeof F<\"u\")return F;let ue=this.storedPackages.get(O.locatorHash);if(typeof ue>\"u\")throw new Error(\"Assertion failed: The package should have been registered\");let pe=(0,X0.createHash)(\"sha512\");pe.update(O.locatorHash),j.set(O.locatorHash,\"<recursive>\");for(let ke of ue.dependencies.values()){let Fe=this.storedResolutions.get(ke.descriptorHash);if(typeof Fe>\"u\")throw new Error(`Assertion failed: The resolution (${tr(this.configuration,ke)}) should have been registered`);let Ne=this.storedPackages.get(Fe);if(typeof Ne>\"u\")throw new Error(\"Assertion failed: The package should have been registered\");pe.update($(Ne))}return F=pe.digest(\"hex\"),j.set(O.locatorHash,F),F},V=(O,F)=>{let ue=(0,X0.createHash)(\"sha512\");ue.update(H),ue.update($(O));for(let pe of F)ue.update(pe);return ue.digest(\"hex\")},W=new Map,_=!1,A=O=>{let F=new Set([O.locatorHash]);for(let ue of F){let pe=this.storedPackages.get(ue);if(!pe)throw new Error(\"Assertion failed: The package should have been registered\");for(let ke of pe.dependencies.values()){let Fe=this.storedResolutions.get(ke.descriptorHash);if(!Fe)throw new Error(`Assertion failed: The resolution (${tr(this.configuration,ke)}) should have been registered`);if(Fe!==O.locatorHash&&D.has(Fe))return!1;let Ne=this.storedPackages.get(Fe);if(!Ne)throw new Error(\"Assertion failed: The package should have been registered\");let oe=this.tryWorkspaceByLocator(Ne);if(oe){if(oe.anchoredLocator.locatorHash!==O.locatorHash&&D.has(oe.anchoredLocator.locatorHash))return!1;F.add(oe.anchoredLocator.locatorHash)}F.add(Fe)}}return!0};for(;D.size>0;){let O=D.size,F=[];for(let ue of D){let pe=this.storedPackages.get(ue);if(!pe)throw new Error(\"Assertion failed: The package should have been registered\");if(!A(pe))continue;let ke=h.get(pe.locatorHash);if(!ke)throw new Error(\"Assertion failed: The build directive should have been registered\");let Fe=V(pe,ke.buildLocations);if(this.storedBuildState.get(pe.locatorHash)===Fe){W.set(pe.locatorHash,Fe),D.delete(ue);continue}_||(await this.persistInstallStateFile(),_=!0),this.storedBuildState.has(pe.locatorHash)?t.reportInfo(8,`${mt(this.configuration,pe)} must be rebuilt because its dependency tree changed`):t.reportInfo(7,`${mt(this.configuration,pe)} must be built because it never has been before or the last one failed`);let Ne=ke.buildLocations.map(async oe=>{if(!x.isAbsolute(oe))throw new Error(`Assertion failed: Expected the build location to be absolute (not ${oe})`);for(let[le,Be]of ke.directives){let fe=`# This file contains the result of Yarn building a package (${Es(pe)})\n`;switch(le){case 0:fe+=`# Script name: ${Be}\n`;break;case 1:fe+=`# Script code: ${Be}\n`;break}let ae=null;if(!await M.mktempPromise(async ne=>{let Y=x.join(ne,\"build.log\"),{stdout:he,stderr:ie}=this.configuration.getSubprocessStreams(Y,{header:fe,prefix:mt(this.configuration,pe),report:t}),de;try{switch(le){case 0:de=await TB(pe,Be,[],{cwd:oe,project:this,stdin:ae,stdout:he,stderr:ie});break;case 1:de=await JR(pe,Be,[],{cwd:oe,project:this,stdin:ae,stdout:he,stderr:ie});break}}catch(Pt){ie.write(Pt.stack),de=1}if(he.end(),ie.end(),de===0)return!0;M.detachTemp(ne);let _e=`${mt(this.configuration,pe)} couldn't be built successfully (exit code ${$e(this.configuration,de,Ue.NUMBER)}, logs can be found here: ${$e(this.configuration,Y,Ue.PATH)})`;return this.optionalBuilds.has(pe.locatorHash)?(t.reportInfo(9,_e),!0):(t.reportError(9,_e),!1)}))return!1}return!0});F.push(...Ne,Promise.allSettled(Ne).then(oe=>{D.delete(ue),oe.every(le=>le.status===\"fulfilled\"&&le.value===!0)&&W.set(pe.locatorHash,Fe)}))}if(await io(F),O===D.size){let ue=Array.from(D).map(pe=>{let ke=this.storedPackages.get(pe);if(!ke)throw new Error(\"Assertion failed: The package should have been registered\");return mt(this.configuration,ke)}).join(\", \");t.reportError(3,`Some packages have circular dependencies that make their build order unsatisfiable - as a result they won't be built (affected packages are: ${ue})`);break}}this.storedBuildState=W}async install(e){var a,l;let t=this.configuration.get(\"nodeLinker\");(a=ye.telemetry)==null||a.reportInstall(t),await e.report.startTimerPromise(\"Project validation\",{skipIfEmpty:!0},async()=>{await this.configuration.triggerHook(c=>c.validateProject,this,{reportWarning:e.report.reportWarning.bind(e.report),reportError:e.report.reportError.bind(e.report)})});for(let c of this.configuration.packageExtensions.values())for(let[,u]of c)for(let g of u)g.status=\"inactive\";let i=x.join(this.cwd,this.configuration.get(\"lockfileFilename\")),n=null;if(e.immutable)try{n=await M.readFilePromise(i,\"utf8\")}catch(c){throw c.code===\"ENOENT\"?new at(28,\"The lockfile would have been created by this install, which is explicitly forbidden.\"):c}await e.report.startTimerPromise(\"Resolution step\",async()=>{await this.resolveEverything(e)}),await e.report.startTimerPromise(\"Post-resolution validation\",{skipIfEmpty:!0},async()=>{for(let[,c]of this.configuration.packageExtensions)for(let[,u]of c)for(let g of u)if(g.userProvided){let f=$e(this.configuration,g,Ue.PACKAGE_EXTENSION);switch(g.status){case\"inactive\":e.report.reportWarning(68,`${f}: No matching package in the dependency tree; you may not need this rule anymore.`);break;case\"redundant\":e.report.reportWarning(69,`${f}: This rule seems redundant when applied on the original package; the extension may have been applied upstream.`);break}}if(n!==null){let c=Vl(n,this.generateLockfile());if(c!==n){let u=IZ(i,i,n,c,void 0,void 0,{maxEditLength:100});if(u){e.report.reportSeparator();for(let g of u.hunks){e.report.reportInfo(null,`@@ -${g.oldStart},${g.oldLines} +${g.newStart},${g.newLines} @@`);for(let f of g.lines)f.startsWith(\"+\")?e.report.reportError(28,$e(this.configuration,f,Ue.ADDED)):f.startsWith(\"-\")?e.report.reportError(28,$e(this.configuration,f,Ue.REMOVED)):e.report.reportInfo(null,$e(this.configuration,f,\"grey\"))}e.report.reportSeparator()}throw new at(28,\"The lockfile would have been modified by this install, which is explicitly forbidden.\")}}});for(let c of this.configuration.packageExtensions.values())for(let[,u]of c)for(let g of u)g.userProvided&&g.status===\"active\"&&((l=ye.telemetry)==null||l.reportPackageExtension(Bc(g,Ue.PACKAGE_EXTENSION)));await e.report.startTimerPromise(\"Fetch step\",async()=>{await this.fetchEverything(e),(typeof e.persistProject>\"u\"||e.persistProject)&&e.mode!==\"update-lockfile\"&&await this.cacheCleanup(e)});let s=e.immutable?[...new Set(this.configuration.get(\"immutablePatterns\"))].sort():[],o=await Promise.all(s.map(async c=>bw(c,{cwd:this.cwd})));(typeof e.persistProject>\"u\"||e.persistProject)&&await this.persist(),await e.report.startTimerPromise(\"Link step\",async()=>{if(e.mode===\"update-lockfile\"){e.report.reportWarning(73,`Skipped due to ${$e(this.configuration,\"mode=update-lockfile\",Ue.CODE)}`);return}await this.linkEverything(e);let c=await Promise.all(s.map(async u=>bw(u,{cwd:this.cwd})));for(let u=0;u<s.length;++u)o[u]!==c[u]&&e.report.reportError(64,`The checksum for ${s[u]} has been modified by this install, which is explicitly forbidden.`)}),await this.persistInstallStateFile(),await this.configuration.triggerHook(c=>c.afterAllInstalled,this,e)}generateLockfile(){let e=new Map;for(let[n,s]of this.storedResolutions.entries()){let o=e.get(s);o||e.set(s,o=new Set),o.add(n)}let t={};t.__metadata={version:x$,cacheKey:void 0};for(let[n,s]of e.entries()){let o=this.originalPackages.get(n);if(!o)continue;let a=[];for(let f of s){let h=this.storedDescriptors.get(f);if(!h)throw new Error(\"Assertion failed: The descriptor should have been registered\");a.push(h)}let l=a.map(f=>Sn(f)).sort().join(\", \"),c=new ot;c.version=o.linkType===\"HARD\"?o.version:\"0.0.0-use.local\",c.languageName=o.languageName,c.dependencies=new Map(o.dependencies),c.peerDependencies=new Map(o.peerDependencies),c.dependenciesMeta=new Map(o.dependenciesMeta),c.peerDependenciesMeta=new Map(o.peerDependenciesMeta),c.bin=new Map(o.bin);let u,g=this.storedChecksums.get(o.locatorHash);if(typeof g<\"u\"){let f=g.indexOf(\"/\");if(f===-1)throw new Error(\"Assertion failed: Expected the checksum to reference its cache key\");let h=g.slice(0,f),p=g.slice(f+1);typeof t.__metadata.cacheKey>\"u\"&&(t.__metadata.cacheKey=h),h===t.__metadata.cacheKey?u=p:u=g}t[l]={...c.exportTo({},{compatibilityMode:!1}),linkType:o.linkType.toLowerCase(),resolution:Es(o),checksum:u,conditions:o.conditions||void 0}}return`${[`# This file is generated by running \"yarn install\" inside your project.\n`,`# Manual changes might be lost - proceed with caution!\n`].join(\"\")}\n`+Qa(t)}async persistLockfile(){let e=x.join(this.cwd,this.configuration.get(\"lockfileFilename\")),t=\"\";try{t=await M.readFilePromise(e,\"utf8\")}catch{}let i=this.generateLockfile(),n=Vl(t,i);n!==t&&(await M.writeFilePromise(e,n),this.lockFileChecksum=D$(n),this.lockfileNeedsRefresh=!1)}async persistInstallStateFile(){let e=[];for(let o of Object.values(jN))e.push(...o);let t=(0,Z0.default)(this,e),i=qN.default.serialize(t),n=rn(i);if(this.installStateChecksum===n)return;let s=this.configuration.get(\"installStatePath\");await M.mkdirPromise(x.dirname(s),{recursive:!0}),await M.writeFilePromise(s,await GMe(i)),this.installStateChecksum=n}async restoreInstallState({restoreInstallersCustomData:e=!0,restoreResolutions:t=!0,restoreBuildState:i=!0}={}){let n=this.configuration.get(\"installStatePath\"),s;try{let o=await YMe(await M.readFilePromise(n));s=qN.default.deserialize(o),this.installStateChecksum=rn(o)}catch{t&&await this.applyLightResolution();return}e&&typeof s.installersCustomData<\"u\"&&(this.installersCustomData=s.installersCustomData),i&&Object.assign(this,(0,Z0.default)(s,jN.restoreBuildState)),t&&(s.lockFileChecksum===this.lockFileChecksum?(Object.assign(this,(0,Z0.default)(s,jN.restoreResolutions)),this.refreshWorkspaceDependencies()):await this.applyLightResolution())}async applyLightResolution(){await this.resolveEverything({lockfileOnly:!0,report:new ti}),await this.persistInstallStateFile()}async persist(){let e=(0,_0.default)(4);await Promise.all([this.persistLockfile(),...this.workspaces.map(t=>e(()=>t.persistManifest()))])}async cacheCleanup({cache:e,report:t}){if(this.configuration.get(\"enableGlobalCache\"))return;let i=new Set([\".gitignore\"]);if(!ZD(e.cwd,this.cwd)||!await M.existsPromise(e.cwd))return;let n=this.configuration.get(\"preferAggregateCacheInfo\"),s=0,o=null;for(let a of await M.readdirPromise(e.cwd)){if(i.has(a))continue;let l=x.resolve(e.cwd,a);e.markedFiles.has(l)||(o=a,e.immutable?t.reportError(56,`${$e(this.configuration,x.basename(l),\"magenta\")} appears to be unused and would be marked for deletion, but the cache is immutable`):(n?s+=1:t.reportInfo(19,`${$e(this.configuration,x.basename(l),\"magenta\")} appears to be unused - removing`),await M.removePromise(l)))}n&&s!==0&&t.reportInfo(19,s>1?`${s} packages appeared to be unused and were removed`:`${o} appeared to be unused and was removed`),e.markedFiles.clear()}};function jMe({project:r,allDescriptors:e,allResolutions:t,allPackages:i,accessibleLocators:n=new Set,optionalBuilds:s=new Set,peerRequirements:o=new Map,volatileDescriptors:a=new Set,report:l}){var V;let c=new Map,u=[],g=new Map,f=new Map,h=new Map,p=new Map,C=new Map,y=new Map(r.workspaces.map(W=>{let _=W.anchoredLocator.locatorHash,A=i.get(_);if(typeof A>\"u\")throw new Error(\"Assertion failed: The workspace should have an associated package\");return[_,rC(A)]})),B=()=>{let W=M.mktempSync(),_=x.join(W,\"stacktrace.log\"),A=String(u.length+1).length,Ae=u.map((ge,re)=>`${`${re+1}.`.padStart(A,\" \")} ${Es(ge)}\n`).join(\"\");throw M.writeFileSync(_,Ae),M.detachTemp(W),new at(45,`Encountered a stack overflow when resolving peer dependencies; cf ${K.fromPortablePath(_)}`)},v=W=>{let _=t.get(W.descriptorHash);if(typeof _>\"u\")throw new Error(\"Assertion failed: The resolution should have been registered\");let A=i.get(_);if(!A)throw new Error(\"Assertion failed: The package could not be found\");return A},D=(W,_,A,{top:Ae,optional:ge})=>{u.length>1e3&&B(),u.push(_);let re=T(W,_,A,{top:Ae,optional:ge});return u.pop(),re},T=(W,_,A,{top:Ae,optional:ge})=>{if(n.has(_.locatorHash))return;n.add(_.locatorHash),ge||s.delete(_.locatorHash);let re=i.get(_.locatorHash);if(!re)throw new Error(`Assertion failed: The package (${mt(r.configuration,_)}) should have been registered`);let O=[],F=[],ue=[],pe=[],ke=[];for(let Ne of Array.from(re.dependencies.values())){if(re.peerDependencies.has(Ne.identHash)&&re.locatorHash!==Ae)continue;if(WA(Ne))throw new Error(\"Assertion failed: Virtual packages shouldn't be encountered when virtualizing a branch\");a.delete(Ne.descriptorHash);let oe=ge;if(!oe){let Y=re.dependenciesMeta.get(Ot(Ne));if(typeof Y<\"u\"){let he=Y.get(null);typeof he<\"u\"&&he.optional&&(oe=!0)}}let le=t.get(Ne.descriptorHash);if(!le)throw new Error(`Assertion failed: The resolution (${tr(r.configuration,Ne)}) should have been registered`);let Be=y.get(le)||i.get(le);if(!Be)throw new Error(`Assertion failed: The package (${le}, resolved from ${tr(r.configuration,Ne)}) should have been registered`);if(Be.peerDependencies.size===0){D(Ne,Be,new Map,{top:Ae,optional:oe});continue}let fe,ae,qe=new Set,ne;F.push(()=>{fe=GD(Ne,_.locatorHash),ae=YD(Be,_.locatorHash),re.dependencies.delete(Ne.identHash),re.dependencies.set(fe.identHash,fe),t.set(fe.descriptorHash,ae.locatorHash),e.set(fe.descriptorHash,fe),i.set(ae.locatorHash,ae),O.push([Be,fe,ae])}),ue.push(()=>{var Y;ne=new Map;for(let he of ae.peerDependencies.values()){let ie=re.dependencies.get(he.identHash);if(!ie&&sC(_,he)&&(W.identHash===_.identHash?ie=W:(ie=_t(_,W.range),e.set(ie.descriptorHash,ie),t.set(ie.descriptorHash,_.locatorHash),a.delete(ie.descriptorHash))),(!ie||ie.range===\"missing:\")&&ae.dependencies.has(he.identHash)){ae.peerDependencies.delete(he.identHash);continue}ie||(ie=_t(he,\"missing:\")),ae.dependencies.set(ie.identHash,ie),WA(ie)&&wc(h,ie.descriptorHash).add(ae.locatorHash),g.set(ie.identHash,ie),ie.range===\"missing:\"&&qe.add(ie.identHash),ne.set(he.identHash,(Y=A.get(he.identHash))!=null?Y:ae.locatorHash)}ae.dependencies=new Map(Qn(ae.dependencies,([he,ie])=>Ot(ie)))}),pe.push(()=>{if(!i.has(ae.locatorHash))return;let Y=c.get(Be.locatorHash);typeof Y==\"number\"&&Y>=2&&B();let he=c.get(Be.locatorHash),ie=typeof he<\"u\"?he+1:1;c.set(Be.locatorHash,ie),D(fe,ae,ne,{top:Ae,optional:oe}),c.set(Be.locatorHash,ie-1)}),ke.push(()=>{let Y=re.dependencies.get(Ne.identHash);if(typeof Y>\"u\")throw new Error(\"Assertion failed: Expected the peer dependency to have been turned into a dependency\");let he=t.get(Y.descriptorHash);if(typeof he>\"u\")throw new Error(\"Assertion failed: Expected the descriptor to be registered\");if(wc(C,he).add(_.locatorHash),!!i.has(ae.locatorHash)){for(let ie of ae.peerDependencies.values()){let de=ne.get(ie.identHash);if(typeof de>\"u\")throw new Error(\"Assertion failed: Expected the peer dependency ident to be registered\");hf(pf(p,de),Ot(ie)).push(ae.locatorHash)}for(let ie of qe)ae.dependencies.delete(ie)}})}for(let Ne of[...F,...ue])Ne();let Fe;do{Fe=!0;for(let[Ne,oe,le]of O){let Be=pf(f,Ne.locatorHash),fe=rn(...[...le.dependencies.values()].map(Y=>{let he=Y.range!==\"missing:\"?t.get(Y.descriptorHash):\"missing:\";if(typeof he>\"u\")throw new Error(`Assertion failed: Expected the resolution for ${tr(r.configuration,Y)} to have been registered`);return he===Ae?`${he} (top)`:he}),oe.identHash),ae=Be.get(fe);if(typeof ae>\"u\"){Be.set(fe,oe);continue}if(ae===oe)continue;i.delete(le.locatorHash),e.delete(oe.descriptorHash),t.delete(oe.descriptorHash),n.delete(le.locatorHash);let qe=h.get(oe.descriptorHash)||[],ne=[re.locatorHash,...qe];h.delete(oe.descriptorHash);for(let Y of ne){let he=i.get(Y);typeof he>\"u\"||(he.dependencies.get(oe.identHash).descriptorHash!==ae.descriptorHash&&(Fe=!1),he.dependencies.set(oe.identHash,ae))}}}while(!Fe);for(let Ne of[...pe,...ke])Ne()};for(let W of r.workspaces){let _=W.anchoredLocator;a.delete(W.anchoredDescriptor.descriptorHash),D(W.anchoredDescriptor,_,new Map,{top:_.locatorHash,optional:!1})}let H;(A=>(A[A.NotProvided=0]=\"NotProvided\",A[A.NotCompatible=1]=\"NotCompatible\"))(H||(H={}));let j=[];for(let[W,_]of C){let A=i.get(W);if(typeof A>\"u\")throw new Error(\"Assertion failed: Expected the root to be registered\");let Ae=p.get(W);if(!(typeof Ae>\"u\"))for(let ge of _){let re=i.get(ge);if(!(typeof re>\"u\"))for(let[O,F]of Ae){let ue=tn(O);if(re.peerDependencies.has(ue.identHash))continue;let pe=`p${rn(ge,O,W).slice(0,5)}`;o.set(pe,{subject:ge,requested:ue,rootRequester:W,allRequesters:F});let ke=A.dependencies.get(ue.identHash);if(typeof ke<\"u\"){let Fe=v(ke),Ne=(V=Fe.version)!=null?V:\"0.0.0\",oe=new Set;for(let Be of F){let fe=i.get(Be);if(typeof fe>\"u\")throw new Error(\"Assertion failed: Expected the link to be registered\");let ae=fe.peerDependencies.get(ue.identHash);if(typeof ae>\"u\")throw new Error(\"Assertion failed: Expected the ident to be registered\");oe.add(ae.range)}[...oe].every(Be=>{if(Be.startsWith(jr.protocol)){if(!r.tryWorkspaceByLocator(Fe))return!1;Be=Be.slice(jr.protocol.length),(Be===\"^\"||Be===\"~\")&&(Be=\"*\")}return kc(Ne,Be)})||j.push({type:1,subject:re,requested:ue,requester:A,version:Ne,hash:pe,requirementCount:F.length})}else{let Fe=A.peerDependenciesMeta.get(O);Fe!=null&&Fe.optional||j.push({type:0,subject:re,requested:ue,requester:A,hash:pe})}}}}let $=[W=>jD(W.subject),W=>Ot(W.requested),W=>`${W.type}`];l==null||l.startSectionSync({reportFooter:()=>{l.reportWarning(0,`Some peer dependencies are incorrectly met; run ${$e(r.configuration,\"yarn explain peer-requirements <hash>\",Ue.CODE)} for details, where ${$e(r.configuration,\"<hash>\",Ue.CODE)} is the six-letter p-prefixed code`)},skipIfEmpty:!0},()=>{for(let W of Qn(j,$))switch(W.type){case 0:l.reportWarning(2,`${mt(r.configuration,W.subject)} doesn't provide ${Ai(r.configuration,W.requested)} (${$e(r.configuration,W.hash,Ue.CODE)}), requested by ${Ai(r.configuration,W.requester)}`);break;case 1:{let _=W.requirementCount>1?\"and some of its descendants request\":\"requests\";l.reportWarning(60,`${mt(r.configuration,W.subject)} provides ${Ai(r.configuration,W.requested)} (${$e(r.configuration,W.hash,Ue.CODE)}) with version ${AC(r.configuration,W.version)}, which doesn't satisfy what ${Ai(r.configuration,W.requester)} ${_}`)}break}})}var Sh=class{constructor(e,t){this.values=new Map;this.hits=new Map;this.enumerators=new Map;this.configuration=e;let i=this.getRegistryPath();this.isNew=!M.existsSync(i),this.sendReport(t),this.startBuffer()}reportVersion(e){this.reportValue(\"version\",e.replace(/-git\\..*/,\"-git\"))}reportCommandName(e){this.reportValue(\"commandName\",e||\"<none>\")}reportPluginName(e){this.reportValue(\"pluginName\",e)}reportProject(e){this.reportEnumerator(\"projectCount\",e)}reportInstall(e){this.reportHit(\"installCount\",e)}reportPackageExtension(e){this.reportValue(\"packageExtension\",e)}reportWorkspaceCount(e){this.reportValue(\"workspaceCount\",String(e))}reportDependencyCount(e){this.reportValue(\"dependencyCount\",String(e))}reportValue(e,t){wc(this.values,e).add(t)}reportEnumerator(e,t){wc(this.enumerators,e).add(rn(t))}reportHit(e,t=\"*\"){let i=pf(this.hits,e),n=Ta(i,t,()=>0);i.set(t,n+1)}getRegistryPath(){let e=this.configuration.get(\"globalFolder\");return x.join(e,\"telemetry.json\")}sendReport(e){var u,g,f;let t=this.getRegistryPath(),i;try{i=M.readJsonSync(t)}catch{i={}}let n=Date.now(),s=this.configuration.get(\"telemetryInterval\")*24*60*60*1e3,a=((u=i.lastUpdate)!=null?u:n+s+Math.floor(s*Math.random()))+s;if(a>n&&i.lastUpdate!=null)return;try{M.mkdirSync(x.dirname(t),{recursive:!0}),M.writeJsonSync(t,{lastUpdate:n})}catch{return}if(a>n||!i.blocks)return;let l=`https://browser-http-intake.logs.datadoghq.eu/v1/input/${e}?ddsource=yarn`,c=h=>kR(l,h,{configuration:this.configuration}).catch(()=>{});for(let[h,p]of Object.entries((g=i.blocks)!=null?g:{})){if(Object.keys(p).length===0)continue;let C=p;C.userId=h,C.reportType=\"primary\";for(let v of Object.keys((f=C.enumerators)!=null?f:{}))C.enumerators[v]=C.enumerators[v].length;c(C);let y=new Map,B=20;for(let[v,D]of Object.entries(C.values))D.length>0&&y.set(v,D.slice(0,B));for(;y.size>0;){let v={};v.userId=h,v.reportType=\"secondary\",v.metrics={};for(let[D,T]of y)v.metrics[D]=T.shift(),T.length===0&&y.delete(D);c(v)}}}applyChanges(){var o,a,l,c,u,g,f,h,p;let e=this.getRegistryPath(),t;try{t=M.readJsonSync(e)}catch{t={}}let i=(o=this.configuration.get(\"telemetryUserId\"))!=null?o:\"*\",n=t.blocks=(a=t.blocks)!=null?a:{},s=n[i]=(l=n[i])!=null?l:{};for(let C of this.hits.keys()){let y=s.hits=(c=s.hits)!=null?c:{},B=y[C]=(u=y[C])!=null?u:{};for(let[v,D]of this.hits.get(C))B[v]=((g=B[v])!=null?g:0)+D}for(let C of[\"values\",\"enumerators\"])for(let y of this[C].keys()){let B=s[C]=(f=s[C])!=null?f:{};B[y]=[...new Set([...(h=B[y])!=null?h:[],...(p=this[C].get(y))!=null?p:[]])]}M.mkdirSync(x.dirname(e),{recursive:!0}),M.writeJsonSync(e,t)}startBuffer(){process.on(\"exit\",()=>{try{this.applyChanges()}catch{}})}};var zN=J(\"child_process\"),R$=Pe(Ac());var VN=J(\"fs\");var vh=new Map([[\"constraints\",[[\"constraints\",\"query\"],[\"constraints\",\"source\"],[\"constraints\"]]],[\"exec\",[]],[\"interactive-tools\",[[\"search\"],[\"upgrade-interactive\"]]],[\"stage\",[[\"stage\"]]],[\"typescript\",[]],[\"version\",[[\"version\",\"apply\"],[\"version\",\"check\"],[\"version\"]]],[\"workspace-tools\",[[\"workspaces\",\"focus\"],[\"workspaces\",\"foreach\"]]]]);function qMe(r){let e=K.fromPortablePath(r);process.on(\"SIGINT\",()=>{}),e?(0,zN.execFileSync)(process.execPath,[e,...process.argv.slice(2)],{stdio:\"inherit\",env:{...process.env,YARN_IGNORE_PATH:\"1\",YARN_IGNORE_CWD:\"1\"}}):(0,zN.execFileSync)(e,process.argv.slice(2),{stdio:\"inherit\",env:{...process.env,YARN_IGNORE_PATH:\"1\",YARN_IGNORE_CWD:\"1\"}})}async function $0({binaryVersion:r,pluginConfiguration:e}){async function t(){let n=new Gn({binaryLabel:\"Yarn Package Manager\",binaryName:\"yarn\",binaryVersion:r});try{await i(n)}catch(s){process.stdout.write(n.error(s)),process.exitCode=1}}async function i(n){var C,y,B,v,D;let s=process.versions.node,o=\">=12 <14 || 14.2 - 14.9 || >14.10.0\";if(!Ie.parseOptionalBoolean(process.env.YARN_IGNORE_NODE)&&!vt.satisfiesWithPrereleases(s,o))throw new be(`This tool requires a Node version compatible with ${o} (got ${s}). Upgrade Node, or set \\`YARN_IGNORE_NODE=1\\` in your environment.`);let l=await ye.find(K.toPortablePath(process.cwd()),e,{usePath:!0,strict:!1}),c=l.get(\"yarnPath\"),u=l.get(\"ignorePath\"),g=l.get(\"ignoreCwd\"),f=K.toPortablePath(K.resolve(process.argv[1])),h=T=>M.readFilePromise(T).catch(()=>Buffer.of());if(!u&&!g&&await(async()=>c===f||Buffer.compare(...await Promise.all([h(c),h(f)]))===0)()){process.env.YARN_IGNORE_PATH=\"1\",process.env.YARN_IGNORE_CWD=\"1\",await i(n);return}else if(c!==null&&!u)if(!M.existsSync(c))process.stdout.write(n.error(new Error(`The \"yarn-path\" option has been set (in ${l.sources.get(\"yarnPath\")}), but the specified location doesn't exist (${c}).`))),process.exitCode=1;else try{qMe(c)}catch(T){process.exitCode=T.code||1}else{u&&delete process.env.YARN_IGNORE_PATH,l.get(\"enableTelemetry\")&&!R$.isCI&&process.stdout.isTTY&&(ye.telemetry=new Sh(l,\"puba9cdc10ec5790a2cf4969dd413a47270\")),(C=ye.telemetry)==null||C.reportVersion(r);for(let[$,V]of l.plugins.entries()){vh.has((B=(y=$.match(/^@yarnpkg\\/plugin-(.*)$/))==null?void 0:y[1])!=null?B:\"\")&&((v=ye.telemetry)==null||v.reportPluginName($));for(let W of V.commands||[])n.register(W)}let H=n.process(process.argv.slice(2));H.help||(D=ye.telemetry)==null||D.reportCommandName(H.path.join(\" \"));let j=H.cwd;if(typeof j<\"u\"&&!g){let $=(0,VN.realpathSync)(process.cwd()),V=(0,VN.realpathSync)(j);if($!==V){process.chdir(j),await t();return}}await n.runExit(H,{cwd:K.toPortablePath(process.cwd()),plugins:e,quiet:!1,stdin:process.stdin,stdout:process.stdout,stderr:process.stderr})}}return t().catch(n=>{process.stdout.write(n.stack||n.message),process.exitCode=1}).finally(()=>M.rmtempPromise())}function F$(r){r.Command.Path=(...e)=>t=>{t.paths=t.paths||[],t.paths.push(e)};for(let e of[\"Array\",\"Boolean\",\"String\",\"Proxy\",\"Rest\",\"Counter\"])r.Command[e]=(...t)=>(i,n)=>{let s=r.Option[e](...t);Object.defineProperty(i,`__${n}`,{configurable:!1,enumerable:!0,get(){return s},set(o){this[n]=o}})};return r}var Nm={};ut(Nm,{BaseCommand:()=>De,WorkspaceRequiredError:()=>ct,getDynamicLibs:()=>Jie,getPluginConfiguration:()=>BQ,main:()=>$0,openWorkspace:()=>Hh,pluginCommands:()=>vh});var De=class extends ve{constructor(){super(...arguments);this.cwd=z.String(\"--cwd\",{hidden:!0})}};var ct=class extends be{constructor(e,t){let i=x.relative(e,t),n=x.join(e,ot.fileName);super(`This command can only be run from within a workspace of your project (${i} isn't a workspace of ${n}).`)}};var ZYe=Pe(Xr());ls();var _Ye=Pe(WT()),Jie=()=>new Map([[\"@yarnpkg/cli\",Nm],[\"@yarnpkg/core\",sm],[\"@yarnpkg/fslib\",Wp],[\"@yarnpkg/libzip\",xC],[\"@yarnpkg/parsers\",td],[\"@yarnpkg/shell\",RC],[\"clipanion\",ud],[\"semver\",ZYe],[\"typanion\",hn],[\"yup\",_Ye]]);async function Hh(r,e){let{project:t,workspace:i}=await je.find(r,e);if(!i)throw new ct(t.cwd,e);return i}var v9e=Pe(Xr());ls();var x9e=Pe(WT());var pO={};ut(pO,{dedupeUtils:()=>NQ,default:()=>cWe,suggestUtils:()=>qh});var qae=Pe(Ac());var Nse=Pe(Km());ls();var qh={};ut(qh,{Modifier:()=>KL,Strategy:()=>DQ,Target:()=>Um,WorkspaceModifier:()=>xse,applyModifier:()=>Dse,extractDescriptorFromPath:()=>UL,extractRangeModifier:()=>Pse,fetchDescriptorFrom:()=>HL,findProjectDescriptors:()=>Fse,getModifier:()=>Hm,getSuggestedDescriptors:()=>Gm,makeWorkspaceDescriptor:()=>Rse,toWorkspaceModifier:()=>kse});var ML=Pe(Xr()),dqe=\"workspace:\",Um=(i=>(i.REGULAR=\"dependencies\",i.DEVELOPMENT=\"devDependencies\",i.PEER=\"peerDependencies\",i))(Um||{}),KL=(i=>(i.CARET=\"^\",i.TILDE=\"~\",i.EXACT=\"\",i))(KL||{}),xse=(i=>(i.CARET=\"^\",i.TILDE=\"~\",i.EXACT=\"*\",i))(xse||{}),DQ=(s=>(s.KEEP=\"keep\",s.REUSE=\"reuse\",s.PROJECT=\"project\",s.LATEST=\"latest\",s.CACHE=\"cache\",s))(DQ||{});function Hm(r,e){return r.exact?\"\":r.caret?\"^\":r.tilde?\"~\":e.configuration.get(\"defaultSemverRangePrefix\")}var Cqe=/^([\\^~]?)[0-9]+(?:\\.[0-9]+){0,2}(?:-\\S+)?$/;function Pse(r,{project:e}){let t=r.match(Cqe);return t?t[1]:e.configuration.get(\"defaultSemverRangePrefix\")}function Dse(r,e){let{protocol:t,source:i,params:n,selector:s}=P.parseRange(r.range);return ML.default.valid(s)&&(s=`${e}${r.range}`),P.makeDescriptor(r,P.makeRange({protocol:t,source:i,params:n,selector:s}))}function kse(r){switch(r){case\"^\":return\"^\";case\"~\":return\"~\";case\"\":return\"*\";default:throw new Error(`Assertion failed: Unknown modifier: \"${r}\"`)}}function Rse(r,e){return P.makeDescriptor(r.anchoredDescriptor,`${dqe}${kse(e)}`)}async function Fse(r,{project:e,target:t}){let i=new Map,n=s=>{let o=i.get(s.descriptorHash);return o||i.set(s.descriptorHash,o={descriptor:s,locators:[]}),o};for(let s of e.workspaces)if(t===\"peerDependencies\"){let o=s.manifest.peerDependencies.get(r.identHash);o!==void 0&&n(o).locators.push(s.anchoredLocator)}else{let o=s.manifest.dependencies.get(r.identHash),a=s.manifest.devDependencies.get(r.identHash);t===\"devDependencies\"?a!==void 0?n(a).locators.push(s.anchoredLocator):o!==void 0&&n(o).locators.push(s.anchoredLocator):o!==void 0?n(o).locators.push(s.anchoredLocator):a!==void 0&&n(a).locators.push(s.anchoredLocator)}return i}async function UL(r,{cwd:e,workspace:t}){return await mqe(async i=>{x.isAbsolute(r)||(r=x.relative(t.cwd,x.resolve(e,r)),r.match(/^\\.{0,2}\\//)||(r=`./${r}`));let{project:n}=t,s=await HL(P.makeIdent(null,\"archive\"),r,{project:t.project,cache:i,workspace:t});if(!s)throw new Error(\"Assertion failed: The descriptor should have been found\");let o=new ti,a=n.configuration.makeResolver(),l=n.configuration.makeFetcher(),c={checksums:n.storedChecksums,project:n,cache:i,fetcher:l,report:o,resolver:a},u=a.bindDescriptor(s,t.anchoredLocator,c),g=P.convertDescriptorToLocator(u),f=await l.fetch(g,c),h=await ot.find(f.prefixPath,{baseFs:f.packageFs});if(!h.name)throw new Error(\"Target path doesn't have a name\");return P.makeDescriptor(h.name,r)})}async function Gm(r,{project:e,workspace:t,cache:i,target:n,modifier:s,strategies:o,maxResults:a=1/0}){if(!(a>=0))throw new Error(`Invalid maxResults (${a})`);if(r.range!==\"unknown\")return{suggestions:[{descriptor:r,name:`Use ${P.prettyDescriptor(e.configuration,r)}`,reason:\"(unambiguous explicit request)\"}],rejections:[]};let l=typeof t<\"u\"&&t!==null&&t.manifest[n].get(r.identHash)||null,c=[],u=[],g=async f=>{try{await f()}catch(h){u.push(h)}};for(let f of o){if(c.length>=a)break;switch(f){case\"keep\":await g(async()=>{l&&c.push({descriptor:l,name:`Keep ${P.prettyDescriptor(e.configuration,l)}`,reason:\"(no changes)\"})});break;case\"reuse\":await g(async()=>{for(let{descriptor:h,locators:p}of(await Fse(r,{project:e,target:n})).values()){if(p.length===1&&p[0].locatorHash===t.anchoredLocator.locatorHash&&o.includes(\"keep\"))continue;let C=`(originally used by ${P.prettyLocator(e.configuration,p[0])}`;C+=p.length>1?` and ${p.length-1} other${p.length>2?\"s\":\"\"})`:\")\",c.push({descriptor:h,name:`Reuse ${P.prettyDescriptor(e.configuration,h)}`,reason:C})}});break;case\"cache\":await g(async()=>{for(let h of e.storedDescriptors.values())h.identHash===r.identHash&&c.push({descriptor:h,name:`Reuse ${P.prettyDescriptor(e.configuration,h)}`,reason:\"(already used somewhere in the lockfile)\"})});break;case\"project\":await g(async()=>{if(t.manifest.name!==null&&r.identHash===t.manifest.name.identHash)return;let h=e.tryWorkspaceByIdent(r);if(h===null)return;let p=Rse(h,s);c.push({descriptor:p,name:`Attach ${P.prettyDescriptor(e.configuration,p)}`,reason:`(local workspace at ${ee.pretty(e.configuration,h.relativeCwd,ee.Type.PATH)})`})});break;case\"latest\":await g(async()=>{if(r.range!==\"unknown\")c.push({descriptor:r,name:`Use ${P.prettyRange(e.configuration,r.range)}`,reason:\"(explicit range requested)\"});else if(n===\"peerDependencies\")c.push({descriptor:P.makeDescriptor(r,\"*\"),name:\"Use *\",reason:\"(catch-all peer dependency pattern)\"});else if(!e.configuration.get(\"enableNetwork\"))c.push({descriptor:null,name:\"Resolve from latest\",reason:ee.pretty(e.configuration,\"(unavailable because enableNetwork is toggled off)\",\"grey\")});else{let h=await HL(r,\"latest\",{project:e,cache:i,workspace:t,preserveModifier:!1});h&&(h=Dse(h,s),c.push({descriptor:h,name:`Use ${P.prettyDescriptor(e.configuration,h)}`,reason:\"(resolved from latest)\"}))}});break}}return{suggestions:c.slice(0,a),rejections:u.slice(0,a)}}async function HL(r,e,{project:t,cache:i,workspace:n,preserveModifier:s=!0}){let o=P.makeDescriptor(r,e),a=new ti,l=t.configuration.makeFetcher(),c=t.configuration.makeResolver(),u={project:t,fetcher:l,cache:i,checksums:t.storedChecksums,report:a,cacheOptions:{skipIntegrityCheck:!0},skipIntegrityCheck:!0},g={...u,resolver:c,fetchOptions:u},f=c.bindDescriptor(o,n.anchoredLocator,g),h=await c.getCandidates(f,new Map,g);if(h.length===0)return null;let p=h[0],{protocol:C,source:y,params:B,selector:v}=P.parseRange(P.convertToManifestRange(p.reference));if(C===t.configuration.get(\"defaultProtocol\")&&(C=null),ML.default.valid(v)&&s!==!1){let D=typeof s==\"string\"?s:o.range;v=Pse(D,{project:t})+v}return P.makeDescriptor(p,P.makeRange({protocol:C,source:y,params:B,selector:v}))}async function mqe(r){return await M.mktempPromise(async e=>{let t=ye.create(e);return t.useWithSource(e,{enableMirror:!1,compressionLevel:0},e,{overwrite:!0}),await r(new Rt(e,{configuration:t,check:!1,immutable:!1}))})}var Au=class extends De{constructor(){super(...arguments);this.json=z.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.exact=z.Boolean(\"-E,--exact\",!1,{description:\"Don't use any semver modifier on the resolved range\"});this.tilde=z.Boolean(\"-T,--tilde\",!1,{description:\"Use the `~` semver modifier on the resolved range\"});this.caret=z.Boolean(\"-C,--caret\",!1,{description:\"Use the `^` semver modifier on the resolved range\"});this.dev=z.Boolean(\"-D,--dev\",!1,{description:\"Add a package as a dev dependency\"});this.peer=z.Boolean(\"-P,--peer\",!1,{description:\"Add a package as a peer dependency\"});this.optional=z.Boolean(\"-O,--optional\",!1,{description:\"Add / upgrade a package to an optional regular / peer dependency\"});this.preferDev=z.Boolean(\"--prefer-dev\",!1,{description:\"Add / upgrade a package to a dev dependency\"});this.interactive=z.Boolean(\"-i,--interactive\",{description:\"Reuse the specified package from other workspaces in the project\"});this.cached=z.Boolean(\"--cached\",!1,{description:\"Reuse the highest version already used somewhere within the project\"});this.mode=z.String(\"--mode\",{description:\"Change what artifacts installs generate\",validator:Zi(ts)});this.silent=z.Boolean(\"--silent\",{hidden:!0});this.packages=z.Rest()}async execute(){var y;let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,workspace:n}=await je.find(t,this.context.cwd),s=await Rt.find(t);if(!n)throw new ct(i.cwd,this.context.cwd);await i.restoreInstallState({restoreResolutions:!1});let o=(y=this.interactive)!=null?y:t.get(\"preferInteractive\"),a=Hm(this,i),l=[...o?[\"reuse\"]:[],\"project\",...this.cached?[\"cache\"]:[],\"latest\"],c=o?1/0:1,u=await Promise.all(this.packages.map(async B=>{let v=B.match(/^\\.{0,2}\\//)?await UL(B,{cwd:this.context.cwd,workspace:n}):P.tryParseDescriptor(B),D=B.match(/^(https?:|git@github)/);if(D)throw new be(`It seems you are trying to add a package using a ${ee.pretty(t,`${D[0]}...`,xi.RANGE)} url; we now require package names to be explicitly specified.\nTry running the command again with the package name prefixed: ${ee.pretty(t,\"yarn add\",xi.CODE)} ${ee.pretty(t,P.makeDescriptor(P.makeIdent(null,\"my-package\"),`${D[0]}...`),xi.DESCRIPTOR)}`);if(!v)throw new be(`The ${ee.pretty(t,B,xi.CODE)} string didn't match the required format (package-name@range). Did you perhaps forget to explicitly reference the package name?`);let T=Eqe(n,v,{dev:this.dev,peer:this.peer,preferDev:this.preferDev,optional:this.optional});return await Promise.all(T.map(async j=>{let $=await Gm(v,{project:i,workspace:n,cache:s,target:j,modifier:a,strategies:l,maxResults:c});return{request:v,suggestedDescriptors:$,target:j}}))})).then(B=>B.flat()),g=await ra.start({configuration:t,stdout:this.context.stdout,suggestInstall:!1},async B=>{for(let{request:v,suggestedDescriptors:{suggestions:D,rejections:T}}of u)if(D.filter(j=>j.descriptor!==null).length===0){let[j]=T;if(typeof j>\"u\")throw new Error(\"Assertion failed: Expected an error to have been set\");i.configuration.get(\"enableNetwork\")?B.reportError(27,`${P.prettyDescriptor(t,v)} can't be resolved to a satisfying range`):B.reportError(27,`${P.prettyDescriptor(t,v)} can't be resolved to a satisfying range (note: network resolution has been disabled)`),B.reportSeparator(),B.reportExceptionOnce(j)}});if(g.hasErrors())return g.exitCode();let f=!1,h=[],p=[];for(let{suggestedDescriptors:{suggestions:B},target:v}of u){let D,T=B.filter(V=>V.descriptor!==null),H=T[0].descriptor,j=T.every(V=>P.areDescriptorsEqual(V.descriptor,H));T.length===1||j?D=H:(f=!0,{answer:D}=await(0,Nse.prompt)({type:\"select\",name:\"answer\",message:\"Which range do you want to use?\",choices:B.map(({descriptor:V,name:W,reason:_})=>V?{name:W,hint:_,descriptor:V}:{name:W,hint:_,disabled:!0}),onCancel:()=>process.exit(130),result(V){return this.find(V,\"descriptor\")},stdin:this.context.stdin,stdout:this.context.stdout}));let $=n.manifest[v].get(D.identHash);(typeof $>\"u\"||$.descriptorHash!==D.descriptorHash)&&(n.manifest[v].set(D.identHash,D),this.optional&&(v===\"dependencies\"?n.manifest.ensureDependencyMeta({...D,range:\"unknown\"}).optional=!0:v===\"peerDependencies\"&&(n.manifest.ensurePeerDependencyMeta({...D,range:\"unknown\"}).optional=!0)),typeof $>\"u\"?h.push([n,v,D,l]):p.push([n,v,$,D]))}return await t.triggerMultipleHooks(B=>B.afterWorkspaceDependencyAddition,h),await t.triggerMultipleHooks(B=>B.afterWorkspaceDependencyReplacement,p),f&&this.context.stdout.write(`\n`),(await Ge.start({configuration:t,json:this.json,stdout:this.context.stdout,includeLogs:!this.context.quiet},async B=>{await i.install({cache:s,report:B,mode:this.mode})})).exitCode()}};Au.paths=[[\"add\"]],Au.usage=ve.Usage({description:\"add dependencies to the project\",details:\"\\n      This command adds a package to the package.json for the nearest workspace.\\n\\n      - If it didn't exist before, the package will by default be added to the regular `dependencies` field, but this behavior can be overriden thanks to the `-D,--dev` flag (which will cause the dependency to be added to the `devDependencies` field instead) and the `-P,--peer` flag (which will do the same but for `peerDependencies`).\\n\\n      - If the package was already listed in your dependencies, it will by default be upgraded whether it's part of your `dependencies` or `devDependencies` (it won't ever update `peerDependencies`, though).\\n\\n      - If set, the `--prefer-dev` flag will operate as a more flexible `-D,--dev` in that it will add the package to your `devDependencies` if it isn't already listed in either `dependencies` or `devDependencies`, but it will also happily upgrade your `dependencies` if that's what you already use (whereas `-D,--dev` would throw an exception).\\n\\n      - If set, the `-O,--optional` flag will add the package to the `optionalDependencies` field and, in combination with the `-P,--peer` flag, it will add the package as an optional peer dependency. If the package was already listed in your `dependencies`, it will be upgraded to `optionalDependencies`. If the package was already listed in your `peerDependencies`, in combination with the `-P,--peer` flag, it will be upgraded to an optional peer dependency: `\\\"peerDependenciesMeta\\\": { \\\"<package>\\\": { \\\"optional\\\": true } }`\\n\\n      - If the added package doesn't specify a range at all its `latest` tag will be resolved and the returned version will be used to generate a new semver range (using the `^` modifier by default unless otherwise configured via the `defaultSemverRangePrefix` configuration, or the `~` modifier if `-T,--tilde` is specified, or no modifier at all if `-E,--exact` is specified). Two exceptions to this rule: the first one is that if the package is a workspace then its local version will be used, and the second one is that if you use `-P,--peer` the default range will be `*` and won't be resolved at all.\\n\\n      - If the added package specifies a range (such as `^1.0.0`, `latest`, or `rc`), Yarn will add this range as-is in the resulting package.json entry (in particular, tags such as `rc` will be encoded as-is rather than being converted into a semver range).\\n\\n      If the `--cached` option is used, Yarn will preferably reuse the highest version already used somewhere within the project, even if through a transitive dependency.\\n\\n      If the `-i,--interactive` option is used (or if the `preferInteractive` settings is toggled on) the command will first try to check whether other workspaces in the project use the specified package and, if so, will offer to reuse them.\\n\\n      If the `--mode=<mode>` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\\n\\n      - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\\n\\n      - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\\n\\n      For a compilation of all the supported protocols, please consult the dedicated page from our website: https://yarnpkg.com/features/protocols.\\n    \",examples:[[\"Add a regular package to the current workspace\",\"$0 add lodash\"],[\"Add a specific version for a package to the current workspace\",\"$0 add lodash@1.2.3\"],[\"Add a package from a GitHub repository (the master branch) to the current workspace using a URL\",\"$0 add lodash@https://github.com/lodash/lodash\"],[\"Add a package from a GitHub repository (the master branch) to the current workspace using the GitHub protocol\",\"$0 add lodash@github:lodash/lodash\"],[\"Add a package from a GitHub repository (the master branch) to the current workspace using the GitHub protocol (shorthand)\",\"$0 add lodash@lodash/lodash\"],[\"Add a package from a specific branch of a GitHub repository to the current workspace using the GitHub protocol (shorthand)\",\"$0 add lodash-es@lodash/lodash#es\"]]});function Eqe(r,e,{dev:t,peer:i,preferDev:n,optional:s}){let o=r.manifest[\"dependencies\"].has(e.identHash),a=r.manifest[\"devDependencies\"].has(e.identHash),l=r.manifest[\"peerDependencies\"].has(e.identHash);if((t||i)&&o)throw new be(`Package \"${P.prettyIdent(r.project.configuration,e)}\" is already listed as a regular dependency - remove the -D,-P flags or remove it from your dependencies first`);if(!t&&!i&&l)throw new be(`Package \"${P.prettyIdent(r.project.configuration,e)}\" is already listed as a peer dependency - use either of -D or -P, or remove it from your peer dependencies first`);if(s&&a)throw new be(`Package \"${P.prettyIdent(r.project.configuration,e)}\" is already listed as a dev dependency - remove the -O flag or remove it from your dev dependencies first`);if(s&&!i&&l)throw new be(`Package \"${P.prettyIdent(r.project.configuration,e)}\" is already listed as a peer dependency - remove the -O flag or add the -P flag or remove it from your peer dependencies first`);if((t||n)&&s)throw new be(`Package \"${P.prettyIdent(r.project.configuration,e)}\" cannot simultaneously be a dev dependency and an optional dependency`);let c=[];return i&&c.push(\"peerDependencies\"),(t||n)&&c.push(\"devDependencies\"),s&&c.push(\"dependencies\"),c.length>0?c:a?[\"devDependencies\"]:l?[\"peerDependencies\"]:[\"dependencies\"]}var lu=class extends De{constructor(){super(...arguments);this.verbose=z.Boolean(\"-v,--verbose\",!1,{description:\"Print both the binary name and the locator of the package that provides the binary\"});this.json=z.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.name=z.String({required:!1})}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,locator:n}=await je.find(t,this.context.cwd);if(await i.restoreInstallState(),this.name){let a=(await Wt.getPackageAccessibleBinaries(n,{project:i})).get(this.name);if(!a)throw new be(`Couldn't find a binary named \"${this.name}\" for package \"${P.prettyLocator(t,n)}\"`);let[,l]=a;return this.context.stdout.write(`${l}\n`),0}return(await Ge.start({configuration:t,json:this.json,stdout:this.context.stdout},async o=>{let a=await Wt.getPackageAccessibleBinaries(n,{project:i}),c=Array.from(a.keys()).reduce((u,g)=>Math.max(u,g.length),0);for(let[u,[g,f]]of a)o.reportJson({name:u,source:P.stringifyIdent(g),path:f});if(this.verbose)for(let[u,[g]]of a)o.reportInfo(null,`${u.padEnd(c,\" \")}   ${P.prettyLocator(t,g)}`);else for(let u of a.keys())o.reportInfo(null,u)})).exitCode()}};lu.paths=[[\"bin\"]],lu.usage=ve.Usage({description:\"get the path to a binary script\",details:`\n      When used without arguments, this command will print the list of all the binaries available in the current workspace. Adding the \\`-v,--verbose\\` flag will cause the output to contain both the binary name and the locator of the package that provides the binary.\n\n      When an argument is specified, this command will just print the path to the binary on the standard output and exit. Note that the reported path may be stored within a zip archive.\n    `,examples:[[\"List all the available binaries\",\"$0 bin\"],[\"Print the path to a specific binary\",\"$0 bin eslint\"]]});var cu=class extends De{constructor(){super(...arguments);this.mirror=z.Boolean(\"--mirror\",!1,{description:\"Remove the global cache files instead of the local cache files\"});this.all=z.Boolean(\"--all\",!1,{description:\"Remove both the global cache files and the local cache files of the current project\"})}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),i=await Rt.find(t);return(await Ge.start({configuration:t,stdout:this.context.stdout},async()=>{let s=(this.all||this.mirror)&&i.mirrorCwd!==null,o=!this.mirror;s&&(await M.removePromise(i.mirrorCwd),await t.triggerHook(a=>a.cleanGlobalArtifacts,t)),o&&await M.removePromise(i.cwd)})).exitCode()}};cu.paths=[[\"cache\",\"clean\"],[\"cache\",\"clear\"]],cu.usage=ve.Usage({description:\"remove the shared cache files\",details:`\n      This command will remove all the files from the cache.\n    `,examples:[[\"Remove all the local archives\",\"$0 cache clean\"],[\"Remove all the archives stored in the ~/.yarn directory\",\"$0 cache clean --mirror\"]]});var Tse=Pe(uQ()),GL=J(\"util\"),uu=class extends De{constructor(){super(...arguments);this.json=z.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.unsafe=z.Boolean(\"--no-redacted\",!1,{description:\"Don't redact secrets (such as tokens) from the output\"});this.name=z.String()}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),i=this.name.replace(/[.[].*$/,\"\"),n=this.name.replace(/^[^.[]*/,\"\");if(typeof t.settings.get(i)>\"u\")throw new be(`Couldn't find a configuration settings named \"${i}\"`);let o=t.getSpecial(i,{hideSecrets:!this.unsafe,getNativePaths:!0}),a=Ie.convertMapsToIndexableObjects(o),l=n?(0,Tse.default)(a,n):a,c=await Ge.start({configuration:t,includeFooter:!1,json:this.json,stdout:this.context.stdout},async u=>{u.reportJson(l)});if(!this.json){if(typeof l==\"string\")return this.context.stdout.write(`${l}\n`),c.exitCode();GL.inspect.styles.name=\"cyan\",this.context.stdout.write(`${(0,GL.inspect)(l,{depth:1/0,colors:t.get(\"enableColors\"),compact:!1})}\n`)}return c.exitCode()}};uu.paths=[[\"config\",\"get\"]],uu.usage=ve.Usage({description:\"read a configuration settings\",details:`\n      This command will print a configuration setting.\n\n      Secrets (such as tokens) will be redacted from the output by default. If this behavior isn't desired, set the \\`--no-redacted\\` to get the untransformed value.\n    `,examples:[[\"Print a simple configuration setting\",\"yarn config get yarnPath\"],[\"Print a complex configuration setting\",\"yarn config get packageExtensions\"],[\"Print a nested field from the configuration\",`yarn config get 'npmScopes[\"my-company\"].npmRegistryServer'`],[\"Print a token from the configuration\",\"yarn config get npmAuthToken --no-redacted\"],[\"Print a configuration setting as JSON\",\"yarn config get packageExtensions --json\"]]});var Woe=Pe(zL()),zoe=Pe(uQ()),Voe=Pe(Joe()),VL=J(\"util\"),gu=class extends De{constructor(){super(...arguments);this.json=z.Boolean(\"--json\",!1,{description:\"Set complex configuration settings to JSON values\"});this.home=z.Boolean(\"-H,--home\",!1,{description:\"Update the home configuration instead of the project configuration\"});this.name=z.String();this.value=z.String()}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),i=()=>{if(!t.projectCwd)throw new be(\"This command must be run from within a project folder\");return t.projectCwd},n=this.name.replace(/[.[].*$/,\"\"),s=this.name.replace(/^[^.[]*\\.?/,\"\");if(typeof t.settings.get(n)>\"u\")throw new be(`Couldn't find a configuration settings named \"${n}\"`);if(n===\"enableStrictSettings\")throw new be(\"This setting only affects the file it's in, and thus cannot be set from the CLI\");let a=this.json?JSON.parse(this.value):this.value;await(this.home?p=>ye.updateHomeConfiguration(p):p=>ye.updateConfiguration(i(),p))(p=>{if(s){let C=(0,Woe.default)(p);return(0,Voe.default)(C,this.name,a),C}else return{...p,[n]:a}});let u=(await ye.find(this.context.cwd,this.context.plugins)).getSpecial(n,{hideSecrets:!0,getNativePaths:!0}),g=Ie.convertMapsToIndexableObjects(u),f=s?(0,zoe.default)(g,s):g;return(await Ge.start({configuration:t,includeFooter:!1,stdout:this.context.stdout},async p=>{VL.inspect.styles.name=\"cyan\",p.reportInfo(0,`Successfully set ${this.name} to ${(0,VL.inspect)(f,{depth:1/0,colors:t.get(\"enableColors\"),compact:!1})}`)})).exitCode()}};gu.paths=[[\"config\",\"set\"]],gu.usage=ve.Usage({description:\"change a configuration settings\",details:`\n      This command will set a configuration setting.\n\n      When used without the \\`--json\\` flag, it can only set a simple configuration setting (a string, a number, or a boolean).\n\n      When used with the \\`--json\\` flag, it can set both simple and complex configuration settings, including Arrays and Objects.\n    `,examples:[[\"Set a simple configuration setting (a string, a number, or a boolean)\",\"yarn config set initScope myScope\"],[\"Set a simple configuration setting (a string, a number, or a boolean) using the `--json` flag\",'yarn config set initScope --json \\\\\"myScope\\\\\"'],[\"Set a complex configuration setting (an Array) using the `--json` flag\",`yarn config set unsafeHttpWhitelist --json '[\"*.example.com\", \"example.com\"]'`],[\"Set a complex configuration setting (an Object) using the `--json` flag\",`yarn config set packageExtensions --json '{ \"@babel/parser@*\": { \"dependencies\": { \"@babel/types\": \"*\" } } }'`],[\"Set a nested configuration setting\",'yarn config set npmScopes.company.npmRegistryServer \"https://npm.example.com\"'],[\"Set a nested configuration setting using indexed access for non-simple keys\",`yarn config set 'npmRegistries[\"//npm.example.com\"].npmAuthToken' \"ffffffff-ffff-ffff-ffff-ffffffffffff\"`]]});var nae=Pe(zL()),sae=Pe(am()),oae=Pe(iae()),fu=class extends De{constructor(){super(...arguments);this.home=z.Boolean(\"-H,--home\",!1,{description:\"Update the home configuration instead of the project configuration\"});this.name=z.String()}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),i=()=>{if(!t.projectCwd)throw new be(\"This command must be run from within a project folder\");return t.projectCwd},n=this.name.replace(/[.[].*$/,\"\"),s=this.name.replace(/^[^.[]*\\.?/,\"\");if(typeof t.settings.get(n)>\"u\")throw new be(`Couldn't find a configuration settings named \"${n}\"`);let a=this.home?c=>ye.updateHomeConfiguration(c):c=>ye.updateConfiguration(i(),c);return(await Ge.start({configuration:t,includeFooter:!1,stdout:this.context.stdout},async c=>{let u=!1;await a(g=>{if(!(0,sae.default)(g,this.name))return c.reportWarning(0,`Configuration doesn't contain setting ${this.name}; there is nothing to unset`),u=!0,g;let f=s?(0,nae.default)(g):{...g};return(0,oae.default)(f,this.name),f}),u||c.reportInfo(0,`Successfully unset ${this.name}`)})).exitCode()}};fu.paths=[[\"config\",\"unset\"]],fu.usage=ve.Usage({description:\"unset a configuration setting\",details:`\n      This command will unset a configuration setting.\n    `,examples:[[\"Unset a simple configuration setting\",\"yarn config unset initScope\"],[\"Unset a complex configuration setting\",\"yarn config unset packageExtensions\"],[\"Unset a nested configuration setting\",\"yarn config unset npmScopes.company.npmRegistryServer\"]]});var XL=J(\"util\"),hu=class extends De{constructor(){super(...arguments);this.verbose=z.Boolean(\"-v,--verbose\",!1,{description:\"Print the setting description on top of the regular key/value information\"});this.why=z.Boolean(\"--why\",!1,{description:\"Print the reason why a setting is set a particular way\"});this.json=z.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"})}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins,{strict:!1});return(await Ge.start({configuration:t,json:this.json,stdout:this.context.stdout},async n=>{if(t.invalid.size>0&&!this.json){for(let[s,o]of t.invalid)n.reportError(34,`Invalid configuration key \"${s}\" in ${o}`);n.reportSeparator()}if(this.json){let s=Ie.sortMap(t.settings.keys(),o=>o);for(let o of s){let a=t.settings.get(o),l=t.getSpecial(o,{hideSecrets:!0,getNativePaths:!0}),c=t.sources.get(o);this.verbose?n.reportJson({key:o,effective:l,source:c}):n.reportJson({key:o,effective:l,source:c,...a})}}else{let s=Ie.sortMap(t.settings.keys(),l=>l),o=s.reduce((l,c)=>Math.max(l,c.length),0),a={breakLength:1/0,colors:t.get(\"enableColors\"),maxArrayLength:2};if(this.why||this.verbose){let l=s.map(u=>{let g=t.settings.get(u);if(!g)throw new Error(`Assertion failed: This settings (\"${u}\") should have been registered`);let f=this.why?t.sources.get(u)||\"<default>\":g.description;return[u,f]}),c=l.reduce((u,[,g])=>Math.max(u,g.length),0);for(let[u,g]of l)n.reportInfo(null,`${u.padEnd(o,\" \")}   ${g.padEnd(c,\" \")}   ${(0,XL.inspect)(t.getSpecial(u,{hideSecrets:!0,getNativePaths:!0}),a)}`)}else for(let l of s)n.reportInfo(null,`${l.padEnd(o,\" \")}   ${(0,XL.inspect)(t.getSpecial(l,{hideSecrets:!0,getNativePaths:!0}),a)}`)}})).exitCode()}};hu.paths=[[\"config\"]],hu.usage=ve.Usage({description:\"display the current configuration\",details:`\n      This command prints the current active configuration settings.\n    `,examples:[[\"Print the active configuration settings\",\"$0 config\"]]});ls();var NQ={};ut(NQ,{Strategy:()=>jm,acceptedStrategies:()=>w4e,dedupe:()=>ZL});var aae=Pe(Bn()),jm=(e=>(e.HIGHEST=\"highest\",e))(jm||{}),w4e=new Set(Object.values(jm)),B4e={highest:async(r,e,{resolver:t,fetcher:i,resolveOptions:n,fetchOptions:s})=>{let o=new Map;for(let[a,l]of r.storedResolutions){let c=r.storedDescriptors.get(a);if(typeof c>\"u\")throw new Error(`Assertion failed: The descriptor (${a}) should have been registered`);Ie.getSetWithDefault(o,c.identHash).add(l)}return Array.from(r.storedDescriptors.values(),async a=>{if(e.length&&!aae.default.isMatch(P.stringifyIdent(a),e))return null;let l=r.storedResolutions.get(a.descriptorHash);if(typeof l>\"u\")throw new Error(`Assertion failed: The resolution (${a.descriptorHash}) should have been registered`);let c=r.originalPackages.get(l);if(typeof c>\"u\"||!t.shouldPersistResolution(c,n))return null;let u=o.get(a.identHash);if(typeof u>\"u\")throw new Error(`Assertion failed: The resolutions (${a.identHash}) should have been registered`);if(u.size===1)return null;let g=[...u].map(y=>{let B=r.originalPackages.get(y);if(typeof B>\"u\")throw new Error(`Assertion failed: The package (${y}) should have been registered`);return B.reference}),f=await t.getSatisfying(a,g,n),h=f==null?void 0:f[0];if(typeof h>\"u\")return null;let p=h.locatorHash,C=r.originalPackages.get(p);if(typeof C>\"u\")throw new Error(`Assertion failed: The package (${p}) should have been registered`);return p===l?null:{descriptor:a,currentPackage:c,updatedPackage:C}})}};async function ZL(r,{strategy:e,patterns:t,cache:i,report:n}){let{configuration:s}=r,o=new ti,a=s.makeResolver(),l=s.makeFetcher(),c={cache:i,checksums:r.storedChecksums,fetcher:l,project:r,report:o,skipIntegrityCheck:!0,cacheOptions:{skipIntegrityCheck:!0}},u={project:r,resolver:a,report:o,fetchOptions:c};return await n.startTimerPromise(\"Deduplication step\",async()=>{let g=B4e[e],f=await g(r,t,{resolver:a,resolveOptions:u,fetcher:l,fetchOptions:c}),h=vi.progressViaCounter(f.length);await n.reportProgress(h);let p=0;await Promise.all(f.map(B=>B.then(v=>{if(v===null)return;p++;let{descriptor:D,currentPackage:T,updatedPackage:H}=v;n.reportInfo(0,`${P.prettyDescriptor(s,D)} can be deduped from ${P.prettyLocator(s,T)} to ${P.prettyLocator(s,H)}`),n.reportJson({descriptor:P.stringifyDescriptor(D),currentResolution:P.stringifyLocator(T),updatedResolution:P.stringifyLocator(H)}),r.storedResolutions.set(D.descriptorHash,H.locatorHash)}).finally(()=>h.tick())));let C;switch(p){case 0:C=\"No packages\";break;case 1:C=\"One package\";break;default:C=`${p} packages`}let y=ee.pretty(s,e,ee.Type.CODE);return n.reportInfo(0,`${C} can be deduped using the ${y} strategy`),p})}var pu=class extends De{constructor(){super(...arguments);this.strategy=z.String(\"-s,--strategy\",\"highest\",{description:\"The strategy to use when deduping dependencies\",validator:Zi(jm)});this.check=z.Boolean(\"-c,--check\",!1,{description:\"Exit with exit code 1 when duplicates are found, without persisting the dependency tree\"});this.json=z.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.mode=z.String(\"--mode\",{description:\"Change what artifacts installs generate\",validator:Zi(ts)});this.patterns=z.Rest()}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i}=await je.find(t,this.context.cwd),n=await Rt.find(t);await i.restoreInstallState({restoreResolutions:!1});let s=0,o=await Ge.start({configuration:t,includeFooter:!1,stdout:this.context.stdout,json:this.json},async a=>{s=await ZL(i,{strategy:this.strategy,patterns:this.patterns,cache:n,report:a})});return o.hasErrors()?o.exitCode():this.check?s?1:0:(await Ge.start({configuration:t,stdout:this.context.stdout,json:this.json},async l=>{await i.install({cache:n,report:l,mode:this.mode})})).exitCode()}};pu.paths=[[\"dedupe\"]],pu.usage=ve.Usage({description:\"deduplicate dependencies with overlapping ranges\",details:\"\\n      Duplicates are defined as descriptors with overlapping ranges being resolved and locked to different locators. They are a natural consequence of Yarn's deterministic installs, but they can sometimes pile up and unnecessarily increase the size of your project.\\n\\n      This command dedupes dependencies in the current project using different strategies (only one is implemented at the moment):\\n\\n      - `highest`: Reuses (where possible) the locators with the highest versions. This means that dependencies can only be upgraded, never downgraded. It's also guaranteed that it never takes more than a single pass to dedupe the entire dependency tree.\\n\\n      **Note:** Even though it never produces a wrong dependency tree, this command should be used with caution, as it modifies the dependency tree, which can sometimes cause problems when packages don't strictly follow semver recommendations. Because of this, it is recommended to also review the changes manually.\\n\\n      If set, the `-c,--check` flag will only report the found duplicates, without persisting the modified dependency tree. If changes are found, the command will exit with a non-zero exit code, making it suitable for CI purposes.\\n\\n      If the `--mode=<mode>` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\\n\\n      - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\\n\\n      - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\\n\\n      This command accepts glob patterns as arguments (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\\n\\n      ### In-depth explanation:\\n\\n      Yarn doesn't deduplicate dependencies by default, otherwise installs wouldn't be deterministic and the lockfile would be useless. What it actually does is that it tries to not duplicate dependencies in the first place.\\n\\n      **Example:** If `foo@^2.3.4` (a dependency of a dependency) has already been resolved to `foo@2.3.4`, running `yarn add foo@*`will cause Yarn to reuse `foo@2.3.4`, even if the latest `foo` is actually `foo@2.10.14`, thus preventing unnecessary duplication.\\n\\n      Duplication happens when Yarn can't unlock dependencies that have already been locked inside the lockfile.\\n\\n      **Example:** If `foo@^2.3.4` (a dependency of a dependency) has already been resolved to `foo@2.3.4`, running `yarn add foo@2.10.14` will cause Yarn to install `foo@2.10.14` because the existing resolution doesn't satisfy the range `2.10.14`. This behavior can lead to (sometimes) unwanted duplication, since now the lockfile contains 2 separate resolutions for the 2 `foo` descriptors, even though they have overlapping ranges, which means that the lockfile can be simplified so that both descriptors resolve to `foo@2.10.14`.\\n    \",examples:[[\"Dedupe all packages\",\"$0 dedupe\"],[\"Dedupe all packages using a specific strategy\",\"$0 dedupe --strategy highest\"],[\"Dedupe a specific package\",\"$0 dedupe lodash\"],[\"Dedupe all packages with the `@babel/*` scope\",\"$0 dedupe '@babel/*'\"],[\"Check for duplicates (can be used as a CI step)\",\"$0 dedupe --check\"]]});var Vh=class extends De{async execute(){let{plugins:e}=await ye.find(this.context.cwd,this.context.plugins),t=[];for(let o of e){let{commands:a}=o[1];if(a){let c=Gn.from(a).definitions();t.push([o[0],c])}}let i=this.cli.definitions(),n=(o,a)=>o.split(\" \").slice(1).join()===a.split(\" \").slice(1).join(),s=Aae()[\"@yarnpkg/builder\"].bundles.standard;for(let o of t){let a=o[1];for(let l of a)i.find(c=>n(c.path,l.path)).plugin={name:o[0],isDefault:s.includes(o[0])}}this.context.stdout.write(`${JSON.stringify(i,null,2)}\n`)}};Vh.paths=[[\"--clipanion=definitions\"]];var Xh=class extends De{async execute(){this.context.stdout.write(this.cli.usage(null))}};Xh.paths=[[\"help\"],[\"--help\"],[\"-h\"]];var qm=class extends De{constructor(){super(...arguments);this.leadingArgument=z.String();this.args=z.Proxy()}async execute(){if(this.leadingArgument.match(/[\\\\/]/)&&!P.tryParseIdent(this.leadingArgument)){let t=x.resolve(this.context.cwd,K.toPortablePath(this.leadingArgument));return await this.cli.run(this.args,{cwd:t})}else return await this.cli.run([\"run\",this.leadingArgument,...this.args])}};var Zh=class extends De{async execute(){this.context.stdout.write(`${Tr||\"<unknown>\"}\n`)}};Zh.paths=[[\"-v\"],[\"--version\"]];var du=class extends De{constructor(){super(...arguments);this.commandName=z.String();this.args=z.Proxy()}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,locator:n}=await je.find(t,this.context.cwd);return await i.restoreInstallState(),await Wt.executePackageShellcode(n,this.commandName,this.args,{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,project:i})}};du.paths=[[\"exec\"]],du.usage=ve.Usage({description:\"execute a shell script\",details:`\n      This command simply executes a shell script within the context of the root directory of the active workspace using the portable shell.\n\n      It also makes sure to call it in a way that's compatible with the current project (for example, on PnP projects the environment will be setup in such a way that PnP will be correctly injected into the environment).\n    `,examples:[[\"Execute a single shell command\",\"$0 exec echo Hello World\"],[\"Execute a shell script\",'$0 exec \"tsc & babel src --out-dir lib\"']]});ls();var Cu=class extends De{constructor(){super(...arguments);this.hash=z.String({required:!1,validator:od(sd(),[ad(/^p[0-9a-f]{5}$/)])})}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i}=await je.find(t,this.context.cwd);return await i.restoreInstallState({restoreResolutions:!1}),await i.applyLightResolution(),typeof this.hash<\"u\"?await b4e(this.hash,i,{stdout:this.context.stdout}):(await Ge.start({configuration:t,stdout:this.context.stdout,includeFooter:!1},async s=>{var a;let o=[([,l])=>P.stringifyLocator(i.storedPackages.get(l.subject)),([,l])=>P.stringifyIdent(l.requested)];for(let[l,c]of Ie.sortMap(i.peerRequirements,o)){let u=i.storedPackages.get(c.subject);if(typeof u>\"u\")throw new Error(\"Assertion failed: Expected the subject package to have been registered\");let g=i.storedPackages.get(c.rootRequester);if(typeof g>\"u\")throw new Error(\"Assertion failed: Expected the root package to have been registered\");let f=(a=u.dependencies.get(c.requested.identHash))!=null?a:null,h=ee.pretty(t,l,ee.Type.CODE),p=P.prettyLocator(t,u),C=P.prettyIdent(t,c.requested),y=P.prettyIdent(t,g),B=c.allRequesters.length-1,v=`descendant${B===1?\"\":\"s\"}`,D=B>0?` and ${B} ${v}`:\"\",T=f!==null?\"provides\":\"doesn't provide\";s.reportInfo(null,`${h} \\u2192 ${p} ${T} ${C} to ${y}${D}`)}})).exitCode()}};Cu.paths=[[\"explain\",\"peer-requirements\"]],Cu.usage=ve.Usage({description:\"explain a set of peer requirements\",details:`\n      A set of peer requirements represents all peer requirements that a dependent must satisfy when providing a given peer request to a requester and its descendants.\n\n      When the hash argument is specified, this command prints a detailed explanation of all requirements of the set corresponding to the hash and whether they're satisfied or not.\n\n      When used without arguments, this command lists all sets of peer requirements and the corresponding hash that can be used to get detailed information about a given set.\n\n      **Note:** A hash is a six-letter p-prefixed code that can be obtained from peer dependency warnings or from the list of all peer requirements (\\`yarn explain peer-requirements\\`).\n    `,examples:[[\"Explain the corresponding set of peer requirements for a hash\",\"$0 explain peer-requirements p1a4ed\"],[\"List all sets of peer requirements\",\"$0 explain peer-requirements\"]]});async function b4e(r,e,t){let{configuration:i}=e,n=e.peerRequirements.get(r);if(typeof n>\"u\")throw new Error(`No peerDependency requirements found for hash: \"${r}\"`);return(await Ge.start({configuration:i,stdout:t.stdout,includeFooter:!1},async o=>{var B,v;let a=e.storedPackages.get(n.subject);if(typeof a>\"u\")throw new Error(\"Assertion failed: Expected the subject package to have been registered\");let l=e.storedPackages.get(n.rootRequester);if(typeof l>\"u\")throw new Error(\"Assertion failed: Expected the root package to have been registered\");let c=(B=a.dependencies.get(n.requested.identHash))!=null?B:null,u=c!==null?e.storedResolutions.get(c.descriptorHash):null;if(typeof u>\"u\")throw new Error(\"Assertion failed: Expected the resolution to have been registered\");let g=u!==null?e.storedPackages.get(u):null;if(typeof g>\"u\")throw new Error(\"Assertion failed: Expected the provided package to have been registered\");let f=[...n.allRequesters.values()].map(D=>{let T=e.storedPackages.get(D);if(typeof T>\"u\")throw new Error(\"Assertion failed: Expected the package to be registered\");let H=P.devirtualizeLocator(T),j=e.storedPackages.get(H.locatorHash);if(typeof j>\"u\")throw new Error(\"Assertion failed: Expected the package to be registered\");let $=j.peerDependencies.get(n.requested.identHash);if(typeof $>\"u\")throw new Error(\"Assertion failed: Expected the peer dependency to be registered\");return{pkg:T,peerDependency:$}});if(g!==null){let D=f.every(({peerDependency:T})=>vt.satisfiesWithPrereleases(g.version,T.range));o.reportInfo(0,`${P.prettyLocator(i,a)} provides ${P.prettyLocator(i,g)} with version ${P.prettyReference(i,(v=g.version)!=null?v:\"<missing>\")}, which ${D?\"satisfies\":\"doesn't satisfy\"} the following requirements:`)}else o.reportInfo(0,`${P.prettyLocator(i,a)} doesn't provide ${P.prettyIdent(i,n.requested)}, breaking the following requirements:`);o.reportSeparator();let h=ee.mark(i),p=[];for(let{pkg:D,peerDependency:T}of Ie.sortMap(f,H=>P.stringifyLocator(H.pkg))){let j=(g!==null?vt.satisfiesWithPrereleases(g.version,T.range):!1)?h.Check:h.Cross;p.push({stringifiedLocator:P.stringifyLocator(D),prettyLocator:P.prettyLocator(i,D),prettyRange:P.prettyRange(i,T.range),mark:j})}let C=Math.max(...p.map(({stringifiedLocator:D})=>D.length)),y=Math.max(...p.map(({prettyRange:D})=>D.length));for(let{stringifiedLocator:D,prettyLocator:T,prettyRange:H,mark:j}of Ie.sortMap(p,({stringifiedLocator:$})=>$))o.reportInfo(null,`${T.padEnd(C+(T.length-D.length),\" \")} \\u2192 ${H.padEnd(y,\" \")} ${j}`);p.length>1&&(o.reportSeparator(),o.reportInfo(0,`Note: these requirements start with ${P.prettyLocator(e.configuration,l)}`))})).exitCode()}ls();var lae=Pe(Xr()),mu=class extends De{constructor(){super(...arguments);this.onlyIfNeeded=z.Boolean(\"--only-if-needed\",!1,{description:\"Only lock the Yarn version if it isn't already locked\"});this.version=z.String()}async execute(){var o;let t=await ye.find(this.context.cwd,this.context.plugins);if(this.onlyIfNeeded&&t.get(\"yarnPath\")){let a=t.sources.get(\"yarnPath\");if(!a)throw new Error(\"Assertion failed: Expected 'yarnPath' to have a source\");let l=(o=t.projectCwd)!=null?o:t.startingCwd;if(x.contains(l,a))return 0}let i=()=>{if(typeof Tr>\"u\")throw new be(\"The --install flag can only be used without explicit version specifier from the Yarn CLI\");return`file://${process.argv[1]}`},n;if(this.version===\"self\")n=i();else if(this.version===\"latest\"||this.version===\"berry\"||this.version===\"stable\")n=`https://repo.yarnpkg.com/${await Jm(t,\"stable\")}/packages/yarnpkg-cli/bin/yarn.js`;else if(this.version===\"canary\")n=`https://repo.yarnpkg.com/${await Jm(t,\"canary\")}/packages/yarnpkg-cli/bin/yarn.js`;else if(this.version===\"classic\")n=\"https://classic.yarnpkg.com/latest.js\";else if(this.version.match(/^https?:/))n=this.version;else if(this.version.match(/^\\.{0,2}[\\\\/]/)||K.isAbsolute(this.version))n=`file://${K.resolve(this.version)}`;else if(vt.satisfiesWithPrereleases(this.version,\">=2.0.0\"))n=`https://repo.yarnpkg.com/${this.version}/packages/yarnpkg-cli/bin/yarn.js`;else if(vt.satisfiesWithPrereleases(this.version,\"^0.x || ^1.x\"))n=`https://github.com/yarnpkg/yarn/releases/download/v${this.version}/yarn-${this.version}.js`;else if(vt.validRange(this.version))n=`https://repo.yarnpkg.com/${await S4e(t,this.version)}/packages/yarnpkg-cli/bin/yarn.js`;else throw new be(`Invalid version descriptor \"${this.version}\"`);return(await Ge.start({configuration:t,stdout:this.context.stdout,includeLogs:!this.context.quiet},async a=>{let l=\"file://\",c;n.startsWith(l)?(a.reportInfo(0,`Downloading ${ee.pretty(t,n,xi.URL)}`),c=await M.readFilePromise(K.toPortablePath(n.slice(l.length)))):(a.reportInfo(0,`Retrieving ${ee.pretty(t,n,xi.PATH)}`),c=await Xt.get(n,{configuration:t})),await _L(t,null,c,{report:a})})).exitCode()}};mu.paths=[[\"set\",\"version\"]],mu.usage=ve.Usage({description:\"lock the Yarn version used by the project\",details:\"\\n      This command will download a specific release of Yarn directly from the Yarn GitHub repository, will store it inside your project, and will change the `yarnPath` settings from your project `.yarnrc.yml` file to point to the new file.\\n\\n      A very good use case for this command is to enforce the version of Yarn used by any single member of your team inside the same project - by doing this you ensure that you have control over Yarn upgrades and downgrades (including on your deployment servers), and get rid of most of the headaches related to someone using a slightly different version and getting different behavior.\\n\\n      The version specifier can be:\\n\\n      - a tag:\\n        - `latest` / `berry` / `stable` -> the most recent stable berry (`>=2.0.0`) release\\n        - `canary` -> the most recent canary (release candidate) berry (`>=2.0.0`) release\\n        - `classic` -> the most recent classic (`^0.x || ^1.x`) release\\n\\n      - a semver range (e.g. `2.x`) -> the most recent version satisfying the range (limited to berry releases)\\n\\n      - a semver version (e.g. `2.4.1`, `1.22.1`)\\n\\n      - a local file referenced through either a relative or absolute path\\n\\n      - `self` -> the version used to invoke the command\\n    \",examples:[[\"Download the latest release from the Yarn repository\",\"$0 set version latest\"],[\"Download the latest canary release from the Yarn repository\",\"$0 set version canary\"],[\"Download the latest classic release from the Yarn repository\",\"$0 set version classic\"],[\"Download the most recent Yarn 3 build\",\"$0 set version 3.x\"],[\"Download a specific Yarn 2 build\",\"$0 set version 2.0.0-rc.30\"],[\"Switch back to a specific Yarn 1 release\",\"$0 set version 1.22.1\"],[\"Use a release from the local filesystem\",\"$0 set version ./yarn.cjs\"],[\"Use a release from a URL\",\"$0 set version https://repo.yarnpkg.com/3.1.0/packages/yarnpkg-cli/bin/yarn.js\"],[\"Download the version used to invoke the command\",\"$0 set version self\"]]});async function S4e(r,e){let i=(await Xt.get(\"https://repo.yarnpkg.com/tags\",{configuration:r,jsonResponse:!0})).tags.filter(n=>vt.satisfiesWithPrereleases(n,e));if(i.length===0)throw new be(`No matching release found for range ${ee.pretty(r,e,ee.Type.RANGE)}.`);return i[0]}async function Jm(r,e){let t=await Xt.get(\"https://repo.yarnpkg.com/tags\",{configuration:r,jsonResponse:!0});if(!t.latest[e])throw new be(`Tag ${ee.pretty(r,e,ee.Type.RANGE)} not found`);return t.latest[e]}async function _L(r,e,t,{report:i}){var h;e===null&&await M.mktempPromise(async p=>{let C=x.join(p,\"yarn.cjs\");await M.writeFilePromise(C,t);let{stdout:y}=await Cr.execvp(process.execPath,[K.fromPortablePath(C),\"--version\"],{cwd:p,env:{...process.env,YARN_IGNORE_PATH:\"1\"}});if(e=y.trim(),!lae.default.valid(e))throw new Error(`Invalid semver version. ${ee.pretty(r,\"yarn --version\",ee.Type.CODE)} returned:\n${e}`)});let n=(h=r.projectCwd)!=null?h:r.startingCwd,s=x.resolve(n,\".yarn/releases\"),o=x.resolve(s,`yarn-${e}.cjs`),a=x.relative(r.startingCwd,o),l=x.relative(n,o);i.reportInfo(0,`Saving the new release in ${ee.pretty(r,a,\"magenta\")}`),await M.removePromise(x.dirname(o)),await M.mkdirPromise(x.dirname(o),{recursive:!0}),await M.writeFilePromise(o,t,{mode:493}),await ye.updateConfiguration(n,{yarnPath:l});let c=await ot.tryFind(n)||new ot;c.packageManager=`yarn@${e&&Ie.isTaggedYarnVersion(e)?e:await Jm(r,\"stable\")}`;let u={};c.exportTo(u);let g=x.join(n,ot.fileName),f=`${JSON.stringify(u,null,c.indent)}\n`;await M.changeFilePromise(g,f,{automaticNewlines:!0})}function cae(r){return Ct[LI(r)]}var v4e=/## (?<code>YN[0-9]{4}) - `(?<name>[A-Z_]+)`\\n\\n(?<details>(?:.(?!##))+)/gs;async function x4e(r){let t=`https://repo.yarnpkg.com/${Ie.isTaggedYarnVersion(Tr)?Tr:await Jm(r,\"canary\")}/packages/gatsby/content/advanced/error-codes.md`,i=await Xt.get(t,{configuration:r});return new Map(Array.from(i.toString().matchAll(v4e),({groups:n})=>{if(!n)throw new Error(\"Assertion failed: Expected the match to have been successful\");let s=cae(n.code);if(n.name!==s)throw new Error(`Assertion failed: Invalid error code data: Expected \"${n.name}\" to be named \"${s}\"`);return[n.code,n.details]}))}var Eu=class extends De{constructor(){super(...arguments);this.code=z.String({required:!1,validator:od(sd(),[ad(/^YN[0-9]{4}$/)])});this.json=z.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"})}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins);if(typeof this.code<\"u\"){let i=cae(this.code),n=ee.pretty(t,i,ee.Type.CODE),s=this.cli.format().header(`${this.code} - ${n}`),a=(await x4e(t)).get(this.code),l=typeof a<\"u\"?ee.jsonOrPretty(this.json,t,ee.tuple(ee.Type.MARKDOWN,{text:a,format:this.cli.format(),paragraphs:!0})):`This error code does not have a description.\n\nYou can help us by editing this page on GitHub \\u{1F642}:\n${ee.jsonOrPretty(this.json,t,ee.tuple(ee.Type.URL,\"https://github.com/yarnpkg/berry/blob/master/packages/gatsby/content/advanced/error-codes.md\"))}\n`;this.json?this.context.stdout.write(`${JSON.stringify({code:this.code,name:i,details:l})}\n`):this.context.stdout.write(`${s}\n\n${l}\n`)}else{let i={children:Ie.mapAndFilter(Object.entries(Ct),([n,s])=>Number.isNaN(Number(n))?Ie.mapAndFilter.skip:{label:NA(Number(n)),value:ee.tuple(ee.Type.CODE,s)})};es.emitTree(i,{configuration:t,stdout:this.context.stdout,json:this.json})}}};Eu.paths=[[\"explain\"]],Eu.usage=ve.Usage({description:\"explain an error code\",details:`\n      When the code argument is specified, this command prints its name and its details.\n\n      When used without arguments, this command lists all error codes and their names.\n    `,examples:[[\"Explain an error code\",\"$0 explain YN0006\"],[\"List all error codes\",\"$0 explain\"]]});var uae=Pe(Bn()),Iu=class extends De{constructor(){super(...arguments);this.all=z.Boolean(\"-A,--all\",!1,{description:\"Print versions of a package from the whole project\"});this.recursive=z.Boolean(\"-R,--recursive\",!1,{description:\"Print information for all packages, including transitive dependencies\"});this.extra=z.Array(\"-X,--extra\",[],{description:\"An array of requests of extra data provided by plugins\"});this.cache=z.Boolean(\"--cache\",!1,{description:\"Print information about the cache entry of a package (path, size, checksum)\"});this.dependents=z.Boolean(\"--dependents\",!1,{description:\"Print all dependents for each matching package\"});this.manifest=z.Boolean(\"--manifest\",!1,{description:\"Print data obtained by looking at the package archive (license, homepage, ...)\"});this.nameOnly=z.Boolean(\"--name-only\",!1,{description:\"Only print the name for the matching packages\"});this.virtuals=z.Boolean(\"--virtuals\",!1,{description:\"Print each instance of the virtual packages\"});this.json=z.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.patterns=z.Rest()}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,workspace:n}=await je.find(t,this.context.cwd),s=await Rt.find(t);if(!n&&!this.all)throw new ct(i.cwd,this.context.cwd);await i.restoreInstallState();let o=new Set(this.extra);this.cache&&o.add(\"cache\"),this.dependents&&o.add(\"dependents\"),this.manifest&&o.add(\"manifest\");let a=(T,{recursive:H})=>{let j=T.anchoredLocator.locatorHash,$=new Map,V=[j];for(;V.length>0;){let W=V.shift();if($.has(W))continue;let _=i.storedPackages.get(W);if(typeof _>\"u\")throw new Error(\"Assertion failed: Expected the package to be registered\");if($.set(W,_),P.isVirtualLocator(_)&&V.push(P.devirtualizeLocator(_).locatorHash),!(!H&&W!==j))for(let A of _.dependencies.values()){let Ae=i.storedResolutions.get(A.descriptorHash);if(typeof Ae>\"u\")throw new Error(\"Assertion failed: Expected the resolution to be registered\");V.push(Ae)}}return $.values()},l=({recursive:T})=>{let H=new Map;for(let j of i.workspaces)for(let $ of a(j,{recursive:T}))H.set($.locatorHash,$);return H.values()},c=({all:T,recursive:H})=>T&&H?i.storedPackages.values():T?l({recursive:H}):a(n,{recursive:H}),u=({all:T,recursive:H})=>{let j=c({all:T,recursive:H}),$=this.patterns.map(_=>{let A=P.parseLocator(_),Ae=uae.default.makeRe(P.stringifyIdent(A)),ge=P.isVirtualLocator(A),re=ge?P.devirtualizeLocator(A):A;return O=>{let F=P.stringifyIdent(O);if(!Ae.test(F))return!1;if(A.reference===\"unknown\")return!0;let ue=P.isVirtualLocator(O),pe=ue?P.devirtualizeLocator(O):O;return!(ge&&ue&&A.reference!==O.reference||re.reference!==pe.reference)}}),V=Ie.sortMap([...j],_=>P.stringifyLocator(_));return{selection:V.filter(_=>$.length===0||$.some(A=>A(_))),sortedLookup:V}},{selection:g,sortedLookup:f}=u({all:this.all,recursive:this.recursive});if(g.length===0)throw new be(\"No package matched your request\");let h=new Map;if(this.dependents)for(let T of f)for(let H of T.dependencies.values()){let j=i.storedResolutions.get(H.descriptorHash);if(typeof j>\"u\")throw new Error(\"Assertion failed: Expected the resolution to be registered\");Ie.getArrayWithDefault(h,j).push(T)}let p=new Map;for(let T of f){if(!P.isVirtualLocator(T))continue;let H=P.devirtualizeLocator(T);Ie.getArrayWithDefault(p,H.locatorHash).push(T)}let C={},y={children:C},B=t.makeFetcher(),v={project:i,fetcher:B,cache:s,checksums:i.storedChecksums,report:new ti,cacheOptions:{skipIntegrityCheck:!0},skipIntegrityCheck:!0},D=[async(T,H,j)=>{var W,_;if(!H.has(\"manifest\"))return;let $=await B.fetch(T,v),V;try{V=await ot.find($.prefixPath,{baseFs:$.packageFs})}finally{(W=$.releaseFs)==null||W.call($)}j(\"Manifest\",{License:ee.tuple(ee.Type.NO_HINT,V.license),Homepage:ee.tuple(ee.Type.URL,(_=V.raw.homepage)!=null?_:null)})},async(T,H,j)=>{var Ae;if(!H.has(\"cache\"))return;let $={mockedPackages:i.disabledLocators,unstablePackages:i.conditionalLocators},V=(Ae=i.storedChecksums.get(T.locatorHash))!=null?Ae:null,W=s.getLocatorPath(T,V,$),_;if(W!==null)try{_=M.statSync(W)}catch{}let A=typeof _<\"u\"?[_.size,ee.Type.SIZE]:void 0;j(\"Cache\",{Checksum:ee.tuple(ee.Type.NO_HINT,V),Path:ee.tuple(ee.Type.PATH,W),Size:A})}];for(let T of g){let H=P.isVirtualLocator(T);if(!this.virtuals&&H)continue;let j={},$={value:[T,ee.Type.LOCATOR],children:j};if(C[P.stringifyLocator(T)]=$,this.nameOnly){delete $.children;continue}let V=p.get(T.locatorHash);typeof V<\"u\"&&(j.Instances={label:\"Instances\",value:ee.tuple(ee.Type.NUMBER,V.length)}),j.Version={label:\"Version\",value:ee.tuple(ee.Type.NO_HINT,T.version)};let W=(A,Ae)=>{let ge={};if(j[A]=ge,Array.isArray(Ae))ge.children=Ae.map(re=>({value:re}));else{let re={};ge.children=re;for(let[O,F]of Object.entries(Ae))typeof F>\"u\"||(re[O]={label:O,value:F})}};if(!H){for(let A of D)await A(T,o,W);await t.triggerHook(A=>A.fetchPackageInfo,T,o,W)}T.bin.size>0&&!H&&W(\"Exported Binaries\",[...T.bin.keys()].map(A=>ee.tuple(ee.Type.PATH,A)));let _=h.get(T.locatorHash);typeof _<\"u\"&&_.length>0&&W(\"Dependents\",_.map(A=>ee.tuple(ee.Type.LOCATOR,A))),T.dependencies.size>0&&!H&&W(\"Dependencies\",[...T.dependencies.values()].map(A=>{var re;let Ae=i.storedResolutions.get(A.descriptorHash),ge=typeof Ae<\"u\"&&(re=i.storedPackages.get(Ae))!=null?re:null;return ee.tuple(ee.Type.RESOLUTION,{descriptor:A,locator:ge})})),T.peerDependencies.size>0&&H&&W(\"Peer dependencies\",[...T.peerDependencies.values()].map(A=>{var O,F;let Ae=T.dependencies.get(A.identHash),ge=typeof Ae<\"u\"&&(O=i.storedResolutions.get(Ae.descriptorHash))!=null?O:null,re=ge!==null&&(F=i.storedPackages.get(ge))!=null?F:null;return ee.tuple(ee.Type.RESOLUTION,{descriptor:A,locator:re})}))}es.emitTree(y,{configuration:t,json:this.json,stdout:this.context.stdout,separators:this.nameOnly?0:2})}};Iu.paths=[[\"info\"]],Iu.usage=ve.Usage({description:\"see information related to packages\",details:\"\\n      This command prints various information related to the specified packages, accepting glob patterns.\\n\\n      By default, if the locator reference is missing, Yarn will default to print the information about all the matching direct dependencies of the package for the active workspace. To instead print all versions of the package that are direct dependencies of any of your workspaces, use the `-A,--all` flag. Adding the `-R,--recursive` flag will also report transitive dependencies.\\n\\n      Some fields will be hidden by default in order to keep the output readable, but can be selectively displayed by using additional options (`--dependents`, `--manifest`, `--virtuals`, ...) described in the option descriptions.\\n\\n      Note that this command will only print the information directly related to the selected packages - if you wish to know why the package is there in the first place, use `yarn why` which will do just that (it also provides a `-R,--recursive` flag that may be of some help).\\n    \",examples:[[\"Show information about Lodash\",\"$0 info lodash\"]]});var TQ=Pe(Ac());ls();var yu=class extends De{constructor(){super(...arguments);this.json=z.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.immutable=z.Boolean(\"--immutable\",{description:\"Abort with an error exit code if the lockfile was to be modified\"});this.immutableCache=z.Boolean(\"--immutable-cache\",{description:\"Abort with an error exit code if the cache folder was to be modified\"});this.checkCache=z.Boolean(\"--check-cache\",!1,{description:\"Always refetch the packages and ensure that their checksums are consistent\"});this.inlineBuilds=z.Boolean(\"--inline-builds\",{description:\"Verbosely print the output of the build steps of dependencies\"});this.mode=z.String(\"--mode\",{description:\"Change what artifacts installs generate\",validator:Zi(ts)});this.cacheFolder=z.String(\"--cache-folder\",{hidden:!0});this.frozenLockfile=z.Boolean(\"--frozen-lockfile\",{hidden:!0});this.ignoreEngines=z.Boolean(\"--ignore-engines\",{hidden:!0});this.nonInteractive=z.Boolean(\"--non-interactive\",{hidden:!0});this.preferOffline=z.Boolean(\"--prefer-offline\",{hidden:!0});this.production=z.Boolean(\"--production\",{hidden:!0});this.registry=z.String(\"--registry\",{hidden:!0});this.silent=z.Boolean(\"--silent\",{hidden:!0});this.networkTimeout=z.String(\"--network-timeout\",{hidden:!0})}async execute(){var f;let t=await ye.find(this.context.cwd,this.context.plugins);typeof this.inlineBuilds<\"u\"&&t.useWithSource(\"<cli>\",{enableInlineBuilds:this.inlineBuilds},t.startingCwd,{overwrite:!0});let i=!!process.env.FUNCTION_TARGET||!!process.env.GOOGLE_RUNTIME,n=async(h,{error:p})=>{let C=await Ge.start({configuration:t,stdout:this.context.stdout,includeFooter:!1},async y=>{p?y.reportError(50,h):y.reportWarning(50,h)});return C.hasErrors()?C.exitCode():null};if(typeof this.ignoreEngines<\"u\"){let h=await n(\"The --ignore-engines option is deprecated; engine checking isn't a core feature anymore\",{error:!TQ.default.VERCEL});if(h!==null)return h}if(typeof this.registry<\"u\"){let h=await n(\"The --registry option is deprecated; prefer setting npmRegistryServer in your .yarnrc.yml file\",{error:!1});if(h!==null)return h}if(typeof this.preferOffline<\"u\"){let h=await n(\"The --prefer-offline flag is deprecated; use the --cached flag with 'yarn add' instead\",{error:!TQ.default.VERCEL});if(h!==null)return h}if(typeof this.production<\"u\"){let h=await n(\"The --production option is deprecated on 'install'; use 'yarn workspaces focus' instead\",{error:!0});if(h!==null)return h}if(typeof this.nonInteractive<\"u\"){let h=await n(\"The --non-interactive option is deprecated\",{error:!i});if(h!==null)return h}if(typeof this.frozenLockfile<\"u\"&&(await n(\"The --frozen-lockfile option is deprecated; use --immutable and/or --immutable-cache instead\",{error:!1}),this.immutable=this.frozenLockfile),typeof this.cacheFolder<\"u\"){let h=await n(\"The cache-folder option has been deprecated; use rc settings instead\",{error:!TQ.default.NETLIFY});if(h!==null)return h}let s=this.mode===\"update-lockfile\";if(s&&(this.immutable||this.immutableCache))throw new be(`${ee.pretty(t,\"--immutable\",ee.Type.CODE)} and ${ee.pretty(t,\"--immutable-cache\",ee.Type.CODE)} cannot be used with ${ee.pretty(t,\"--mode=update-lockfile\",ee.Type.CODE)}`);let o=((f=this.immutable)!=null?f:t.get(\"enableImmutableInstalls\"))&&!s,a=this.immutableCache&&!s;if(t.projectCwd!==null){let h=await Ge.start({configuration:t,json:this.json,stdout:this.context.stdout,includeFooter:!1},async p=>{await R4e(t,o)&&(p.reportInfo(48,\"Automatically fixed merge conflicts \\u{1F44D}\"),p.reportSeparator())});if(h.hasErrors())return h.exitCode()}if(t.projectCwd!==null&&typeof t.sources.get(\"nodeLinker\")>\"u\"){let h=t.projectCwd,p;try{p=await M.readFilePromise(x.join(h,xt.lockfile),\"utf8\")}catch{}if(p!=null&&p.includes(\"yarn lockfile v1\")){let C=await Ge.start({configuration:t,json:this.json,stdout:this.context.stdout,includeFooter:!1},async y=>{y.reportInfo(70,\"Migrating from Yarn 1; automatically enabling the compatibility node-modules linker \\u{1F44D}\"),y.reportSeparator(),t.use(\"<compat>\",{nodeLinker:\"node-modules\"},h,{overwrite:!0}),await ye.updateConfiguration(h,{nodeLinker:\"node-modules\"})});if(C.hasErrors())return C.exitCode()}}if(t.projectCwd!==null){let h=await Ge.start({configuration:t,json:this.json,stdout:this.context.stdout,includeFooter:!1},async p=>{var C;(C=ye.telemetry)!=null&&C.isNew&&(p.reportInfo(65,\"Yarn will periodically gather anonymous telemetry: https://yarnpkg.com/advanced/telemetry\"),p.reportInfo(65,`Run ${ee.pretty(t,\"yarn config set --home enableTelemetry 0\",ee.Type.CODE)} to disable`),p.reportSeparator())});if(h.hasErrors())return h.exitCode()}let{project:l,workspace:c}=await je.find(t,this.context.cwd),u=await Rt.find(t,{immutable:a,check:this.checkCache});if(!c)throw new ct(l.cwd,this.context.cwd);return await l.restoreInstallState({restoreResolutions:!1}),(await Ge.start({configuration:t,json:this.json,stdout:this.context.stdout,includeLogs:!0},async h=>{await l.install({cache:u,report:h,immutable:o,mode:this.mode})})).exitCode()}};yu.paths=[[\"install\"],ve.Default],yu.usage=ve.Usage({description:\"install the project dependencies\",details:`\n      This command sets up your project if needed. The installation is split into four different steps that each have their own characteristics:\n\n      - **Resolution:** First the package manager will resolve your dependencies. The exact way a dependency version is privileged over another isn't standardized outside of the regular semver guarantees. If a package doesn't resolve to what you would expect, check that all dependencies are correctly declared (also check our website for more information: ).\n\n      - **Fetch:** Then we download all the dependencies if needed, and make sure that they're all stored within our cache (check the value of \\`cacheFolder\\` in \\`yarn config\\` to see where the cache files are stored).\n\n      - **Link:** Then we send the dependency tree information to internal plugins tasked with writing them on the disk in some form (for example by generating the .pnp.cjs file you might know).\n\n      - **Build:** Once the dependency tree has been written on the disk, the package manager will now be free to run the build scripts for all packages that might need it, in a topological order compatible with the way they depend on one another. See https://yarnpkg.com/advanced/lifecycle-scripts for detail.\n\n      Note that running this command is not part of the recommended workflow. Yarn supports zero-installs, which means that as long as you store your cache and your .pnp.cjs file inside your repository, everything will work without requiring any install right after cloning your repository or switching branches.\n\n      If the \\`--immutable\\` option is set (defaults to true on CI), Yarn will abort with an error exit code if the lockfile was to be modified (other paths can be added using the \\`immutablePatterns\\` configuration setting). For backward compatibility we offer an alias under the name of \\`--frozen-lockfile\\`, but it will be removed in a later release.\n\n      If the \\`--immutable-cache\\` option is set, Yarn will abort with an error exit code if the cache folder was to be modified (either because files would be added, or because they'd be removed).\n\n      If the \\`--check-cache\\` option is set, Yarn will always refetch the packages and will ensure that their checksum matches what's 1/ described in the lockfile 2/ inside the existing cache files (if present). This is recommended as part of your CI workflow if you're both following the Zero-Installs model and accepting PRs from third-parties, as they'd otherwise have the ability to alter the checked-in packages before submitting them.\n\n      If the \\`--inline-builds\\` option is set, Yarn will verbosely print the output of the build steps of your dependencies (instead of writing them into individual files). This is likely useful mostly for debug purposes only when using Docker-like environments.\n\n      If the \\`--mode=<mode>\\` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n      - \\`skip-build\\` will not run the build scripts at all. Note that this is different from setting \\`enableScripts\\` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n      - \\`update-lockfile\\` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n    `,examples:[[\"Install the project\",\"$0 install\"],[\"Validate a project when using Zero-Installs\",\"$0 install --immutable --immutable-cache\"],[\"Validate a project when using Zero-Installs (slightly safer if you accept external PRs)\",\"$0 install --immutable --immutable-cache --check-cache\"]]});var P4e=\"|||||||\",D4e=\">>>>>>>\",k4e=\"=======\",gae=\"<<<<<<<\";async function R4e(r,e){if(!r.projectCwd)return!1;let t=x.join(r.projectCwd,r.get(\"lockfileFilename\"));if(!await M.existsPromise(t))return!1;let i=await M.readFilePromise(t,\"utf8\");if(!i.includes(gae))return!1;if(e)throw new at(47,\"Cannot autofix a lockfile when running an immutable install\");let[n,s]=F4e(i),o,a;try{o=yi(n),a=yi(s)}catch{throw new at(46,\"The individual variants of the lockfile failed to parse\")}let l={...o,...a};for(let[c,u]of Object.entries(l))typeof u==\"string\"&&delete l[c];return await M.changeFilePromise(t,Qa(l),{automaticNewlines:!0}),!0}function F4e(r){let e=[[],[]],t=r.split(/\\r?\\n/g),i=!1;for(;t.length>0;){let n=t.shift();if(typeof n>\"u\")throw new Error(\"Assertion failed: Some lines should remain\");if(n.startsWith(gae)){for(;t.length>0;){let s=t.shift();if(typeof s>\"u\")throw new Error(\"Assertion failed: Some lines should remain\");if(s===k4e){i=!1;break}else if(i||s.startsWith(P4e)){i=!0;continue}else e[0].push(s)}for(;t.length>0;){let s=t.shift();if(typeof s>\"u\")throw new Error(\"Assertion failed: Some lines should remain\");if(s.startsWith(D4e))break;e[1].push(s)}}else e[0].push(n),e[1].push(n)}return[e[0].join(`\n`),e[1].join(`\n`)]}var wu=class extends De{constructor(){super(...arguments);this.all=z.Boolean(\"-A,--all\",!1,{description:\"Link all workspaces belonging to the target project to the current one\"});this.private=z.Boolean(\"-p,--private\",!1,{description:\"Also link private workspaces belonging to the target project to the current one\"});this.relative=z.Boolean(\"-r,--relative\",!1,{description:\"Link workspaces using relative paths instead of absolute paths\"});this.destination=z.String()}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,workspace:n}=await je.find(t,this.context.cwd),s=await Rt.find(t);if(!n)throw new ct(i.cwd,this.context.cwd);await i.restoreInstallState({restoreResolutions:!1});let o=x.resolve(this.context.cwd,K.toPortablePath(this.destination)),a=await ye.find(o,this.context.plugins,{useRc:!1,strict:!1}),{project:l,workspace:c}=await je.find(a,o);if(i.cwd===l.cwd)throw new be(\"Invalid destination; Can't link the project to itself\");if(!c)throw new ct(l.cwd,o);let u=i.topLevelWorkspace,g=[];if(this.all){for(let h of l.workspaces)h.manifest.name&&(!h.manifest.private||this.private)&&g.push(h);if(g.length===0)throw new be(\"No workspace found to be linked in the target project\")}else{if(!c.manifest.name)throw new be(\"The target workspace doesn't have a name and thus cannot be linked\");if(c.manifest.private&&!this.private)throw new be(\"The target workspace is marked private - use the --private flag to link it anyway\");g.push(c)}for(let h of g){let p=P.stringifyIdent(h.locator),C=this.relative?x.relative(i.cwd,h.cwd):h.cwd;u.manifest.resolutions.push({pattern:{descriptor:{fullName:p}},reference:`portal:${C}`})}return(await Ge.start({configuration:t,stdout:this.context.stdout},async h=>{await i.install({cache:s,report:h})})).exitCode()}};wu.paths=[[\"link\"]],wu.usage=ve.Usage({description:\"connect the local project to another one\",details:\"\\n      This command will set a new `resolutions` field in the project-level manifest and point it to the workspace at the specified location (even if part of another project).\\n    \",examples:[[\"Register a remote workspace for use in the current project\",\"$0 link ~/ts-loader\"],[\"Register all workspaces from a remote project for use in the current project\",\"$0 link ~/jest --all\"]]});var Bu=class extends De{constructor(){super(...arguments);this.args=z.Proxy()}async execute(){return this.cli.run([\"exec\",\"node\",...this.args])}};Bu.paths=[[\"node\"]],Bu.usage=ve.Usage({description:\"run node with the hook already setup\",details:`\n      This command simply runs Node. It also makes sure to call it in a way that's compatible with the current project (for example, on PnP projects the environment will be setup in such a way that PnP will be correctly injected into the environment).\n\n      The Node process will use the exact same version of Node as the one used to run Yarn itself, which might be a good way to ensure that your commands always use a consistent Node version.\n    `,examples:[[\"Run a Node script\",\"$0 node ./my-script.js\"]]});var mae=J(\"os\");var fae=J(\"os\");var N4e=\"https://raw.githubusercontent.com/yarnpkg/berry/master/plugins.yml\";async function bu(r){let e=await Xt.get(N4e,{configuration:r});return yi(e.toString())}var Qu=class extends De{constructor(){super(...arguments);this.json=z.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"})}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins);return(await Ge.start({configuration:t,json:this.json,stdout:this.context.stdout},async n=>{let s=await bu(t);for(let[o,{experimental:a,...l}]of Object.entries(s)){let c=o;a&&(c+=\" [experimental]\"),n.reportJson({name:o,experimental:a,...l}),n.reportInfo(null,c)}})).exitCode()}};Qu.paths=[[\"plugin\",\"list\"]],Qu.usage=ve.Usage({category:\"Plugin-related commands\",description:\"list the available official plugins\",details:\"\\n      This command prints the plugins available directly from the Yarn repository. Only those plugins can be referenced by name in `yarn plugin import`.\\n    \",examples:[[\"List the official plugins\",\"$0 plugin list\"]]});var T4e=/^[0-9]+$/;function hae(r){return T4e.test(r)?`pull/${r}/head`:r}var L4e=({repository:r,branch:e},t)=>[[\"git\",\"init\",K.fromPortablePath(t)],[\"git\",\"remote\",\"add\",\"origin\",r],[\"git\",\"fetch\",\"origin\",\"--depth=1\",hae(e)],[\"git\",\"reset\",\"--hard\",\"FETCH_HEAD\"]],O4e=({branch:r})=>[[\"git\",\"fetch\",\"origin\",\"--depth=1\",hae(r),\"--force\"],[\"git\",\"reset\",\"--hard\",\"FETCH_HEAD\"],[\"git\",\"clean\",\"-dfx\"]],M4e=({plugins:r,noMinify:e},t)=>[[\"yarn\",\"build:cli\",...new Array().concat(...r.map(i=>[\"--plugin\",x.resolve(t,i)])),...e?[\"--no-minify\"]:[],\"|\"]],Su=class extends De{constructor(){super(...arguments);this.installPath=z.String(\"--path\",{description:\"The path where the repository should be cloned to\"});this.repository=z.String(\"--repository\",\"https://github.com/yarnpkg/berry.git\",{description:\"The repository that should be cloned\"});this.branch=z.String(\"--branch\",\"master\",{description:\"The branch of the repository that should be cloned\"});this.plugins=z.Array(\"--plugin\",[],{description:\"An array of additional plugins that should be included in the bundle\"});this.noMinify=z.Boolean(\"--no-minify\",!1,{description:\"Build a bundle for development (debugging) - non-minified and non-mangled\"});this.force=z.Boolean(\"-f,--force\",!1,{description:\"Always clone the repository instead of trying to fetch the latest commits\"});this.skipPlugins=z.Boolean(\"--skip-plugins\",!1,{description:\"Skip updating the contrib plugins\"})}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i}=await je.find(t,this.context.cwd),n=typeof this.installPath<\"u\"?x.resolve(this.context.cwd,K.toPortablePath(this.installPath)):x.resolve(K.toPortablePath((0,fae.tmpdir)()),\"yarnpkg-sources\",li.makeHash(this.repository).slice(0,6));return(await Ge.start({configuration:t,stdout:this.context.stdout},async o=>{await $L(this,{configuration:t,report:o,target:n}),o.reportSeparator(),o.reportInfo(0,\"Building a fresh bundle\"),o.reportSeparator(),await Wm(M4e(this,n),{configuration:t,context:this.context,target:n}),o.reportSeparator();let a=x.resolve(n,\"packages/yarnpkg-cli/bundles/yarn.js\"),l=await M.readFilePromise(a);await _L(t,\"sources\",l,{report:o}),this.skipPlugins||await K4e(this,{project:i,report:o,target:n})})).exitCode()}};Su.paths=[[\"set\",\"version\",\"from\",\"sources\"]],Su.usage=ve.Usage({description:\"build Yarn from master\",details:`\n      This command will clone the Yarn repository into a temporary folder, then build it. The resulting bundle will then be copied into the local project.\n\n      By default, it also updates all contrib plugins to the same commit the bundle is built from. This behavior can be disabled by using the \\`--skip-plugins\\` flag.\n    `,examples:[[\"Build Yarn from master\",\"$0 set version from sources\"]]});async function Wm(r,{configuration:e,context:t,target:i}){for(let[n,...s]of r){let o=s[s.length-1]===\"|\";if(o&&s.pop(),o)await Cr.pipevp(n,s,{cwd:i,stdin:t.stdin,stdout:t.stdout,stderr:t.stderr,strict:!0});else{t.stdout.write(`${ee.pretty(e,`  $ ${[n,...s].join(\" \")}`,\"grey\")}\n`);try{await Cr.execvp(n,s,{cwd:i,strict:!0})}catch(a){throw t.stdout.write(a.stdout||a.stack),a}}}}async function $L(r,{configuration:e,report:t,target:i}){let n=!1;if(!r.force&&M.existsSync(x.join(i,\".git\"))){t.reportInfo(0,\"Fetching the latest commits\"),t.reportSeparator();try{await Wm(O4e(r),{configuration:e,context:r.context,target:i}),n=!0}catch{t.reportSeparator(),t.reportWarning(0,\"Repository update failed; we'll try to regenerate it\")}}n||(t.reportInfo(0,\"Cloning the remote repository\"),t.reportSeparator(),await M.removePromise(i),await M.mkdirPromise(i,{recursive:!0}),await Wm(L4e(r,i),{configuration:e,context:r.context,target:i}))}async function K4e(r,{project:e,report:t,target:i}){let n=await bu(e.configuration),s=new Set(Object.keys(n));for(let o of e.configuration.plugins.keys())!s.has(o)||await eO(o,r,{project:e,report:t,target:i})}var pae=Pe(Xr()),dae=J(\"url\"),Cae=J(\"vm\");var vu=class extends De{constructor(){super(...arguments);this.name=z.String()}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins);return(await Ge.start({configuration:t,stdout:this.context.stdout},async n=>{let{project:s}=await je.find(t,this.context.cwd),o,a;if(this.name.match(/^\\.{0,2}[\\\\/]/)||K.isAbsolute(this.name)){let l=x.resolve(this.context.cwd,K.toPortablePath(this.name));n.reportInfo(0,`Reading ${ee.pretty(t,l,ee.Type.PATH)}`),o=x.relative(s.cwd,l),a=await M.readFilePromise(l)}else{let l;if(this.name.match(/^https?:/)){try{new dae.URL(this.name)}catch{throw new at(52,`Plugin specifier \"${this.name}\" is neither a plugin name nor a valid url`)}o=this.name,l=this.name}else{let c=P.parseLocator(this.name.replace(/^((@yarnpkg\\/)?plugin-)?/,\"@yarnpkg/plugin-\"));if(c.reference!==\"unknown\"&&!pae.default.valid(c.reference))throw new at(0,\"Official plugins only accept strict version references. Use an explicit URL if you wish to download them from another location.\");let u=P.stringifyIdent(c),g=await bu(t);if(!Object.prototype.hasOwnProperty.call(g,u))throw new at(51,`Couldn't find a plugin named \"${u}\" on the remote registry. Note that only the plugins referenced on our website (https://github.com/yarnpkg/berry/blob/master/plugins.yml) can be referenced by their name; any other plugin will have to be referenced through its public url (for example https://github.com/yarnpkg/berry/raw/master/packages/plugin-typescript/bin/%40yarnpkg/plugin-typescript.js).`);o=u,l=g[u].url,c.reference!==\"unknown\"?l=l.replace(/\\/master\\//,`/${u}/${c.reference}/`):Tr!==null&&(l=l.replace(/\\/master\\//,`/@yarnpkg/cli/${Tr}/`))}n.reportInfo(0,`Downloading ${ee.pretty(t,l,\"green\")}`),a=await Xt.get(l,{configuration:t})}await tO(o,a,{project:s,report:n})})).exitCode()}};vu.paths=[[\"plugin\",\"import\"]],vu.usage=ve.Usage({category:\"Plugin-related commands\",description:\"download a plugin\",details:`\n      This command downloads the specified plugin from its remote location and updates the configuration to reference it in further CLI invocations.\n\n      Three types of plugin references are accepted:\n\n      - If the plugin is stored within the Yarn repository, it can be referenced by name.\n      - Third-party plugins can be referenced directly through their public urls.\n      - Local plugins can be referenced by their path on the disk.\n\n      Plugins cannot be downloaded from the npm registry, and aren't allowed to have dependencies (they need to be bundled into a single file, possibly thanks to the \\`@yarnpkg/builder\\` package).\n    `,examples:[['Download and activate the \"@yarnpkg/plugin-exec\" plugin',\"$0 plugin import @yarnpkg/plugin-exec\"],['Download and activate the \"@yarnpkg/plugin-exec\" plugin (shorthand)',\"$0 plugin import exec\"],[\"Download and activate a community plugin\",\"$0 plugin import https://example.org/path/to/plugin.js\"],[\"Activate a local plugin\",\"$0 plugin import ./path/to/plugin.js\"]]});async function tO(r,e,{project:t,report:i}){let{configuration:n}=t,s={},o={exports:s};(0,Cae.runInNewContext)(e.toString(),{module:o,exports:s});let a=o.exports.name,l=`.yarn/plugins/${a}.cjs`,c=x.resolve(t.cwd,l);i.reportInfo(0,`Saving the new plugin in ${ee.pretty(n,l,\"magenta\")}`),await M.mkdirPromise(x.dirname(c),{recursive:!0}),await M.writeFilePromise(c,e);let u={path:l,spec:r};await ye.updateConfiguration(t.cwd,g=>{let f=[],h=!1;for(let p of g.plugins||[]){let C=typeof p!=\"string\"?p.path:p,y=x.resolve(t.cwd,K.toPortablePath(C)),{name:B}=Ie.dynamicRequire(y);B!==a?f.push(p):(f.push(u),h=!0)}return h||f.push(u),{...g,plugins:f}})}var U4e=({pluginName:r,noMinify:e},t)=>[[\"yarn\",`build:${r}`,...e?[\"--no-minify\"]:[],\"|\"]],xu=class extends De{constructor(){super(...arguments);this.installPath=z.String(\"--path\",{description:\"The path where the repository should be cloned to\"});this.repository=z.String(\"--repository\",\"https://github.com/yarnpkg/berry.git\",{description:\"The repository that should be cloned\"});this.branch=z.String(\"--branch\",\"master\",{description:\"The branch of the repository that should be cloned\"});this.noMinify=z.Boolean(\"--no-minify\",!1,{description:\"Build a plugin for development (debugging) - non-minified and non-mangled\"});this.force=z.Boolean(\"-f,--force\",!1,{description:\"Always clone the repository instead of trying to fetch the latest commits\"});this.name=z.String()}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),i=typeof this.installPath<\"u\"?x.resolve(this.context.cwd,K.toPortablePath(this.installPath)):x.resolve(K.toPortablePath((0,mae.tmpdir)()),\"yarnpkg-sources\",li.makeHash(this.repository).slice(0,6));return(await Ge.start({configuration:t,stdout:this.context.stdout},async s=>{let{project:o}=await je.find(t,this.context.cwd),a=P.parseIdent(this.name.replace(/^((@yarnpkg\\/)?plugin-)?/,\"@yarnpkg/plugin-\")),l=P.stringifyIdent(a),c=await bu(t);if(!Object.prototype.hasOwnProperty.call(c,l))throw new at(51,`Couldn't find a plugin named \"${l}\" on the remote registry. Note that only the plugins referenced on our website (https://github.com/yarnpkg/berry/blob/master/plugins.yml) can be built and imported from sources.`);let u=l;await $L(this,{configuration:t,report:s,target:i}),await eO(u,this,{project:o,report:s,target:i})})).exitCode()}};xu.paths=[[\"plugin\",\"import\",\"from\",\"sources\"]],xu.usage=ve.Usage({category:\"Plugin-related commands\",description:\"build a plugin from sources\",details:`\n      This command clones the Yarn repository into a temporary folder, builds the specified contrib plugin and updates the configuration to reference it in further CLI invocations.\n\n      The plugins can be referenced by their short name if sourced from the official Yarn repository.\n    `,examples:[['Build and activate the \"@yarnpkg/plugin-exec\" plugin',\"$0 plugin import from sources @yarnpkg/plugin-exec\"],['Build and activate the \"@yarnpkg/plugin-exec\" plugin (shorthand)',\"$0 plugin import from sources exec\"]]});async function eO(r,{context:e,noMinify:t},{project:i,report:n,target:s}){let o=r.replace(/@yarnpkg\\//,\"\"),{configuration:a}=i;n.reportSeparator(),n.reportInfo(0,`Building a fresh ${o}`),n.reportSeparator(),await Wm(U4e({pluginName:o,noMinify:t},s),{configuration:a,context:e,target:s}),n.reportSeparator();let l=x.resolve(s,`packages/${o}/bundles/${r}.js`),c=await M.readFilePromise(l);await tO(r,c,{project:i,report:n})}var Pu=class extends De{constructor(){super(...arguments);this.name=z.String()}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i}=await je.find(t,this.context.cwd);return(await Ge.start({configuration:t,stdout:this.context.stdout},async s=>{let o=this.name,a=P.parseIdent(o);if(!t.plugins.has(o))throw new be(`${P.prettyIdent(t,a)} isn't referenced by the current configuration`);let l=`.yarn/plugins/${o}.cjs`,c=x.resolve(i.cwd,l);M.existsSync(c)&&(s.reportInfo(0,`Removing ${ee.pretty(t,l,ee.Type.PATH)}...`),await M.removePromise(c)),s.reportInfo(0,\"Updating the configuration...\"),await ye.updateConfiguration(i.cwd,u=>{if(!Array.isArray(u.plugins))return u;let g=u.plugins.filter(f=>f.path!==l);return u.plugins.length===g.length?u:{...u,plugins:g}})})).exitCode()}};Pu.paths=[[\"plugin\",\"remove\"]],Pu.usage=ve.Usage({category:\"Plugin-related commands\",description:\"remove a plugin\",details:`\n      This command deletes the specified plugin from the .yarn/plugins folder and removes it from the configuration.\n\n      **Note:** The plugins have to be referenced by their name property, which can be obtained using the \\`yarn plugin runtime\\` command. Shorthands are not allowed.\n   `,examples:[[\"Remove a plugin imported from the Yarn repository\",\"$0 plugin remove @yarnpkg/plugin-typescript\"],[\"Remove a plugin imported from a local file\",\"$0 plugin remove my-local-plugin\"]]});var Du=class extends De{constructor(){super(...arguments);this.json=z.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"})}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins);return(await Ge.start({configuration:t,json:this.json,stdout:this.context.stdout},async n=>{for(let s of t.plugins.keys()){let o=this.context.plugins.plugins.has(s),a=s;o&&(a+=\" [builtin]\"),n.reportJson({name:s,builtin:o}),n.reportInfo(null,`${a}`)}})).exitCode()}};Du.paths=[[\"plugin\",\"runtime\"]],Du.usage=ve.Usage({category:\"Plugin-related commands\",description:\"list the active plugins\",details:`\n      This command prints the currently active plugins. Will be displayed both builtin plugins and external plugins.\n    `,examples:[[\"List the currently active plugins\",\"$0 plugin runtime\"]]});var ku=class extends De{constructor(){super(...arguments);this.idents=z.Rest()}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,workspace:n}=await je.find(t,this.context.cwd),s=await Rt.find(t);if(!n)throw new ct(i.cwd,this.context.cwd);let o=new Set;for(let l of this.idents)o.add(P.parseIdent(l).identHash);if(await i.restoreInstallState({restoreResolutions:!1}),await i.resolveEverything({cache:s,report:new ti}),o.size>0)for(let l of i.storedPackages.values())o.has(l.identHash)&&i.storedBuildState.delete(l.locatorHash);else i.storedBuildState.clear();return(await Ge.start({configuration:t,stdout:this.context.stdout,includeLogs:!this.context.quiet},async l=>{await i.install({cache:s,report:l})})).exitCode()}};ku.paths=[[\"rebuild\"]],ku.usage=ve.Usage({description:\"rebuild the project's native packages\",details:`\n      This command will automatically cause Yarn to forget about previous compilations of the given packages and to run them again.\n\n      Note that while Yarn forgets the compilation, the previous artifacts aren't erased from the filesystem and may affect the next builds (in good or bad). To avoid this, you may remove the .yarn/unplugged folder, or any other relevant location where packages might have been stored (Yarn may offer a way to do that automatically in the future).\n\n      By default all packages will be rebuilt, but you can filter the list by specifying the names of the packages you want to clear from memory.\n    `,examples:[[\"Rebuild all packages\",\"$0 rebuild\"],[\"Rebuild fsevents only\",\"$0 rebuild fsevents\"]]});var rO=Pe(Bn());ls();var Ru=class extends De{constructor(){super(...arguments);this.all=z.Boolean(\"-A,--all\",!1,{description:\"Apply the operation to all workspaces from the current project\"});this.mode=z.String(\"--mode\",{description:\"Change what artifacts installs generate\",validator:Zi(ts)});this.patterns=z.Rest()}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,workspace:n}=await je.find(t,this.context.cwd),s=await Rt.find(t);if(!n)throw new ct(i.cwd,this.context.cwd);await i.restoreInstallState({restoreResolutions:!1});let o=this.all?i.workspaces:[n],a=[\"dependencies\",\"devDependencies\",\"peerDependencies\"],l=[],c=!1,u=[];for(let p of this.patterns){let C=!1,y=P.parseIdent(p);for(let B of o){let v=[...B.manifest.peerDependenciesMeta.keys()];for(let D of(0,rO.default)(v,p))B.manifest.peerDependenciesMeta.delete(D),c=!0,C=!0;for(let D of a){let T=B.manifest.getForScope(D),H=[...T.values()].map(j=>P.stringifyIdent(j));for(let j of(0,rO.default)(H,P.stringifyIdent(y))){let{identHash:$}=P.parseIdent(j),V=T.get($);if(typeof V>\"u\")throw new Error(\"Assertion failed: Expected the descriptor to be registered\");B.manifest[D].delete($),u.push([B,D,V]),c=!0,C=!0}}}C||l.push(p)}let g=l.length>1?\"Patterns\":\"Pattern\",f=l.length>1?\"don't\":\"doesn't\",h=this.all?\"any\":\"this\";if(l.length>0)throw new be(`${g} ${ee.prettyList(t,l,xi.CODE)} ${f} match any packages referenced by ${h} workspace`);return c?(await t.triggerMultipleHooks(C=>C.afterWorkspaceDependencyRemoval,u),(await Ge.start({configuration:t,stdout:this.context.stdout},async C=>{await i.install({cache:s,report:C,mode:this.mode})})).exitCode()):0}};Ru.paths=[[\"remove\"]],Ru.usage=ve.Usage({description:\"remove dependencies from the project\",details:`\n      This command will remove the packages matching the specified patterns from the current workspace.\n\n      If the \\`--mode=<mode>\\` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n      - \\`skip-build\\` will not run the build scripts at all. Note that this is different from setting \\`enableScripts\\` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n      - \\`update-lockfile\\` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n\n      This command accepts glob patterns as arguments (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\n    `,examples:[[\"Remove a dependency from the current project\",\"$0 remove lodash\"],[\"Remove a dependency from all workspaces at once\",\"$0 remove lodash --all\"],[\"Remove all dependencies starting with `eslint-`\",\"$0 remove 'eslint-*'\"],[\"Remove all dependencies with the `@babel` scope\",\"$0 remove '@babel/*'\"],[\"Remove all dependencies matching `react-dom` or `react-helmet`\",\"$0 remove 'react-{dom,helmet}'\"]]});var Eae=J(\"util\"),_h=class extends De{async execute(){let e=await ye.find(this.context.cwd,this.context.plugins),{project:t,workspace:i}=await je.find(e,this.context.cwd);if(!i)throw new ct(t.cwd,this.context.cwd);return(await Ge.start({configuration:e,stdout:this.context.stdout},async s=>{let o=i.manifest.scripts,a=Ie.sortMap(o.keys(),u=>u),l={breakLength:1/0,colors:e.get(\"enableColors\"),maxArrayLength:2},c=a.reduce((u,g)=>Math.max(u,g.length),0);for(let[u,g]of o.entries())s.reportInfo(null,`${u.padEnd(c,\" \")}   ${(0,Eae.inspect)(g,l)}`)})).exitCode()}};_h.paths=[[\"run\"]];var Fu=class extends De{constructor(){super(...arguments);this.inspect=z.String(\"--inspect\",!1,{tolerateBoolean:!0,description:\"Forwarded to the underlying Node process when executing a binary\"});this.inspectBrk=z.String(\"--inspect-brk\",!1,{tolerateBoolean:!0,description:\"Forwarded to the underlying Node process when executing a binary\"});this.topLevel=z.Boolean(\"-T,--top-level\",!1,{description:\"Check the root workspace for scripts and/or binaries instead of the current one\"});this.binariesOnly=z.Boolean(\"-B,--binaries-only\",!1,{description:\"Ignore any user defined scripts and only check for binaries\"});this.silent=z.Boolean(\"--silent\",{hidden:!0});this.scriptName=z.String();this.args=z.Proxy()}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,workspace:n,locator:s}=await je.find(t,this.context.cwd);await i.restoreInstallState();let o=this.topLevel?i.topLevelWorkspace.anchoredLocator:s;if(!this.binariesOnly&&await Wt.hasPackageScript(o,this.scriptName,{project:i}))return await Wt.executePackageScript(o,this.scriptName,this.args,{project:i,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});let a=await Wt.getPackageAccessibleBinaries(o,{project:i});if(a.get(this.scriptName)){let c=[];return this.inspect&&(typeof this.inspect==\"string\"?c.push(`--inspect=${this.inspect}`):c.push(\"--inspect\")),this.inspectBrk&&(typeof this.inspectBrk==\"string\"?c.push(`--inspect-brk=${this.inspectBrk}`):c.push(\"--inspect-brk\")),await Wt.executePackageAccessibleBinary(o,this.scriptName,this.args,{cwd:this.context.cwd,project:i,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,nodeArgs:c,packageAccessibleBinaries:a})}if(!this.topLevel&&!this.binariesOnly&&n&&this.scriptName.includes(\":\")){let u=(await Promise.all(i.workspaces.map(async g=>g.manifest.scripts.has(this.scriptName)?g:null))).filter(g=>g!==null);if(u.length===1)return await Wt.executeWorkspaceScript(u[0],this.scriptName,this.args,{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})}if(this.topLevel)throw this.scriptName===\"node-gyp\"?new be(`Couldn't find a script name \"${this.scriptName}\" in the top-level (used by ${P.prettyLocator(t,s)}). This typically happens because some package depends on \"node-gyp\" to build itself, but didn't list it in their dependencies. To fix that, please run \"yarn add node-gyp\" into your top-level workspace. You also can open an issue on the repository of the specified package to suggest them to use an optional peer dependency.`):new be(`Couldn't find a script name \"${this.scriptName}\" in the top-level (used by ${P.prettyLocator(t,s)}).`);{if(this.scriptName===\"global\")throw new be(\"The 'yarn global' commands have been removed in 2.x - consider using 'yarn dlx' or a third-party plugin instead\");let c=[this.scriptName].concat(this.args);for(let[u,g]of vh)for(let f of g)if(c.length>=f.length&&JSON.stringify(c.slice(0,f.length))===JSON.stringify(f))throw new be(`Couldn't find a script named \"${this.scriptName}\", but a matching command can be found in the ${u} plugin. You can install it with \"yarn plugin import ${u}\".`);throw new be(`Couldn't find a script named \"${this.scriptName}\".`)}}};Fu.paths=[[\"run\"]],Fu.usage=ve.Usage({description:\"run a script defined in the package.json\",details:`\n      This command will run a tool. The exact tool that will be executed will depend on the current state of your workspace:\n\n      - If the \\`scripts\\` field from your local package.json contains a matching script name, its definition will get executed.\n\n      - Otherwise, if one of the local workspace's dependencies exposes a binary with a matching name, this binary will get executed.\n\n      - Otherwise, if the specified name contains a colon character and if one of the workspaces in the project contains exactly one script with a matching name, then this script will get executed.\n\n      Whatever happens, the cwd of the spawned process will be the workspace that declares the script (which makes it possible to call commands cross-workspaces using the third syntax).\n    `,examples:[[\"Run the tests from the local workspace\",\"$0 run test\"],['Same thing, but without the \"run\" keyword',\"$0 test\"],[\"Inspect Webpack while running\",\"$0 run --inspect-brk webpack\"]]});var Nu=class extends De{constructor(){super(...arguments);this.save=z.Boolean(\"-s,--save\",!1,{description:\"Persist the resolution inside the top-level manifest\"});this.descriptor=z.String();this.resolution=z.String()}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,workspace:n}=await je.find(t,this.context.cwd),s=await Rt.find(t);if(await i.restoreInstallState({restoreResolutions:!1}),!n)throw new ct(i.cwd,this.context.cwd);let o=P.parseDescriptor(this.descriptor,!0),a=P.makeDescriptor(o,this.resolution);return i.storedDescriptors.set(o.descriptorHash,o),i.storedDescriptors.set(a.descriptorHash,a),i.resolutionAliases.set(o.descriptorHash,a.descriptorHash),(await Ge.start({configuration:t,stdout:this.context.stdout},async c=>{await i.install({cache:s,report:c})})).exitCode()}};Nu.paths=[[\"set\",\"resolution\"]],Nu.usage=ve.Usage({description:\"enforce a package resolution\",details:'\\n      This command updates the resolution table so that `descriptor` is resolved by `resolution`.\\n\\n      Note that by default this command only affect the current resolution table - meaning that this \"manual override\" will disappear if you remove the lockfile, or if the package disappear from the table. If you wish to make the enforced resolution persist whatever happens, add the `-s,--save` flag which will also edit the `resolutions` field from your top-level manifest.\\n\\n      Note that no attempt is made at validating that `resolution` is a valid resolution entry for `descriptor`.\\n    ',examples:[[\"Force all instances of lodash@npm:^1.2.3 to resolve to 1.5.0\",\"$0 set resolution lodash@npm:^1.2.3 1.5.0\"]]});var Iae=Pe(Bn()),Tu=class extends De{constructor(){super(...arguments);this.all=z.Boolean(\"-A,--all\",!1,{description:\"Unlink all workspaces belonging to the target project from the current one\"});this.leadingArguments=z.Rest()}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,workspace:n}=await je.find(t,this.context.cwd),s=await Rt.find(t);if(!n)throw new ct(i.cwd,this.context.cwd);let o=i.topLevelWorkspace,a=new Set;if(this.leadingArguments.length===0&&this.all)for(let{pattern:c,reference:u}of o.manifest.resolutions)u.startsWith(\"portal:\")&&a.add(c.descriptor.fullName);if(this.leadingArguments.length>0)for(let c of this.leadingArguments){let u=x.resolve(this.context.cwd,K.toPortablePath(c));if(Ie.isPathLike(c)){let g=await ye.find(u,this.context.plugins,{useRc:!1,strict:!1}),{project:f,workspace:h}=await je.find(g,u);if(!h)throw new ct(f.cwd,u);if(this.all){for(let p of f.workspaces)p.manifest.name&&a.add(P.stringifyIdent(p.locator));if(a.size===0)throw new be(\"No workspace found to be unlinked in the target project\")}else{if(!h.manifest.name)throw new be(\"The target workspace doesn't have a name and thus cannot be unlinked\");a.add(P.stringifyIdent(h.locator))}}else{let g=[...o.manifest.resolutions.map(({pattern:f})=>f.descriptor.fullName)];for(let f of(0,Iae.default)(g,c))a.add(f)}}return o.manifest.resolutions=o.manifest.resolutions.filter(({pattern:c})=>!a.has(c.descriptor.fullName)),(await Ge.start({configuration:t,stdout:this.context.stdout},async c=>{await i.install({cache:s,report:c})})).exitCode()}};Tu.paths=[[\"unlink\"]],Tu.usage=ve.Usage({description:\"disconnect the local project from another one\",details:`\n      This command will remove any resolutions in the project-level manifest that would have been added via a yarn link with similar arguments.\n    `,examples:[[\"Unregister a remote workspace in the current project\",\"$0 unlink ~/ts-loader\"],[\"Unregister all workspaces from a remote project in the current project\",\"$0 unlink ~/jest --all\"],[\"Unregister all previously linked workspaces\",\"$0 unlink --all\"],[\"Unregister all workspaces matching a glob\",\"$0 unlink '@babel/*' 'pkg-{a,b}'\"]]});var yae=Pe(Km()),iO=Pe(Bn());ls();var El=class extends De{constructor(){super(...arguments);this.interactive=z.Boolean(\"-i,--interactive\",{description:\"Offer various choices, depending on the detected upgrade paths\"});this.exact=z.Boolean(\"-E,--exact\",!1,{description:\"Don't use any semver modifier on the resolved range\"});this.tilde=z.Boolean(\"-T,--tilde\",!1,{description:\"Use the `~` semver modifier on the resolved range\"});this.caret=z.Boolean(\"-C,--caret\",!1,{description:\"Use the `^` semver modifier on the resolved range\"});this.recursive=z.Boolean(\"-R,--recursive\",!1,{description:\"Resolve again ALL resolutions for those packages\"});this.mode=z.String(\"--mode\",{description:\"Change what artifacts installs generate\",validator:Zi(ts)});this.patterns=z.Rest()}async execute(){return this.recursive?await this.executeUpRecursive():await this.executeUpClassic()}async executeUpRecursive(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,workspace:n}=await je.find(t,this.context.cwd),s=await Rt.find(t);if(!n)throw new ct(i.cwd,this.context.cwd);await i.restoreInstallState({restoreResolutions:!1});let o=[...i.storedDescriptors.values()],a=o.map(g=>P.stringifyIdent(g)),l=new Set;for(let g of this.patterns){if(P.parseDescriptor(g).range!==\"unknown\")throw new be(\"Ranges aren't allowed when using --recursive\");for(let f of(0,iO.default)(a,g)){let h=P.parseIdent(f);l.add(h.identHash)}}let c=o.filter(g=>l.has(g.identHash));for(let g of c)i.storedDescriptors.delete(g.descriptorHash),i.storedResolutions.delete(g.descriptorHash);return(await Ge.start({configuration:t,stdout:this.context.stdout},async g=>{await i.install({cache:s,report:g})})).exitCode()}async executeUpClassic(){var y;let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,workspace:n}=await je.find(t,this.context.cwd),s=await Rt.find(t);if(!n)throw new ct(i.cwd,this.context.cwd);await i.restoreInstallState({restoreResolutions:!1});let o=(y=this.interactive)!=null?y:t.get(\"preferInteractive\"),a=Hm(this,i),l=o?[\"keep\",\"reuse\",\"project\",\"latest\"]:[\"project\",\"latest\"],c=[],u=[];for(let B of this.patterns){let v=!1,D=P.parseDescriptor(B);for(let T of i.workspaces)for(let H of[\"dependencies\",\"devDependencies\"]){let $=[...T.manifest.getForScope(H).values()].map(V=>P.stringifyIdent(V));for(let V of(0,iO.default)($,P.stringifyIdent(D))){let W=P.parseIdent(V),_=T.manifest[H].get(W.identHash);if(typeof _>\"u\")throw new Error(\"Assertion failed: Expected the descriptor to be registered\");let A=P.makeDescriptor(W,D.range);c.push(Promise.resolve().then(async()=>[T,H,_,await Gm(A,{project:i,workspace:T,cache:s,target:H,modifier:a,strategies:l})])),v=!0}}v||u.push(B)}if(u.length>1)throw new be(`Patterns ${ee.prettyList(t,u,xi.CODE)} don't match any packages referenced by any workspace`);if(u.length>0)throw new be(`Pattern ${ee.prettyList(t,u,xi.CODE)} doesn't match any packages referenced by any workspace`);let g=await Promise.all(c),f=await ra.start({configuration:t,stdout:this.context.stdout,suggestInstall:!1},async B=>{for(let[,,v,{suggestions:D,rejections:T}]of g){let H=D.filter(j=>j.descriptor!==null);if(H.length===0){let[j]=T;if(typeof j>\"u\")throw new Error(\"Assertion failed: Expected an error to have been set\");let $=this.cli.error(j);i.configuration.get(\"enableNetwork\")?B.reportError(27,`${P.prettyDescriptor(t,v)} can't be resolved to a satisfying range\n\n${$}`):B.reportError(27,`${P.prettyDescriptor(t,v)} can't be resolved to a satisfying range (note: network resolution has been disabled)\n\n${$}`)}else H.length>1&&!o&&B.reportError(27,`${P.prettyDescriptor(t,v)} has multiple possible upgrade strategies; use -i to disambiguate manually`)}});if(f.hasErrors())return f.exitCode();let h=!1,p=[];for(let[B,v,,{suggestions:D}]of g){let T,H=D.filter(W=>W.descriptor!==null),j=H[0].descriptor,$=H.every(W=>P.areDescriptorsEqual(W.descriptor,j));H.length===1||$?T=j:(h=!0,{answer:T}=await(0,yae.prompt)({type:\"select\",name:\"answer\",message:`Which range to you want to use in ${P.prettyWorkspace(t,B)} \\u276F ${v}?`,choices:D.map(({descriptor:W,name:_,reason:A})=>W?{name:_,hint:A,descriptor:W}:{name:_,hint:A,disabled:!0}),onCancel:()=>process.exit(130),result(W){return this.find(W,\"descriptor\")},stdin:this.context.stdin,stdout:this.context.stdout}));let V=B.manifest[v].get(T.identHash);if(typeof V>\"u\")throw new Error(\"Assertion failed: This descriptor should have a matching entry\");if(V.descriptorHash!==T.descriptorHash)B.manifest[v].set(T.identHash,T),p.push([B,v,V,T]);else{let W=t.makeResolver(),_={project:i,resolver:W},A=W.bindDescriptor(V,B.anchoredLocator,_);i.forgetResolution(A)}}return await t.triggerMultipleHooks(B=>B.afterWorkspaceDependencyReplacement,p),h&&this.context.stdout.write(`\n`),(await Ge.start({configuration:t,stdout:this.context.stdout},async B=>{await i.install({cache:s,report:B,mode:this.mode})})).exitCode()}};El.paths=[[\"up\"]],El.usage=ve.Usage({description:\"upgrade dependencies across the project\",details:\"\\n      This command upgrades the packages matching the list of specified patterns to their latest available version across the whole project (regardless of whether they're part of `dependencies` or `devDependencies` - `peerDependencies` won't be affected). This is a project-wide command: all workspaces will be upgraded in the process.\\n\\n      If `-R,--recursive` is set the command will change behavior and no other switch will be allowed. When operating under this mode `yarn up` will force all ranges matching the selected packages to be resolved again (often to the highest available versions) before being stored in the lockfile. It however won't touch your manifests anymore, so depending on your needs you might want to run both `yarn up` and `yarn up -R` to cover all bases.\\n\\n      If `-i,--interactive` is set (or if the `preferInteractive` settings is toggled on) the command will offer various choices, depending on the detected upgrade paths. Some upgrades require this flag in order to resolve ambiguities.\\n\\n      The, `-C,--caret`, `-E,--exact` and  `-T,--tilde` options have the same meaning as in the `add` command (they change the modifier used when the range is missing or a tag, and are ignored when the range is explicitly set).\\n\\n      If the `--mode=<mode>` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\\n\\n      - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\\n\\n      - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\\n\\n      Generally you can see `yarn up` as a counterpart to what was `yarn upgrade --latest` in Yarn 1 (ie it ignores the ranges previously listed in your manifests), but unlike `yarn upgrade` which only upgraded dependencies in the current workspace, `yarn up` will upgrade all workspaces at the same time.\\n\\n      This command accepts glob patterns as arguments (if valid Descriptors and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\\n\\n      **Note:** The ranges have to be static, only the package scopes and names can contain glob patterns.\\n    \",examples:[[\"Upgrade all instances of lodash to the latest release\",\"$0 up lodash\"],[\"Upgrade all instances of lodash to the latest release, but ask confirmation for each\",\"$0 up lodash -i\"],[\"Upgrade all instances of lodash to 1.2.3\",\"$0 up lodash@1.2.3\"],[\"Upgrade all instances of packages with the `@babel` scope to the latest release\",\"$0 up '@babel/*'\"],[\"Upgrade all instances of packages containing the word `jest` to the latest release\",\"$0 up '*jest*'\"],[\"Upgrade all instances of packages with the `@babel` scope to 7.0.0\",\"$0 up '@babel/*@7.0.0'\"]]}),El.schema=[av(\"recursive\",lc.Forbids,[\"interactive\",\"exact\",\"tilde\",\"caret\"],{ignore:[void 0,!1]})];var Lu=class extends De{constructor(){super(...arguments);this.recursive=z.Boolean(\"-R,--recursive\",!1,{description:\"List, for each workspace, what are all the paths that lead to the dependency\"});this.json=z.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.peers=z.Boolean(\"--peers\",!1,{description:\"Also print the peer dependencies that match the specified name\"});this.package=z.String()}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,workspace:n}=await je.find(t,this.context.cwd);if(!n)throw new ct(i.cwd,this.context.cwd);await i.restoreInstallState();let s=P.parseIdent(this.package).identHash,o=this.recursive?G4e(i,s,{configuration:t,peers:this.peers}):H4e(i,s,{configuration:t,peers:this.peers});es.emitTree(o,{configuration:t,stdout:this.context.stdout,json:this.json,separators:1})}};Lu.paths=[[\"why\"]],Lu.usage=ve.Usage({description:\"display the reason why a package is needed\",details:`\n      This command prints the exact reasons why a package appears in the dependency tree.\n\n      If \\`-R,--recursive\\` is set, the listing will go in depth and will list, for each workspaces, what are all the paths that lead to the dependency. Note that the display is somewhat optimized in that it will not print the package listing twice for a single package, so if you see a leaf named \"Foo\" when looking for \"Bar\", it means that \"Foo\" already got printed higher in the tree.\n    `,examples:[[\"Explain why lodash is used in your project\",\"$0 why lodash\"]]});function H4e(r,e,{configuration:t,peers:i}){let n=Ie.sortMap(r.storedPackages.values(),a=>P.stringifyLocator(a)),s={},o={children:s};for(let a of n){let l={};for(let u of a.dependencies.values()){if(!i&&a.peerDependencies.has(u.identHash))continue;let g=r.storedResolutions.get(u.descriptorHash);if(!g)throw new Error(\"Assertion failed: The resolution should have been registered\");let f=r.storedPackages.get(g);if(!f)throw new Error(\"Assertion failed: The package should have been registered\");if(f.identHash!==e)continue;{let p=P.stringifyLocator(a);s[p]={value:[a,ee.Type.LOCATOR],children:l}}let h=P.stringifyLocator(f);l[h]={value:[{descriptor:u,locator:f},ee.Type.DEPENDENT]}}}return o}function G4e(r,e,{configuration:t,peers:i}){let n=Ie.sortMap(r.workspaces,f=>P.stringifyLocator(f.anchoredLocator)),s=new Set,o=new Set,a=f=>{if(s.has(f.locatorHash))return o.has(f.locatorHash);if(s.add(f.locatorHash),f.identHash===e)return o.add(f.locatorHash),!0;let h=!1;f.identHash===e&&(h=!0);for(let p of f.dependencies.values()){if(!i&&f.peerDependencies.has(p.identHash))continue;let C=r.storedResolutions.get(p.descriptorHash);if(!C)throw new Error(\"Assertion failed: The resolution should have been registered\");let y=r.storedPackages.get(C);if(!y)throw new Error(\"Assertion failed: The package should have been registered\");a(y)&&(h=!0)}return h&&o.add(f.locatorHash),h};for(let f of n){let h=r.storedPackages.get(f.anchoredLocator.locatorHash);if(!h)throw new Error(\"Assertion failed: The package should have been registered\");a(h)}let l=new Set,c={},u={children:c},g=(f,h,p)=>{if(!o.has(f.locatorHash))return;let C=p!==null?ee.tuple(ee.Type.DEPENDENT,{locator:f,descriptor:p}):ee.tuple(ee.Type.LOCATOR,f),y={},B={value:C,children:y},v=P.stringifyLocator(f);if(h[v]=B,!l.has(f.locatorHash)&&(l.add(f.locatorHash),!(p!==null&&r.tryWorkspaceByLocator(f))))for(let D of f.dependencies.values()){if(!i&&f.peerDependencies.has(D.identHash))continue;let T=r.storedResolutions.get(D.descriptorHash);if(!T)throw new Error(\"Assertion failed: The resolution should have been registered\");let H=r.storedPackages.get(T);if(!H)throw new Error(\"Assertion failed: The package should have been registered\");g(H,y,D)}};for(let f of n){let h=r.storedPackages.get(f.anchoredLocator.locatorHash);if(!h)throw new Error(\"Assertion failed: The package should have been registered\");g(h,c,null)}return u}var hO={};ut(hO,{default:()=>AWe,gitUtils:()=>lA});var lA={};ut(lA,{TreeishProtocols:()=>LQ,clone:()=>fO,fetchBase:()=>Yae,fetchChangedFiles:()=>jae,fetchChangedWorkspaces:()=>oWe,fetchRoot:()=>Gae,isGitUrl:()=>ep,lsRemote:()=>Hae,normalizeLocator:()=>uO,normalizeRepoUrl:()=>Vm,resolveUrl:()=>gO,splitRepoUrl:()=>zm});var cO=Pe(Tae()),Kae=Pe(PB()),$h=Pe(J(\"querystring\")),AO=Pe(Xr());var Oae=J(\"url\");function aO(r,e,t){let i=r.indexOf(t);return r.lastIndexOf(e,i>-1?i:1/0)}function Lae(r){try{return new Oae.URL(r)}catch{return}}function nWe(r){let e=aO(r,\"@\",\"#\"),t=aO(r,\":\",\"#\");return t>e&&(r=`${r.slice(0,t)}/${r.slice(t+1)}`),aO(r,\":\",\"#\")===-1&&r.indexOf(\"//\")===-1&&(r=`ssh://${r}`),r}function Mae(r){return Lae(r)||Lae(nWe(r))}function Uae(){return{...process.env,GIT_SSH_COMMAND:process.env.GIT_SSH_COMMAND||`${process.env.GIT_SSH||\"ssh\"} -o BatchMode=yes`}}var sWe=[/^ssh:/,/^git(?:\\+[^:]+)?:/,/^(?:git\\+)?https?:[^#]+\\/[^#]+(?:\\.git)(?:#.*)?$/,/^git@[^#]+\\/[^#]+\\.git(?:#.*)?$/,/^(?:github:|https:\\/\\/github\\.com\\/)?(?!\\.{1,2}\\/)([a-zA-Z._0-9-]+)\\/(?!\\.{1,2}(?:#|$))([a-zA-Z._0-9-]+?)(?:\\.git)?(?:#.*)?$/,/^https:\\/\\/github\\.com\\/(?!\\.{1,2}\\/)([a-zA-Z0-9._-]+)\\/(?!\\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)\\/tarball\\/(.+)?$/],LQ=(n=>(n.Commit=\"commit\",n.Head=\"head\",n.Tag=\"tag\",n.Semver=\"semver\",n))(LQ||{});function ep(r){return r?sWe.some(e=>!!r.match(e)):!1}function zm(r){r=Vm(r);let e=r.indexOf(\"#\");if(e===-1)return{repo:r,treeish:{protocol:\"head\",request:\"HEAD\"},extra:{}};let t=r.slice(0,e),i=r.slice(e+1);if(i.match(/^[a-z]+=/)){let n=$h.default.parse(i);for(let[l,c]of Object.entries(n))if(typeof c!=\"string\")throw new Error(`Assertion failed: The ${l} parameter must be a literal string`);let s=Object.values(LQ).find(l=>Object.prototype.hasOwnProperty.call(n,l)),o,a;typeof s<\"u\"?(o=s,a=n[s]):(o=\"head\",a=\"HEAD\");for(let l of Object.values(LQ))delete n[l];return{repo:t,treeish:{protocol:o,request:a},extra:n}}else{let n=i.indexOf(\":\"),s,o;return n===-1?(s=null,o=i):(s=i.slice(0,n),o=i.slice(n+1)),{repo:t,treeish:{protocol:s,request:o},extra:{}}}}function Vm(r,{git:e=!1}={}){if(r=r.replace(/^git\\+https:/,\"https:\"),r=r.replace(/^(?:github:|https:\\/\\/github\\.com\\/|git:\\/\\/github\\.com\\/)?(?!\\.{1,2}\\/)([a-zA-Z0-9._-]+)\\/(?!\\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)(?:\\.git)?(#.*)?$/,\"https://github.com/$1/$2.git$3\"),r=r.replace(/^https:\\/\\/github\\.com\\/(?!\\.{1,2}\\/)([a-zA-Z0-9._-]+)\\/(?!\\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)\\/tarball\\/(.+)?$/,\"https://github.com/$1/$2.git#$3\"),e){let t=Mae(r);t&&(r=t.href),r=r.replace(/^git\\+([^:]+):/,\"$1:\")}return r}function uO(r){return P.makeLocator(r,Vm(r.reference))}async function Hae(r,e){let t=Vm(r,{git:!0});if(!Xt.getNetworkSettings(`https://${(0,cO.default)(t).resource}`,{configuration:e}).enableNetwork)throw new Error(`Request to '${t}' has been blocked because of your configuration settings`);let n=await lO(\"listing refs\",[\"ls-remote\",t],{cwd:e.startingCwd,env:Uae()},{configuration:e,normalizedRepoUrl:t}),s=new Map,o=/^([a-f0-9]{40})\\t([^\\n]+)/gm,a;for(;(a=o.exec(n.stdout))!==null;)s.set(a[2],a[1]);return s}async function gO(r,e){let{repo:t,treeish:{protocol:i,request:n},extra:s}=zm(r),o=await Hae(t,e),a=(c,u)=>{switch(c){case\"commit\":{if(!u.match(/^[a-f0-9]{40}$/))throw new Error(\"Invalid commit hash\");return $h.default.stringify({...s,commit:u})}case\"head\":{let g=o.get(u===\"HEAD\"?u:`refs/heads/${u}`);if(typeof g>\"u\")throw new Error(`Unknown head (\"${u}\")`);return $h.default.stringify({...s,commit:g})}case\"tag\":{let g=o.get(`refs/tags/${u}`);if(typeof g>\"u\")throw new Error(`Unknown tag (\"${u}\")`);return $h.default.stringify({...s,commit:g})}case\"semver\":{let g=vt.validRange(u);if(!g)throw new Error(`Invalid range (\"${u}\")`);let f=new Map([...o.entries()].filter(([p])=>p.startsWith(\"refs/tags/\")).map(([p,C])=>[AO.default.parse(p.slice(10)),C]).filter(p=>p[0]!==null)),h=AO.default.maxSatisfying([...f.keys()],g);if(h===null)throw new Error(`No matching range (\"${u}\")`);return $h.default.stringify({...s,commit:f.get(h)})}case null:{let g;if((g=l(\"commit\",u))!==null||(g=l(\"tag\",u))!==null||(g=l(\"head\",u))!==null)return g;throw u.match(/^[a-f0-9]+$/)?new Error(`Couldn't resolve \"${u}\" as either a commit, a tag, or a head - if a commit, use the 40-characters commit hash`):new Error(`Couldn't resolve \"${u}\" as either a commit, a tag, or a head`)}default:throw new Error(`Invalid Git resolution protocol (\"${c}\")`)}},l=(c,u)=>{try{return a(c,u)}catch{return null}};return`${t}#${a(i,n)}`}async function fO(r,e){return await e.getLimit(\"cloneConcurrency\")(async()=>{let{repo:t,treeish:{protocol:i,request:n}}=zm(r);if(i!==\"commit\")throw new Error(\"Invalid treeish protocol when cloning\");let s=Vm(t,{git:!0});if(Xt.getNetworkSettings(`https://${(0,cO.default)(s).resource}`,{configuration:e}).enableNetwork===!1)throw new Error(`Request to '${s}' has been blocked because of your configuration settings`);let o=await M.mktempPromise(),a={cwd:o,env:Uae()};return await lO(\"cloning the repository\",[\"clone\",\"-c core.autocrlf=false\",s,K.fromPortablePath(o)],a,{configuration:e,normalizedRepoUrl:s}),await lO(\"switching branch\",[\"checkout\",`${n}`],a,{configuration:e,normalizedRepoUrl:s}),o})}async function Gae(r){let e=null,t,i=r;do t=i,await M.existsPromise(x.join(t,\".git\"))&&(e=t),i=x.dirname(t);while(e===null&&i!==t);return e}async function Yae(r,{baseRefs:e}){if(e.length===0)throw new be(\"Can't run this command with zero base refs specified.\");let t=[];for(let a of e){let{code:l}=await Cr.execvp(\"git\",[\"merge-base\",a,\"HEAD\"],{cwd:r});l===0&&t.push(a)}if(t.length===0)throw new be(`No ancestor could be found between any of HEAD and ${e.join(\", \")}`);let{stdout:i}=await Cr.execvp(\"git\",[\"merge-base\",\"HEAD\",...t],{cwd:r,strict:!0}),n=i.trim(),{stdout:s}=await Cr.execvp(\"git\",[\"show\",\"--quiet\",\"--pretty=format:%s\",n],{cwd:r,strict:!0}),o=s.trim();return{hash:n,title:o}}async function jae(r,{base:e,project:t}){let i=Ie.buildIgnorePattern(t.configuration.get(\"changesetIgnorePatterns\")),{stdout:n}=await Cr.execvp(\"git\",[\"diff\",\"--name-only\",`${e}`],{cwd:r,strict:!0}),s=n.split(/\\r\\n|\\r|\\n/).filter(c=>c.length>0).map(c=>x.resolve(r,K.toPortablePath(c))),{stdout:o}=await Cr.execvp(\"git\",[\"ls-files\",\"--others\",\"--exclude-standard\"],{cwd:r,strict:!0}),a=o.split(/\\r\\n|\\r|\\n/).filter(c=>c.length>0).map(c=>x.resolve(r,K.toPortablePath(c))),l=[...new Set([...s,...a].sort())];return i?l.filter(c=>!x.relative(t.cwd,c).match(i)):l}async function oWe({ref:r,project:e}){if(e.configuration.projectCwd===null)throw new be(\"This command can only be run from within a Yarn project\");let t=[x.resolve(e.cwd,e.configuration.get(\"cacheFolder\")),x.resolve(e.cwd,e.configuration.get(\"installStatePath\")),x.resolve(e.cwd,e.configuration.get(\"lockfileFilename\")),x.resolve(e.cwd,e.configuration.get(\"virtualFolder\"))];await e.configuration.triggerHook(o=>o.populateYarnPaths,e,o=>{o!=null&&t.push(o)});let i=await Gae(e.configuration.projectCwd);if(i==null)throw new be(\"This command can only be run on Git repositories\");let n=await Yae(i,{baseRefs:typeof r==\"string\"?[r]:e.configuration.get(\"changesetBaseRefs\")}),s=await jae(i,{base:n.hash,project:e});return new Set(Ie.mapAndFilter(s,o=>{let a=e.tryWorkspaceByFilePath(o);return a===null?Ie.mapAndFilter.skip:t.some(l=>o.startsWith(l))?Ie.mapAndFilter.skip:a}))}async function lO(r,e,t,{configuration:i,normalizedRepoUrl:n}){try{return await Cr.execvp(\"git\",e,{...t,strict:!0})}catch(s){if(!(s instanceof Cr.ExecError))throw s;let o=s.reportExtra,a=s.stderr.toString();throw new at(1,`Failed ${r}`,l=>{l.reportError(1,`  ${ee.prettyField(i,{label:\"Repository URL\",value:ee.tuple(ee.Type.URL,n)})}`);for(let c of a.matchAll(/^(.+?): (.*)$/gm)){let[,u,g]=c;u=u.toLowerCase();let f=u===\"error\"?\"Error\":`${(0,Kae.default)(u)} Error`;l.reportError(1,`  ${ee.prettyField(i,{label:f,value:ee.tuple(ee.Type.NO_HINT,g)})}`)}o==null||o(l)})}}var OQ=class{supports(e,t){return ep(e.reference)}getLocalPath(e,t){return null}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,n=uO(e),s=new Map(t.checksums);s.set(n.locatorHash,i);let o={...t,checksums:s},a=await this.downloadHosted(n,o);if(a!==null)return a;let[l,c,u]=await t.cache.fetchPackageFromCache(e,i,{onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from the remote repository`),loader:()=>this.cloneFromRemote(n,o),skipIntegrityCheck:t.skipIntegrityCheck,...t.cacheOptions});return{packageFs:l,releaseFs:c,prefixPath:P.getIdentVendorPath(e),checksum:u}}async downloadHosted(e,t){return t.project.configuration.reduceHook(i=>i.fetchHostedRepository,null,e,t)}async cloneFromRemote(e,t){let i=await fO(e.reference,t.project.configuration),n=zm(e.reference),s=x.join(i,\"package.tgz\");await Wt.prepareExternalProject(i,s,{configuration:t.project.configuration,report:t.report,workspace:n.extra.workspace,locator:e});let o=await M.readFilePromise(s);return await Ie.releaseAfterUseAsync(async()=>await mi.convertToZip(o,{compressionLevel:t.project.configuration.get(\"compressionLevel\"),prefixPath:P.getIdentVendorPath(e),stripComponents:1}))}};var MQ=class{supportsDescriptor(e,t){return ep(e.range)}supportsLocator(e,t){return ep(e.reference)}shouldPersistResolution(e,t){return!0}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){let n=await gO(e.range,i.project.configuration);return[P.makeLocator(e,n)]}async getSatisfying(e,t,i){return null}async resolve(e,t){if(!t.fetchOptions)throw new Error(\"Assertion failed: This resolver cannot be used unless a fetcher is configured\");let i=await t.fetchOptions.fetcher.fetch(e,t.fetchOptions),n=await Ie.releaseAfterUseAsync(async()=>await ot.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return{...e,version:n.version||\"0.0.0\",languageName:n.languageName||t.project.configuration.get(\"defaultLanguageName\"),linkType:\"HARD\",conditions:n.getConditions(),dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin}}};var aWe={configuration:{changesetBaseRefs:{description:\"The base git refs that the current HEAD is compared against when detecting changes. Supports git branches, tags, and commits.\",type:\"STRING\",isArray:!0,isNullable:!1,default:[\"master\",\"origin/master\",\"upstream/master\",\"main\",\"origin/main\",\"upstream/main\"]},changesetIgnorePatterns:{description:\"Array of glob patterns; files matching them will be ignored when fetching the changed files\",type:\"STRING\",default:[],isArray:!0},cloneConcurrency:{description:\"Maximal number of concurrent clones\",type:\"NUMBER\",default:2}},fetchers:[OQ],resolvers:[MQ]};var AWe=aWe;var Ou=class extends De{constructor(){super(...arguments);this.since=z.String(\"--since\",{description:\"Only include workspaces that have been changed since the specified ref.\",tolerateBoolean:!0});this.recursive=z.Boolean(\"-R,--recursive\",!1,{description:\"Find packages via dependencies/devDependencies instead of using the workspaces field\"});this.noPrivate=z.Boolean(\"--no-private\",{description:\"Exclude workspaces that have the private field set to true\"});this.verbose=z.Boolean(\"-v,--verbose\",!1,{description:\"Also return the cross-dependencies between workspaces\"});this.json=z.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"})}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i}=await je.find(t,this.context.cwd);return(await Ge.start({configuration:t,json:this.json,stdout:this.context.stdout},async s=>{let o=this.since?await lA.fetchChangedWorkspaces({ref:this.since,project:i}):i.workspaces,a=new Set(o);if(this.recursive)for(let l of[...o].map(c=>c.getRecursiveWorkspaceDependents()))for(let c of l)a.add(c);for(let l of a){let{manifest:c}=l;if(c.private&&this.noPrivate)continue;let u;if(this.verbose){let g=new Set,f=new Set;for(let h of ot.hardDependencies)for(let[p,C]of c.getForScope(h)){let y=i.tryWorkspaceByDescriptor(C);y===null?i.workspacesByIdent.has(p)&&f.add(C):g.add(y)}u={workspaceDependencies:Array.from(g).map(h=>h.relativeCwd),mismatchedWorkspaceDependencies:Array.from(f).map(h=>P.stringifyDescriptor(h))}}s.reportInfo(null,`${l.relativeCwd}`),s.reportJson({location:l.relativeCwd,name:c.name?P.stringifyIdent(c.name):null,...u})}})).exitCode()}};Ou.paths=[[\"workspaces\",\"list\"]],Ou.usage=ve.Usage({category:\"Workspace-related commands\",description:\"list all available workspaces\",details:\"\\n      This command will print the list of all workspaces in the project.\\n\\n      - If `--since` is set, Yarn will only list workspaces that have been modified since the specified ref. By default Yarn will use the refs specified by the `changesetBaseRefs` configuration option.\\n\\n      - If `-R,--recursive` is set, Yarn will find workspaces to run the command on by recursively evaluating `dependencies` and `devDependencies` fields, instead of looking at the `workspaces` fields.\\n\\n      - If `--no-private` is set, Yarn will not list any workspaces that have the `private` field set to `true`.\\n\\n      - If both the `-v,--verbose` and `--json` options are set, Yarn will also return the cross-dependencies between each workspaces (useful when you wish to automatically generate Buck / Bazel rules).\\n    \"});var Mu=class extends De{constructor(){super(...arguments);this.workspaceName=z.String();this.commandName=z.String();this.args=z.Proxy()}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,workspace:n}=await je.find(t,this.context.cwd);if(!n)throw new ct(i.cwd,this.context.cwd);let s=i.workspaces,o=new Map(s.map(l=>[P.stringifyIdent(l.locator),l])),a=o.get(this.workspaceName);if(a===void 0){let l=Array.from(o.keys()).sort();throw new be(`Workspace '${this.workspaceName}' not found. Did you mean any of the following:\n  - ${l.join(`\n  - `)}?`)}return this.cli.run([this.commandName,...this.args],{cwd:a.cwd})}};Mu.paths=[[\"workspace\"]],Mu.usage=ve.Usage({category:\"Workspace-related commands\",description:\"run a command within the specified workspace\",details:`\n      This command will run a given sub-command on a single workspace.\n    `,examples:[[\"Add a package to a single workspace\",\"yarn workspace components add -D react\"],[\"Run build script on a single workspace\",\"yarn workspace components run build\"]]});var lWe={configuration:{enableImmutableInstalls:{description:\"If true (the default on CI), prevents the install command from modifying the lockfile\",type:\"BOOLEAN\",default:qae.isCI},defaultSemverRangePrefix:{description:\"The default save prefix: '^', '~' or ''\",type:\"STRING\",values:[\"^\",\"~\",\"\"],default:\"^\"}},commands:[cu,uu,gu,fu,Nu,Su,mu,Ou,Vh,Xh,qm,Zh,Au,lu,hu,pu,du,Cu,Eu,Iu,yu,wu,Tu,Bu,xu,vu,Pu,Qu,Du,ku,Ru,_h,Fu,El,Lu,Mu]},cWe=lWe;var IO={};ut(IO,{default:()=>gWe});var Te={optional:!0},dO=[[\"@tailwindcss/aspect-ratio@<0.2.1\",{peerDependencies:{tailwindcss:\"^2.0.2\"}}],[\"@tailwindcss/line-clamp@<0.2.1\",{peerDependencies:{tailwindcss:\"^2.0.2\"}}],[\"@fullhuman/postcss-purgecss@3.1.3 || 3.1.3-alpha.0\",{peerDependencies:{postcss:\"^8.0.0\"}}],[\"@samverschueren/stream-to-observable@<0.3.1\",{peerDependenciesMeta:{rxjs:Te,zenObservable:Te}}],[\"any-observable@<0.5.1\",{peerDependenciesMeta:{rxjs:Te,zenObservable:Te}}],[\"@pm2/agent@<1.0.4\",{dependencies:{debug:\"*\"}}],[\"debug@<4.2.0\",{peerDependenciesMeta:{[\"supports-color\"]:Te}}],[\"got@<11\",{dependencies:{[\"@types/responselike\"]:\"^1.0.0\",[\"@types/keyv\"]:\"^3.1.1\"}}],[\"cacheable-lookup@<4.1.2\",{dependencies:{[\"@types/keyv\"]:\"^3.1.1\"}}],[\"http-link-dataloader@*\",{peerDependencies:{graphql:\"^0.13.1 || ^14.0.0\"}}],[\"typescript-language-server@*\",{dependencies:{[\"vscode-jsonrpc\"]:\"^5.0.1\",[\"vscode-languageserver-protocol\"]:\"^3.15.0\"}}],[\"postcss-syntax@*\",{peerDependenciesMeta:{[\"postcss-html\"]:Te,[\"postcss-jsx\"]:Te,[\"postcss-less\"]:Te,[\"postcss-markdown\"]:Te,[\"postcss-scss\"]:Te}}],[\"jss-plugin-rule-value-function@<=10.1.1\",{dependencies:{[\"tiny-warning\"]:\"^1.0.2\"}}],[\"ink-select-input@<4.1.0\",{peerDependencies:{react:\"^16.8.2\"}}],[\"license-webpack-plugin@<2.3.18\",{peerDependenciesMeta:{webpack:Te}}],[\"snowpack@>=3.3.0\",{dependencies:{[\"node-gyp\"]:\"^7.1.0\"}}],[\"promise-inflight@*\",{peerDependenciesMeta:{bluebird:Te}}],[\"reactcss@*\",{peerDependencies:{react:\"*\"}}],[\"react-color@<=2.19.0\",{peerDependencies:{react:\"*\"}}],[\"gatsby-plugin-i18n@*\",{dependencies:{ramda:\"^0.24.1\"}}],[\"useragent@^2.0.0\",{dependencies:{request:\"^2.88.0\",yamlparser:\"0.0.x\",semver:\"5.5.x\"}}],[\"@apollographql/apollo-tools@<=0.5.2\",{peerDependencies:{graphql:\"^14.2.1 || ^15.0.0\"}}],[\"material-table@^2.0.0\",{dependencies:{\"@babel/runtime\":\"^7.11.2\"}}],[\"@babel/parser@*\",{dependencies:{\"@babel/types\":\"^7.8.3\"}}],[\"fork-ts-checker-webpack-plugin@<=6.3.4\",{peerDependencies:{eslint:\">= 6\",typescript:\">= 2.7\",webpack:\">= 4\",\"vue-template-compiler\":\"*\"},peerDependenciesMeta:{eslint:Te,\"vue-template-compiler\":Te}}],[\"rc-animate@<=3.1.1\",{peerDependencies:{react:\">=16.9.0\",\"react-dom\":\">=16.9.0\"}}],[\"react-bootstrap-table2-paginator@*\",{dependencies:{classnames:\"^2.2.6\"}}],[\"react-draggable@<=4.4.3\",{peerDependencies:{react:\">= 16.3.0\",\"react-dom\":\">= 16.3.0\"}}],[\"apollo-upload-client@<14\",{peerDependencies:{graphql:\"14 - 15\"}}],[\"react-instantsearch-core@<=6.7.0\",{peerDependencies:{algoliasearch:\">= 3.1 < 5\"}}],[\"react-instantsearch-dom@<=6.7.0\",{dependencies:{\"react-fast-compare\":\"^3.0.0\"}}],[\"ws@<7.2.1\",{peerDependencies:{bufferutil:\"^4.0.1\",\"utf-8-validate\":\"^5.0.2\"},peerDependenciesMeta:{bufferutil:Te,\"utf-8-validate\":Te}}],[\"react-portal@<4.2.2\",{peerDependencies:{\"react-dom\":\"^15.0.0-0 || ^16.0.0-0 || ^17.0.0-0\"}}],[\"react-scripts@<=4.0.1\",{peerDependencies:{react:\"*\"}}],[\"testcafe@<=1.10.1\",{dependencies:{\"@babel/plugin-transform-for-of\":\"^7.12.1\",\"@babel/runtime\":\"^7.12.5\"}}],[\"testcafe-legacy-api@<=4.2.0\",{dependencies:{\"testcafe-hammerhead\":\"^17.0.1\",\"read-file-relative\":\"^1.2.0\"}}],[\"@google-cloud/firestore@<=4.9.3\",{dependencies:{protobufjs:\"^6.8.6\"}}],[\"gatsby-source-apiserver@*\",{dependencies:{[\"babel-polyfill\"]:\"^6.26.0\"}}],[\"@webpack-cli/package-utils@<=1.0.1-alpha.4\",{dependencies:{[\"cross-spawn\"]:\"^7.0.3\"}}],[\"gatsby-remark-prismjs@<3.3.28\",{dependencies:{lodash:\"^4\"}}],[\"gatsby-plugin-favicon@*\",{peerDependencies:{webpack:\"*\"}}],[\"gatsby-plugin-sharp@<=4.6.0-next.3\",{dependencies:{debug:\"^4.3.1\"}}],[\"gatsby-react-router-scroll@<=5.6.0-next.0\",{dependencies:{[\"prop-types\"]:\"^15.7.2\"}}],[\"@rebass/forms@*\",{dependencies:{[\"@styled-system/should-forward-prop\"]:\"^5.0.0\"},peerDependencies:{react:\"^16.8.6\"}}],[\"rebass@*\",{peerDependencies:{react:\"^16.8.6\"}}],[\"@ant-design/react-slick@<=0.28.3\",{peerDependencies:{react:\">=16.0.0\"}}],[\"mqtt@<4.2.7\",{dependencies:{duplexify:\"^4.1.1\"}}],[\"vue-cli-plugin-vuetify@<=2.0.3\",{dependencies:{semver:\"^6.3.0\"},peerDependenciesMeta:{\"sass-loader\":Te,\"vuetify-loader\":Te}}],[\"vue-cli-plugin-vuetify@<=2.0.4\",{dependencies:{\"null-loader\":\"^3.0.0\"}}],[\"vue-cli-plugin-vuetify@>=2.4.3\",{peerDependencies:{vue:\"*\"}}],[\"@vuetify/cli-plugin-utils@<=0.0.4\",{dependencies:{semver:\"^6.3.0\"},peerDependenciesMeta:{\"sass-loader\":Te}}],[\"@vue/cli-plugin-typescript@<=5.0.0-alpha.0\",{dependencies:{\"babel-loader\":\"^8.1.0\"}}],[\"@vue/cli-plugin-typescript@<=5.0.0-beta.0\",{dependencies:{\"@babel/core\":\"^7.12.16\"},peerDependencies:{\"vue-template-compiler\":\"^2.0.0\"},peerDependenciesMeta:{\"vue-template-compiler\":Te}}],[\"cordova-ios@<=6.3.0\",{dependencies:{underscore:\"^1.9.2\"}}],[\"cordova-lib@<=10.0.1\",{dependencies:{underscore:\"^1.9.2\"}}],[\"git-node-fs@*\",{peerDependencies:{\"js-git\":\"^0.7.8\"},peerDependenciesMeta:{\"js-git\":Te}}],[\"consolidate@<0.16.0\",{peerDependencies:{mustache:\"^3.0.0\"},peerDependenciesMeta:{mustache:Te}}],[\"consolidate@<=0.16.0\",{peerDependencies:{velocityjs:\"^2.0.1\",tinyliquid:\"^0.2.34\",\"liquid-node\":\"^3.0.1\",jade:\"^1.11.0\",\"then-jade\":\"*\",dust:\"^0.3.0\",\"dustjs-helpers\":\"^1.7.4\",\"dustjs-linkedin\":\"^2.7.5\",swig:\"^1.4.2\",\"swig-templates\":\"^2.0.3\",\"razor-tmpl\":\"^1.3.1\",atpl:\">=0.7.6\",liquor:\"^0.0.5\",twig:\"^1.15.2\",ejs:\"^3.1.5\",eco:\"^1.1.0-rc-3\",jazz:\"^0.0.18\",jqtpl:\"~1.1.0\",hamljs:\"^0.6.2\",hamlet:\"^0.3.3\",whiskers:\"^0.4.0\",\"haml-coffee\":\"^1.14.1\",\"hogan.js\":\"^3.0.2\",templayed:\">=0.2.3\",handlebars:\"^4.7.6\",underscore:\"^1.11.0\",lodash:\"^4.17.20\",pug:\"^3.0.0\",\"then-pug\":\"*\",qejs:\"^3.0.5\",walrus:\"^0.10.1\",mustache:\"^4.0.1\",just:\"^0.1.8\",ect:\"^0.5.9\",mote:\"^0.2.0\",toffee:\"^0.3.6\",dot:\"^1.1.3\",\"bracket-template\":\"^1.1.5\",ractive:\"^1.3.12\",nunjucks:\"^3.2.2\",htmling:\"^0.0.8\",\"babel-core\":\"^6.26.3\",plates:\"~0.4.11\",\"react-dom\":\"^16.13.1\",react:\"^16.13.1\",\"arc-templates\":\"^0.5.3\",vash:\"^0.13.0\",slm:\"^2.0.0\",marko:\"^3.14.4\",teacup:\"^2.0.0\",\"coffee-script\":\"^1.12.7\",squirrelly:\"^5.1.0\",twing:\"^5.0.2\"},peerDependenciesMeta:{velocityjs:Te,tinyliquid:Te,\"liquid-node\":Te,jade:Te,\"then-jade\":Te,dust:Te,\"dustjs-helpers\":Te,\"dustjs-linkedin\":Te,swig:Te,\"swig-templates\":Te,\"razor-tmpl\":Te,atpl:Te,liquor:Te,twig:Te,ejs:Te,eco:Te,jazz:Te,jqtpl:Te,hamljs:Te,hamlet:Te,whiskers:Te,\"haml-coffee\":Te,\"hogan.js\":Te,templayed:Te,handlebars:Te,underscore:Te,lodash:Te,pug:Te,\"then-pug\":Te,qejs:Te,walrus:Te,mustache:Te,just:Te,ect:Te,mote:Te,toffee:Te,dot:Te,\"bracket-template\":Te,ractive:Te,nunjucks:Te,htmling:Te,\"babel-core\":Te,plates:Te,\"react-dom\":Te,react:Te,\"arc-templates\":Te,vash:Te,slm:Te,marko:Te,teacup:Te,\"coffee-script\":Te,squirrelly:Te,twing:Te}}],[\"vue-loader@<=16.3.3\",{peerDependencies:{\"@vue/compiler-sfc\":\"^3.0.8\",webpack:\"^4.1.0 || ^5.0.0-0\"},peerDependenciesMeta:{\"@vue/compiler-sfc\":Te}}],[\"vue-loader@^16.7.0\",{peerDependencies:{\"@vue/compiler-sfc\":\"^3.0.8\",vue:\"^3.2.13\"},peerDependenciesMeta:{\"@vue/compiler-sfc\":Te,vue:Te}}],[\"scss-parser@<=1.0.5\",{dependencies:{lodash:\"^4.17.21\"}}],[\"query-ast@<1.0.5\",{dependencies:{lodash:\"^4.17.21\"}}],[\"redux-thunk@<=2.3.0\",{peerDependencies:{redux:\"^4.0.0\"}}],[\"skypack@<=0.3.2\",{dependencies:{tar:\"^6.1.0\"}}],[\"@npmcli/metavuln-calculator@<2.0.0\",{dependencies:{\"json-parse-even-better-errors\":\"^2.3.1\"}}],[\"bin-links@<2.3.0\",{dependencies:{\"mkdirp-infer-owner\":\"^1.0.2\"}}],[\"rollup-plugin-polyfill-node@<=0.8.0\",{peerDependencies:{rollup:\"^1.20.0 || ^2.0.0\"}}],[\"snowpack@<3.8.6\",{dependencies:{\"magic-string\":\"^0.25.7\"}}],[\"elm-webpack-loader@*\",{dependencies:{temp:\"^0.9.4\"}}],[\"winston-transport@<=4.4.0\",{dependencies:{logform:\"^2.2.0\"}}],[\"jest-vue-preprocessor@*\",{dependencies:{\"@babel/core\":\"7.8.7\",\"@babel/template\":\"7.8.6\"},peerDependencies:{pug:\"^2.0.4\"},peerDependenciesMeta:{pug:Te}}],[\"redux-persist@*\",{peerDependencies:{react:\">=16\"},peerDependenciesMeta:{react:Te}}],[\"sodium@>=3\",{dependencies:{\"node-gyp\":\"^3.8.0\"}}],[\"babel-plugin-graphql-tag@<=3.1.0\",{peerDependencies:{graphql:\"^14.0.0 || ^15.0.0\"}}],[\"@playwright/test@<=1.14.1\",{dependencies:{\"jest-matcher-utils\":\"^26.4.2\"}}],...[\"babel-plugin-remove-graphql-queries@<3.14.0-next.1\",\"babel-preset-gatsby-package@<1.14.0-next.1\",\"create-gatsby@<1.14.0-next.1\",\"gatsby-admin@<0.24.0-next.1\",\"gatsby-cli@<3.14.0-next.1\",\"gatsby-core-utils@<2.14.0-next.1\",\"gatsby-design-tokens@<3.14.0-next.1\",\"gatsby-legacy-polyfills@<1.14.0-next.1\",\"gatsby-plugin-benchmark-reporting@<1.14.0-next.1\",\"gatsby-plugin-graphql-config@<0.23.0-next.1\",\"gatsby-plugin-image@<1.14.0-next.1\",\"gatsby-plugin-mdx@<2.14.0-next.1\",\"gatsby-plugin-netlify-cms@<5.14.0-next.1\",\"gatsby-plugin-no-sourcemaps@<3.14.0-next.1\",\"gatsby-plugin-page-creator@<3.14.0-next.1\",\"gatsby-plugin-preact@<5.14.0-next.1\",\"gatsby-plugin-preload-fonts@<2.14.0-next.1\",\"gatsby-plugin-schema-snapshot@<2.14.0-next.1\",\"gatsby-plugin-styletron@<6.14.0-next.1\",\"gatsby-plugin-subfont@<3.14.0-next.1\",\"gatsby-plugin-utils@<1.14.0-next.1\",\"gatsby-recipes@<0.25.0-next.1\",\"gatsby-source-shopify@<5.6.0-next.1\",\"gatsby-source-wikipedia@<3.14.0-next.1\",\"gatsby-transformer-screenshot@<3.14.0-next.1\",\"gatsby-worker@<0.5.0-next.1\"].map(r=>[r,{dependencies:{\"@babel/runtime\":\"^7.14.8\"}}]),[\"gatsby-core-utils@<2.14.0-next.1\",{dependencies:{got:\"8.3.2\"}}],[\"gatsby-plugin-gatsby-cloud@<=3.1.0-next.0\",{dependencies:{\"gatsby-core-utils\":\"^2.13.0-next.0\"}}],[\"gatsby-plugin-gatsby-cloud@<=3.2.0-next.1\",{peerDependencies:{webpack:\"*\"}}],[\"babel-plugin-remove-graphql-queries@<=3.14.0-next.1\",{dependencies:{\"gatsby-core-utils\":\"^2.8.0-next.1\"}}],[\"gatsby-plugin-netlify@3.13.0-next.1\",{dependencies:{\"gatsby-core-utils\":\"^2.13.0-next.0\"}}],[\"clipanion-v3-codemod@<=0.2.0\",{peerDependencies:{jscodeshift:\"^0.11.0\"}}],[\"react-live@*\",{peerDependencies:{\"react-dom\":\"*\",react:\"*\"}}],[\"webpack@<4.44.1\",{peerDependenciesMeta:{\"webpack-cli\":Te,\"webpack-command\":Te}}],[\"webpack@<5.0.0-beta.23\",{peerDependenciesMeta:{\"webpack-cli\":Te}}],[\"webpack-dev-server@<3.10.2\",{peerDependenciesMeta:{\"webpack-cli\":Te}}],[\"@docusaurus/responsive-loader@<1.5.0\",{peerDependenciesMeta:{sharp:Te,jimp:Te}}],[\"eslint-module-utils@*\",{peerDependenciesMeta:{\"eslint-import-resolver-node\":Te,\"eslint-import-resolver-typescript\":Te,\"eslint-import-resolver-webpack\":Te,\"@typescript-eslint/parser\":Te}}],[\"eslint-plugin-import@*\",{peerDependenciesMeta:{\"@typescript-eslint/parser\":Te}}],[\"critters-webpack-plugin@<3.0.2\",{peerDependenciesMeta:{\"html-webpack-plugin\":Te}}],[\"terser@<=5.10.0\",{dependencies:{acorn:\"^8.5.0\"}}],[\"babel-preset-react-app@10.0.x\",{dependencies:{\"@babel/plugin-proposal-private-property-in-object\":\"^7.16.0\"}}],[\"eslint-config-react-app@*\",{peerDependenciesMeta:{typescript:Te}}],[\"@vue/eslint-config-typescript@<11.0.0\",{peerDependenciesMeta:{typescript:Te}}],[\"unplugin-vue2-script-setup@<0.9.1\",{peerDependencies:{\"@vue/composition-api\":\"^1.4.3\",\"@vue/runtime-dom\":\"^3.2.26\"}}],[\"@cypress/snapshot@*\",{dependencies:{debug:\"^3.2.7\"}}],[\"auto-relay@<=0.14.0\",{peerDependencies:{\"reflect-metadata\":\"^0.1.13\"}}],[\"vue-template-babel-compiler@<1.2.0\",{peerDependencies:{[\"vue-template-compiler\"]:\"^2.6.0\"}}],[\"@parcel/transformer-image@<2.5.0\",{peerDependencies:{[\"@parcel/core\"]:\"*\"}}],[\"@parcel/transformer-js@<2.5.0\",{peerDependencies:{[\"@parcel/core\"]:\"*\"}}],[\"parcel@*\",{peerDependenciesMeta:{[\"@parcel/core\"]:Te}}],[\"react-scripts@*\",{peerDependencies:{eslint:\"*\"}}],[\"focus-trap-react@^8.0.0\",{dependencies:{tabbable:\"^5.3.2\"}}],[\"react-rnd@<10.3.7\",{peerDependencies:{react:\">=16.3.0\",\"react-dom\":\">=16.3.0\"}}],[\"connect-mongo@*\",{peerDependencies:{\"express-session\":\"^1.17.1\"}}],[\"vue-i18n@<9\",{peerDependencies:{vue:\"^2\"}}],[\"vue-router@<4\",{peerDependencies:{vue:\"^2\"}}],[\"unified@<10\",{dependencies:{\"@types/unist\":\"^2.0.0\"}}],[\"react-github-btn@<=1.3.0\",{peerDependencies:{react:\">=16.3.0\"}}],[\"react-dev-utils@*\",{peerDependencies:{typescript:\">=2.7\",webpack:\">=4\"},peerDependenciesMeta:{typescript:Te}}],[\"@asyncapi/react-component@<=1.0.0-next.39\",{peerDependencies:{react:\">=16.8.0\",\"react-dom\":\">=16.8.0\"}}],[\"xo@*\",{peerDependencies:{webpack:\">=1.11.0\"},peerDependenciesMeta:{webpack:Te}}],[\"babel-plugin-remove-graphql-queries@<=4.20.0-next.0\",{dependencies:{\"@babel/types\":\"^7.15.4\"}}],[\"gatsby-plugin-page-creator@<=4.20.0-next.1\",{dependencies:{\"fs-extra\":\"^10.1.0\"}}],[\"gatsby-plugin-utils@<=3.14.0-next.1\",{dependencies:{fastq:\"^1.13.0\"},peerDependencies:{graphql:\"^15.0.0\"}}],[\"gatsby-plugin-mdx@<3.1.0-next.1\",{dependencies:{mkdirp:\"^1.0.4\"}}],[\"gatsby-plugin-mdx@^2\",{peerDependencies:{gatsby:\"^3.0.0-next\"}}],[\"fdir@<=5.2.0\",{peerDependencies:{picomatch:\"2.x\"},peerDependenciesMeta:{picomatch:Te}}],[\"babel-plugin-transform-typescript-metadata@<=0.3.2\",{peerDependencies:{\"@babel/core\":\"^7\",\"@babel/traverse\":\"^7\"},peerDependenciesMeta:{\"@babel/traverse\":Te}}],[\"graphql-compose@>=9.0.10\",{peerDependencies:{graphql:\"^14.2.0 || ^15.0.0 || ^16.0.0\"}}]];var CO;function Jae(){return typeof CO>\"u\"&&(CO=J(\"zlib\").brotliDecompressSync(Buffer.from(\"G7weAByFTVk3Vs7UfHhq4yykgEM7pbW7TI43SG2S5tvGrwHBAzdz+s/npQ6tgEvobvxisrPIadkXeUAJotBn5bDZ5kAhcRqsIHe3F75Walet5hNalwgFDtxb0BiDUjiUQkjG0yW2hto9HPgiCkm316d6bC0kST72YN7D7rfkhCE9x4J0XwB0yavalxpUu2t9xszHrmtwalOxT7VslsxWcB1qpqZwERUra4psWhTV8BgwWeizurec82Caf1ABL11YMfbf8FJ9JBceZOkgmvrQPbC9DUldX/yMbmX06UQluCEjSwUoyO+EZPIjofr+/oAZUck2enraRD+oWLlnlYnj8xB+gwSo9lmmks4fXv574qSqcWA6z21uYkzMu3EWj+K23RxeQlLqiE35/rC8GcS4CGkKHKKq+zAIQwD9iRDNfiAqueLLpicFFrNsAI4zeTD/eO9MHcnRa5m8UT+M2+V+AkFST4BlKneiAQRSdST8KEAIyFlULt6wa9EBd0Ds28VmpaxquJdVt+nwdEs5xUskI13OVtFyY0UrQIRAlCuvvWivvlSKQfTO+2Q8OyUR1W5RvetaPz4jD27hdtwHFFA1Ptx6Ee/t2cY2rg2G46M1pNDRf2pWhvpy8pqMnuI3++4OF3+7OFIWXGjh+o7Nr2jNvbiYcQdQS1h903/jVFgOpA0yJ78z+x759bFA0rq+6aY5qPB4FzS3oYoLupDUhD9nDz6F6H7hpnlMf18KNKDu4IKjTWwrAnY6MFQw1W6ymOALHlFyCZmQhldg1MQHaMVVQTVgDC60TfaBqG++Y8PEoFhN/PBTZT175KNP/BlHDYGOOBmnBdzqJKplZ/ljiVG0ZBzfqeBRrrUkn6rA54462SgiliKoYVnbeptMdXNfAuaupIEi0bApF10TlgHfmEJAPUVidRVFyDupSem5po5vErPqWKhKbUIp0LozpYsIKK57dM/HKr+nguF+7924IIWMICkQ8JUigs9D+W+c4LnNoRtPPKNRUiCYmP+Jfo2lfKCKw8qpraEeWU3uiNRO6zcyKQoXPR5htmzzLznke7b4YbXW3I1lIRzmgG02Udb58U+7TpwyN7XymCgH+wuPDthZVQvRZuEP+SnLtMicz9m5zASWOBiAcLmkuFlTKuHspSIhCBD0yUPKcxu81A+4YD78rA2vtwsUEday9WNyrShyrl60rWmA+SmbYZkQOwFJWArxRYYc5jGhA5ikxYw1rx3ei4NmeX/lKiwpZ9Ln1tV2Ae7sArvxuVLbJjqJRjW1vFXAyHpvLG+8MJ6T2Ubx5M2KDa2SN6vuIGxJ9WQM9Mk3Q7aCNiZONXllhqq24DmoLbQfW2rYWsOgHWjtOmIQMyMKdiHZDjoyIq5+U700nZ6odJAoYXPQBvFNiQ78d5jaXliBqLTJEqUCwi+LiH2mx92EmNKDsJL74Z613+3lf20pxkV1+erOrjj8pW00vsPaahKUM+05ssd5uwM7K482KWEf3TCwlg/o3e5ngto7qSMz7YteIgCsF1UOcsLk7F7MxWbvrPMY473ew0G+noVL8EPbkmEMftMSeL6HFub/zy+2JQ==\",\"base64\")).toString()),CO}var mO;function Wae(){return typeof mO>\"u\"&&(mO=J(\"zlib\").brotliDecompressSync(Buffer.from(\"G8MSIIzURnVBnObTcvb3XE6v2S9Qgc2K801Oa5otNKEtK8BINZNcaQHy+9/vf/WXBimwutXC33P2DPc64pps5rz7NGGWaOKNSPL4Y2KRE8twut2lFOIN+OXPtRmPMRhMTILib2bEQx43az2I5d3YS8Roa5UZpF/ujHb3Djd3GDvYUfvFYSUQ39vb2cmifp/rgB4J/65JK3wRBTvMBoNBmn3mbXC63/gbBkW/2IRPri0O8bcsRBsmarF328pAln04nyJFkwUAvNu934supAqLtyerZZpJ8I8suJHhf/ocMV+scKwa8NOiDKIPXw6Ex/EEZD6TEGaW8N5zvNHYF10l6Lfooj7D5W2k3dgvQSbp2Wv8TGOayS978gxlOLVjTGXs66ozewbrjwElLtyrYNnWTfzzdEutgROUFPVMhnMoy8EjJLLlWwIEoySxliim9kYW30JUHiPVyjt0iAw/ZpPmCbUCltYPnq6ZNblIKhTNhqS/oqC9iya5sGKZTOVsTEg34n92uZTf2iPpcZih8rPW8CzA+adIGmyCPcKdLMsBLShd+zuEbTrqpwuh+DLmracZcjPC5Sdf5odDAhKpFuOsQS67RT+1VgWWygSv3YwxDnylc04/PYuaMeIzhBkLrvs7e/OUzRTF56MmfY6rI63QtEjEQzq637zQqJ39nNhu3NmoRRhW/086bHGBUtx0PE0j3aEGvkdh9WJC8y8j8mqqke9/dQ5la+Q3ba4RlhvTbnfQhPDDab3tUifkjKuOsp13mXEmO00Mu88F/M67R7LXfoFDFLNtgCSWjWX+3Jn1371pJTK9xPBiMJafvDjtFyAzu8rxeQ0TKMQXNPs5xxiBOd+BRJP8KP88XPtJIbZKh/cdW8KvBUkpqKpGoiIaA32c3/JnQr4efXt85mXvidOvn/eU3Pase1typLYBalJ14mCso9h79nuMOuCa/kZAOkJHmTjP5RM2WNoPasZUAnT1TAE/NH25hUxcQv6hQWR/m1PKk4ooXMcM4SR1iYU3fUohvqk4RY2hbmTVVIXv6TvqO+0doOjgeVFAcom+RlwJQmOVH7pr1Q9LoJT6n1DeQEB+NHygsATbIwTcOKZlJsY8G4+suX1uQLjUWwLjjs0mvSvZcLTpIGAekeR7GCgl8eo3ndAqEe2XCav4huliHjdbIPBsGJuPX7lrO9HX1UbXRH5opOe1x6JsOSgHZR+EaxuXVhpLLxm6jk1LJtZfHSc6BKPun3CpYYVMJGwEUyk8MTGG0XL5MfEwaXpnc9TKnBmlGn6nHiGREc3ysn47XIBDzA+YvFdjZzVIEDcKGpS6PbUJehFRjEne8D0lVU1XuRtlgszq6pTNlQ/3MzNOEgCWPyTct22V2mEi2krizn5VDo9B19/X2DB3hCGRMM7ONbtnAcIx/OWB1u5uPbW1gsH8irXxT/IzG0PoXWYjhbMsH3KTuoOl5o17PulcgvsfTSnKFM354GWI8luqZnrswWjiXy3G+Vbyo1KMopFmmvBwNELgaS8z8dNZchx/Cl/xjddxhMcyqtzFyONb2Zdu90NkI8pAeufe7YlXrp53v8Dj/l8vWeVspRKBGXScBBPI/HinSTGmLDOGGOCIyH0JFdOZx0gWsacNlQLJMIrBhqRxXxHF/5pseWwejlAAvZ3klZSDSYY8mkToaWejXhgNomeGtx1DTLEUFMRkgF5yFB22WYdJnaWN14r1YJj81hGi45+jrADS5nYRhCiSlCJJ1nL8pYX+HDSMhdTEWyRcgHVp/IsUIZYMfT+YYncUQPgcxNGCHfZ88vDdrcUuaGIl6zhAsiaq7R5dfqrqXH/JcBhfjT8D0azayIyEz75Nxp6YkcyDxlJq3EXnJUpqDohJJOysL1t1uNiHESlvsxPb5cpbW0+ICZqJmUZus1BMW0F5IVBODLIo2zHHjA0=\",\"base64\")).toString()),mO}var EO;function zae(){return typeof EO>\"u\"&&(EO=J(\"zlib\").brotliDecompressSync(Buffer.from(\"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\",\"base64\")).toString()),EO}var Vae=new Map([[P.makeIdent(null,\"fsevents\").identHash,Jae],[P.makeIdent(null,\"resolve\").identHash,Wae],[P.makeIdent(null,\"typescript\").identHash,zae]]),uWe={hooks:{registerPackageExtensions:async(r,e)=>{for(let[t,i]of dO)e(P.parseDescriptor(t,!0),i)},getBuiltinPatch:async(r,e)=>{var s;let t=\"compat/\";if(!e.startsWith(t))return;let i=P.parseIdent(e.slice(t.length)),n=(s=Vae.get(i.identHash))==null?void 0:s();return typeof n<\"u\"?n:null},reduceDependency:async(r,e,t,i)=>typeof Vae.get(r.identHash)>\"u\"?r:P.makeDescriptor(r,P.makeRange({protocol:\"patch:\",source:P.stringifyDescriptor(r),selector:`~builtin<compat/${P.stringifyIdent(r)}>`,params:null}))}},gWe=uWe;var yO={};ut(yO,{default:()=>hWe});var tp=class extends De{constructor(){super(...arguments);this.pkg=z.String(\"-p,--package\",{description:\"The package to run the provided command from\"});this.quiet=z.Boolean(\"-q,--quiet\",!1,{description:\"Only report critical errors instead of printing the full install logs\"});this.command=z.String();this.args=z.Proxy()}async execute(){let t=[];this.pkg&&t.push(\"--package\",this.pkg),this.quiet&&t.push(\"--quiet\");let i=P.parseDescriptor(this.command),n;i.scope?n=P.makeIdent(i.scope,`create-${i.name}`):i.name.startsWith(\"@\")?n=P.makeIdent(i.name.substring(1),\"create\"):n=P.makeIdent(null,`create-${i.name}`);let s=P.stringifyIdent(n);return i.range!==\"unknown\"&&(s+=`@${i.range}`),this.cli.run([\"dlx\",...t,s,...this.args])}};tp.paths=[[\"create\"]];var Ku=class extends De{constructor(){super(...arguments);this.packages=z.Array(\"-p,--package\",{description:\"The package(s) to install before running the command\"});this.quiet=z.Boolean(\"-q,--quiet\",!1,{description:\"Only report critical errors instead of printing the full install logs\"});this.command=z.String();this.args=z.Proxy()}async execute(){return ye.telemetry=null,await M.mktempPromise(async t=>{var C;let i=x.join(t,`dlx-${process.pid}`);await M.mkdirPromise(i),await M.writeFilePromise(x.join(i,\"package.json\"),`{}\n`),await M.writeFilePromise(x.join(i,\"yarn.lock\"),\"\");let n=x.join(i,\".yarnrc.yml\"),s=await ye.findProjectCwd(this.context.cwd,xt.lockfile),o=!(await ye.find(this.context.cwd,null,{strict:!1})).get(\"enableGlobalCache\"),a=s!==null?x.join(s,\".yarnrc.yml\"):null;a!==null&&M.existsSync(a)?(await M.copyFilePromise(a,n),await ye.updateConfiguration(i,y=>{let B={...y,enableGlobalCache:o,enableTelemetry:!1};return Array.isArray(y.plugins)&&(B.plugins=y.plugins.map(v=>{let D=typeof v==\"string\"?v:v.path,T=K.isAbsolute(D)?D:K.resolve(K.fromPortablePath(s),D);return typeof v==\"string\"?T:{path:T,spec:v.spec}})),B})):await M.writeFilePromise(n,`enableGlobalCache: ${o}\nenableTelemetry: false\n`);let l=(C=this.packages)!=null?C:[this.command],c=P.parseDescriptor(this.command).name,u=await this.cli.run([\"add\",\"--\",...l],{cwd:i,quiet:this.quiet});if(u!==0)return u;this.quiet||this.context.stdout.write(`\n`);let g=await ye.find(i,this.context.plugins),{project:f,workspace:h}=await je.find(g,i);if(h===null)throw new ct(f.cwd,i);await f.restoreInstallState();let p=await Wt.getWorkspaceAccessibleBinaries(h);return p.has(c)===!1&&p.size===1&&typeof this.packages>\"u\"&&(c=Array.from(p)[0][0]),await Wt.executeWorkspaceAccessibleBinary(h,c,this.args,{packageAccessibleBinaries:p,cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})})}};Ku.paths=[[\"dlx\"]],Ku.usage=ve.Usage({description:\"run a package in a temporary environment\",details:\"\\n      This command will install a package within a temporary environment, and run its binary script if it contains any. The binary will run within the current cwd.\\n\\n      By default Yarn will download the package named `command`, but this can be changed through the use of the `-p,--package` flag which will instruct Yarn to still run the same command but from a different package.\\n\\n      Using `yarn dlx` as a replacement of `yarn add` isn't recommended, as it makes your project non-deterministic (Yarn doesn't keep track of the packages installed through `dlx` - neither their name, nor their version).\\n    \",examples:[[\"Use create-react-app to create a new React app\",\"yarn dlx create-react-app ./my-app\"],[\"Install multiple packages for a single command\",`yarn dlx -p typescript -p ts-node ts-node --transpile-only -e \"console.log('hello!')\"`]]});var fWe={commands:[tp,Ku]},hWe=fWe;var bO={};ut(bO,{default:()=>CWe,fileUtils:()=>Zm});var rp=/^(?:[a-zA-Z]:[\\\\/]|\\.{0,2}\\/)/,Xm=/^[^?]*\\.(?:tar\\.gz|tgz)(?:::.*)?$/,qr=\"file:\";var Zm={};ut(Zm,{makeArchiveFromLocator:()=>KQ,makeBufferFromLocator:()=>QO,makeLocator:()=>BO,makeSpec:()=>Xae,parseSpec:()=>wO});function wO(r){let{params:e,selector:t}=P.parseRange(r),i=K.toPortablePath(t);return{parentLocator:e&&typeof e.locator==\"string\"?P.parseLocator(e.locator):null,path:i}}function Xae({parentLocator:r,path:e,folderHash:t,protocol:i}){let n=r!==null?{locator:P.stringifyLocator(r)}:{},s=typeof t<\"u\"?{hash:t}:{};return P.makeRange({protocol:i,source:e,selector:e,params:{...s,...n}})}function BO(r,{parentLocator:e,path:t,folderHash:i,protocol:n}){return P.makeLocator(r,Xae({parentLocator:e,path:t,folderHash:i,protocol:n}))}async function KQ(r,{protocol:e,fetchOptions:t,inMemory:i=!1}){let{parentLocator:n,path:s}=P.parseFileStyleRange(r.reference,{protocol:e}),o=x.isAbsolute(s)?{packageFs:new qt(Oe.root),prefixPath:Oe.dot,localPath:Oe.root}:await t.fetcher.fetch(n,t),a=o.localPath?{packageFs:new qt(Oe.root),prefixPath:x.relative(Oe.root,o.localPath)}:o;o!==a&&o.releaseFs&&o.releaseFs();let l=a.packageFs,c=x.join(a.prefixPath,s);return await Ie.releaseAfterUseAsync(async()=>await mi.makeArchiveFromDirectory(c,{baseFs:l,prefixPath:P.getIdentVendorPath(r),compressionLevel:t.project.configuration.get(\"compressionLevel\"),inMemory:i}),a.releaseFs)}async function QO(r,{protocol:e,fetchOptions:t}){return(await KQ(r,{protocol:e,fetchOptions:t,inMemory:!0})).getBufferAndClose()}var UQ=class{supports(e,t){return!!e.reference.startsWith(qr)}getLocalPath(e,t){let{parentLocator:i,path:n}=P.parseFileStyleRange(e.reference,{protocol:qr});if(x.isAbsolute(n))return n;let s=t.fetcher.getLocalPath(i,t);return s===null?null:x.resolve(s,n)}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,[n,s,o]=await t.cache.fetchPackageFromCache(e,i,{onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.fetchFromDisk(e,t),skipIntegrityCheck:t.skipIntegrityCheck,...t.cacheOptions});return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),localPath:this.getLocalPath(e,t),checksum:o}}async fetchFromDisk(e,t){return KQ(e,{protocol:qr,fetchOptions:t})}};var pWe=2,HQ=class{supportsDescriptor(e,t){return e.range.match(rp)?!0:!!e.range.startsWith(qr)}supportsLocator(e,t){return!!e.reference.startsWith(qr)}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,i){return rp.test(e.range)&&(e=P.makeDescriptor(e,`${qr}${e.range}`)),P.bindDescriptor(e,{locator:P.stringifyLocator(t)})}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){if(!i.fetchOptions)throw new Error(\"Assertion failed: This resolver cannot be used unless a fetcher is configured\");let{path:n,parentLocator:s}=wO(e.range);if(s===null)throw new Error(\"Assertion failed: The descriptor should have been bound\");let o=await QO(P.makeLocator(e,P.makeRange({protocol:qr,source:n,selector:n,params:{locator:P.stringifyLocator(s)}})),{protocol:qr,fetchOptions:i.fetchOptions}),a=li.makeHash(`${pWe}`,o).slice(0,6);return[BO(e,{parentLocator:s,path:n,folderHash:a,protocol:qr})]}async getSatisfying(e,t,i){return null}async resolve(e,t){if(!t.fetchOptions)throw new Error(\"Assertion failed: This resolver cannot be used unless a fetcher is configured\");let i=await t.fetchOptions.fetcher.fetch(e,t.fetchOptions),n=await Ie.releaseAfterUseAsync(async()=>await ot.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return{...e,version:n.version||\"0.0.0\",languageName:n.languageName||t.project.configuration.get(\"defaultLanguageName\"),linkType:\"HARD\",conditions:n.getConditions(),dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin}}};var GQ=class{supports(e,t){return Xm.test(e.reference)?!!e.reference.startsWith(qr):!1}getLocalPath(e,t){return null}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,[n,s,o]=await t.cache.fetchPackageFromCache(e,i,{onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.fetchFromDisk(e,t),skipIntegrityCheck:t.skipIntegrityCheck,...t.cacheOptions});return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),checksum:o}}async fetchFromDisk(e,t){let{parentLocator:i,path:n}=P.parseFileStyleRange(e.reference,{protocol:qr}),s=x.isAbsolute(n)?{packageFs:new qt(Oe.root),prefixPath:Oe.dot,localPath:Oe.root}:await t.fetcher.fetch(i,t),o=s.localPath?{packageFs:new qt(Oe.root),prefixPath:x.relative(Oe.root,s.localPath)}:s;s!==o&&s.releaseFs&&s.releaseFs();let a=o.packageFs,l=x.join(o.prefixPath,n),c=await a.readFilePromise(l);return await Ie.releaseAfterUseAsync(async()=>await mi.convertToZip(c,{compressionLevel:t.project.configuration.get(\"compressionLevel\"),prefixPath:P.getIdentVendorPath(e),stripComponents:1}),o.releaseFs)}};var YQ=class{supportsDescriptor(e,t){return Xm.test(e.range)?!!(e.range.startsWith(qr)||rp.test(e.range)):!1}supportsLocator(e,t){return Xm.test(e.reference)?!!e.reference.startsWith(qr):!1}shouldPersistResolution(e,t){return!0}bindDescriptor(e,t,i){return rp.test(e.range)&&(e=P.makeDescriptor(e,`${qr}${e.range}`)),P.bindDescriptor(e,{locator:P.stringifyLocator(t)})}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){let n=e.range;return n.startsWith(qr)&&(n=n.slice(qr.length)),[P.makeLocator(e,`${qr}${K.toPortablePath(n)}`)]}async getSatisfying(e,t,i){return null}async resolve(e,t){if(!t.fetchOptions)throw new Error(\"Assertion failed: This resolver cannot be used unless a fetcher is configured\");let i=await t.fetchOptions.fetcher.fetch(e,t.fetchOptions),n=await Ie.releaseAfterUseAsync(async()=>await ot.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return{...e,version:n.version||\"0.0.0\",languageName:n.languageName||t.project.configuration.get(\"defaultLanguageName\"),linkType:\"HARD\",conditions:n.getConditions(),dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin}}};var dWe={fetchers:[GQ,UQ],resolvers:[YQ,HQ]},CWe=dWe;var SO={};ut(SO,{default:()=>yWe});var Zae=Pe(J(\"querystring\")),_ae=[/^https?:\\/\\/(?:([^/]+?)@)?github.com\\/([^/#]+)\\/([^/#]+)\\/tarball\\/([^/#]+)(?:#(.*))?$/,/^https?:\\/\\/(?:([^/]+?)@)?github.com\\/([^/#]+)\\/([^/#]+?)(?:\\.git)?(?:#(.*))?$/];function $ae(r){return r?_ae.some(e=>!!r.match(e)):!1}function eAe(r){let e;for(let a of _ae)if(e=r.match(a),e)break;if(!e)throw new Error(mWe(r));let[,t,i,n,s=\"master\"]=e,{commit:o}=Zae.default.parse(s);return s=o||s.replace(/[^:]*:/,\"\"),{auth:t,username:i,reponame:n,treeish:s}}function mWe(r){return`Input cannot be parsed as a valid GitHub URL ('${r}').`}var jQ=class{supports(e,t){return!!$ae(e.reference)}getLocalPath(e,t){return null}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,[n,s,o]=await t.cache.fetchPackageFromCache(e,i,{onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from GitHub`),loader:()=>this.fetchFromNetwork(e,t),skipIntegrityCheck:t.skipIntegrityCheck,...t.cacheOptions});return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,t){let i=await Xt.get(this.getLocatorUrl(e,t),{configuration:t.project.configuration});return await M.mktempPromise(async n=>{let s=new qt(n);await mi.extractArchiveTo(i,s,{stripComponents:1});let o=lA.splitRepoUrl(e.reference),a=x.join(n,\"package.tgz\");await Wt.prepareExternalProject(n,a,{configuration:t.project.configuration,report:t.report,workspace:o.extra.workspace,locator:e});let l=await M.readFilePromise(a);return await mi.convertToZip(l,{compressionLevel:t.project.configuration.get(\"compressionLevel\"),prefixPath:P.getIdentVendorPath(e),stripComponents:1})})}getLocatorUrl(e,t){let{auth:i,username:n,reponame:s,treeish:o}=eAe(e.reference);return`https://${i?`${i}@`:\"\"}github.com/${n}/${s}/archive/${o}.tar.gz`}};var IWe={hooks:{async fetchHostedRepository(r,e,t){if(r!==null)return r;let i=new jQ;if(!i.supports(e,t))return null;try{return await i.fetch(e,t)}catch{return null}}}},yWe=IWe;var vO={};ut(vO,{default:()=>BWe});var _m=/^[^?]*\\.(?:tar\\.gz|tgz)(?:\\?.*)?$/,$m=/^https?:/;var qQ=class{supports(e,t){return _m.test(e.reference)?!!$m.test(e.reference):!1}getLocalPath(e,t){return null}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,[n,s,o]=await t.cache.fetchPackageFromCache(e,i,{onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from the remote server`),loader:()=>this.fetchFromNetwork(e,t),skipIntegrityCheck:t.skipIntegrityCheck,...t.cacheOptions});return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,t){let i=await Xt.get(e.reference,{configuration:t.project.configuration});return await mi.convertToZip(i,{compressionLevel:t.project.configuration.get(\"compressionLevel\"),prefixPath:P.getIdentVendorPath(e),stripComponents:1})}};var JQ=class{supportsDescriptor(e,t){return _m.test(e.range)?!!$m.test(e.range):!1}supportsLocator(e,t){return _m.test(e.reference)?!!$m.test(e.reference):!1}shouldPersistResolution(e,t){return!0}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){return[P.convertDescriptorToLocator(e)]}async getSatisfying(e,t,i){return null}async resolve(e,t){if(!t.fetchOptions)throw new Error(\"Assertion failed: This resolver cannot be used unless a fetcher is configured\");let i=await t.fetchOptions.fetcher.fetch(e,t.fetchOptions),n=await Ie.releaseAfterUseAsync(async()=>await ot.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return{...e,version:n.version||\"0.0.0\",languageName:n.languageName||t.project.configuration.get(\"defaultLanguageName\"),linkType:\"HARD\",conditions:n.getConditions(),dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin}}};var wWe={fetchers:[qQ],resolvers:[JQ]},BWe=wWe;var kO={};ut(kO,{default:()=>Q8e});var vAe=Pe(SAe()),DO=J(\"util\"),Uu=class extends De{constructor(){super(...arguments);this.private=z.Boolean(\"-p,--private\",!1,{description:\"Initialize a private package\"});this.workspace=z.Boolean(\"-w,--workspace\",!1,{description:\"Initialize a workspace root with a `packages/` directory\"});this.install=z.String(\"-i,--install\",!1,{tolerateBoolean:!0,description:\"Initialize a package with a specific bundle that will be locked in the project\"});this.usev2=z.Boolean(\"-2\",!1,{hidden:!0});this.yes=z.Boolean(\"-y,--yes\",{hidden:!0});this.assumeFreshProject=z.Boolean(\"--assume-fresh-project\",!1,{hidden:!0})}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),i=typeof this.install==\"string\"?this.install:this.usev2||this.install===!0?\"latest\":null;return i!==null?await this.executeProxy(t,i):await this.executeRegular(t)}async executeProxy(t,i){if(t.projectCwd!==null&&t.projectCwd!==this.context.cwd)throw new be(\"Cannot use the --install flag from within a project subdirectory\");M.existsSync(this.context.cwd)||await M.mkdirPromise(this.context.cwd,{recursive:!0});let n=x.join(this.context.cwd,t.get(\"lockfileFilename\"));M.existsSync(n)||await M.writeFilePromise(n,\"\");let s=await this.cli.run([\"set\",\"version\",i],{quiet:!0});if(s!==0)return s;let o=[];return this.private&&o.push(\"-p\"),this.workspace&&o.push(\"-w\"),this.yes&&o.push(\"-y\"),await M.mktempPromise(async a=>{let{code:l}=await Cr.pipevp(\"yarn\",[\"init\",...o],{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,env:await Wt.makeScriptEnv({binFolder:a})});return l})}async executeRegular(t){var c;let i=null;try{i=(await je.find(t,this.context.cwd)).project}catch{i=null}M.existsSync(this.context.cwd)||await M.mkdirPromise(this.context.cwd,{recursive:!0});let n=await ot.tryFind(this.context.cwd)||new ot,s=Object.fromEntries(t.get(\"initFields\").entries());n.load(s),n.name=(c=n.name)!=null?c:P.makeIdent(t.get(\"initScope\"),x.basename(this.context.cwd)),n.packageManager=Tr&&Ie.isTaggedYarnVersion(Tr)?`yarn@${Tr}`:null,typeof n.raw.private>\"u\"&&(this.private||this.workspace&&n.workspaceDefinitions.length===0)&&(n.private=!0),this.workspace&&n.workspaceDefinitions.length===0&&(await M.mkdirPromise(x.join(this.context.cwd,\"packages\"),{recursive:!0}),n.workspaceDefinitions=[{pattern:\"packages/*\"}]);let o={};n.exportTo(o),DO.inspect.styles.name=\"cyan\",this.context.stdout.write(`${(0,DO.inspect)(o,{depth:1/0,colors:!0,compact:!1})}\n`);let a=x.join(this.context.cwd,ot.fileName);await M.changeFilePromise(a,`${JSON.stringify(o,null,2)}\n`,{automaticNewlines:!0});let l=x.join(this.context.cwd,\"README.md\");if(M.existsSync(l)||await M.writeFilePromise(l,`# ${P.stringifyIdent(n.name)}\n`),!i||i.cwd===this.context.cwd){let u=x.join(this.context.cwd,xt.lockfile);M.existsSync(u)||await M.writeFilePromise(u,\"\");let f=[\".yarn/*\",\"!.yarn/patches\",\"!.yarn/plugins\",\"!.yarn/releases\",\"!.yarn/sdks\",\"!.yarn/versions\",\"\",\"# Swap the comments on the following lines if you don't wish to use zero-installs\",\"# Documentation here: https://yarnpkg.com/features/zero-installs\",\"!.yarn/cache\",\"#.pnp.*\"].map(T=>`${T}\n`).join(\"\"),h=x.join(this.context.cwd,\".gitignore\");M.existsSync(h)||await M.writeFilePromise(h,f);let C=[\"/.yarn/**            linguist-vendored\",\"/.yarn/releases/*    binary\",\"/.yarn/plugins/**/*  binary\",\"/.pnp.*              binary linguist-generated\"].map(T=>`${T}\n`).join(\"\"),y=x.join(this.context.cwd,\".gitattributes\");M.existsSync(y)||await M.writeFilePromise(y,C);let B={[\"*\"]:{endOfLine:\"lf\",insertFinalNewline:!0},[\"*.{js,json,yml}\"]:{charset:\"utf-8\",indentStyle:\"space\",indentSize:2}};(0,vAe.default)(B,t.get(\"initEditorConfig\"));let v=`root = true\n`;for(let[T,H]of Object.entries(B)){v+=`\n[${T}]\n`;for(let[j,$]of Object.entries(H)){let V=j.replace(/[A-Z]/g,W=>`_${W.toLowerCase()}`);v+=`${V} = ${$}\n`}}let D=x.join(this.context.cwd,\".editorconfig\");M.existsSync(D)||await M.writeFilePromise(D,v),M.existsSync(x.join(this.context.cwd,\".git\"))||await Cr.execvp(\"git\",[\"init\"],{cwd:this.context.cwd})}}};Uu.paths=[[\"init\"]],Uu.usage=ve.Usage({description:\"create a new package\",details:\"\\n      This command will setup a new package in your local directory.\\n\\n      If the `-p,--private` or `-w,--workspace` options are set, the package will be private by default.\\n\\n      If the `-w,--workspace` option is set, the package will be configured to accept a set of workspaces in the `packages/` directory.\\n\\n      If the `-i,--install` option is given a value, Yarn will first download it using `yarn set version` and only then forward the init call to the newly downloaded bundle. Without arguments, the downloaded bundle will be `latest`.\\n\\n      The initial settings of the manifest can be changed by using the `initScope` and `initFields` configuration values. Additionally, Yarn will generate an EditorConfig file whose rules can be altered via `initEditorConfig`, and will initialize a Git repository in the current directory.\\n    \",examples:[[\"Create a new package in the local directory\",\"yarn init\"],[\"Create a new private package in the local directory\",\"yarn init -p\"],[\"Create a new package and store the Yarn release inside\",\"yarn init -i=latest\"],[\"Create a new private package and defines it as a workspace root\",\"yarn init -w\"]]});var B8e={configuration:{initScope:{description:\"Scope used when creating packages via the init command\",type:\"STRING\",default:null},initFields:{description:\"Additional fields to set when creating packages via the init command\",type:\"MAP\",valueDefinition:{description:\"\",type:\"ANY\"}},initEditorConfig:{description:\"Extra rules to define in the generator editorconfig\",type:\"MAP\",valueDefinition:{description:\"\",type:\"ANY\"}}},commands:[Uu]},Q8e=B8e;var RO={};ut(RO,{default:()=>S8e});var cA=\"portal:\",uA=\"link:\";var WQ=class{supports(e,t){return!!e.reference.startsWith(cA)}getLocalPath(e,t){let{parentLocator:i,path:n}=P.parseFileStyleRange(e.reference,{protocol:cA});if(x.isAbsolute(n))return n;let s=t.fetcher.getLocalPath(i,t);return s===null?null:x.resolve(s,n)}async fetch(e,t){var c;let{parentLocator:i,path:n}=P.parseFileStyleRange(e.reference,{protocol:cA}),s=x.isAbsolute(n)?{packageFs:new qt(Oe.root),prefixPath:Oe.dot,localPath:Oe.root}:await t.fetcher.fetch(i,t),o=s.localPath?{packageFs:new qt(Oe.root),prefixPath:x.relative(Oe.root,s.localPath),localPath:Oe.root}:s;s!==o&&s.releaseFs&&s.releaseFs();let a=o.packageFs,l=x.resolve((c=o.localPath)!=null?c:o.packageFs.getRealPath(),o.prefixPath,n);return s.localPath?{packageFs:new qt(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Oe.dot,localPath:l}:{packageFs:new So(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Oe.dot}}};var zQ=class{supportsDescriptor(e,t){return!!e.range.startsWith(cA)}supportsLocator(e,t){return!!e.reference.startsWith(cA)}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,i){return P.bindDescriptor(e,{locator:P.stringifyLocator(t)})}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){let n=e.range.slice(cA.length);return[P.makeLocator(e,`${cA}${K.toPortablePath(n)}`)]}async getSatisfying(e,t,i){return null}async resolve(e,t){if(!t.fetchOptions)throw new Error(\"Assertion failed: This resolver cannot be used unless a fetcher is configured\");let i=await t.fetchOptions.fetcher.fetch(e,t.fetchOptions),n=await Ie.releaseAfterUseAsync(async()=>await ot.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return{...e,version:n.version||\"0.0.0\",languageName:n.languageName||t.project.configuration.get(\"defaultLanguageName\"),linkType:\"SOFT\",conditions:n.getConditions(),dependencies:new Map([...n.dependencies]),peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin}}};var VQ=class{supports(e,t){return!!e.reference.startsWith(uA)}getLocalPath(e,t){let{parentLocator:i,path:n}=P.parseFileStyleRange(e.reference,{protocol:uA});if(x.isAbsolute(n))return n;let s=t.fetcher.getLocalPath(i,t);return s===null?null:x.resolve(s,n)}async fetch(e,t){var c;let{parentLocator:i,path:n}=P.parseFileStyleRange(e.reference,{protocol:uA}),s=x.isAbsolute(n)?{packageFs:new qt(Oe.root),prefixPath:Oe.dot,localPath:Oe.root}:await t.fetcher.fetch(i,t),o=s.localPath?{packageFs:new qt(Oe.root),prefixPath:x.relative(Oe.root,s.localPath),localPath:Oe.root}:s;s!==o&&s.releaseFs&&s.releaseFs();let a=o.packageFs,l=x.resolve((c=o.localPath)!=null?c:o.packageFs.getRealPath(),o.prefixPath,n);return s.localPath?{packageFs:new qt(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Oe.dot,discardFromLookup:!0,localPath:l}:{packageFs:new So(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Oe.dot,discardFromLookup:!0}}};var XQ=class{supportsDescriptor(e,t){return!!e.range.startsWith(uA)}supportsLocator(e,t){return!!e.reference.startsWith(uA)}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,i){return P.bindDescriptor(e,{locator:P.stringifyLocator(t)})}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){let n=e.range.slice(uA.length);return[P.makeLocator(e,`${uA}${K.toPortablePath(n)}`)]}async getSatisfying(e,t,i){return null}async resolve(e,t){return{...e,version:\"0.0.0\",languageName:t.project.configuration.get(\"defaultLanguageName\"),linkType:\"SOFT\",conditions:null,dependencies:new Map,peerDependencies:new Map,dependenciesMeta:new Map,peerDependenciesMeta:new Map,bin:new Map}}};var b8e={fetchers:[VQ,WQ],resolvers:[XQ,zQ]},S8e=b8e;var hM={};ut(hM,{default:()=>Yze});var NO=(r,e)=>`${r}@${e}`,xAe=(r,e)=>{let t=e.indexOf(\"#\"),i=t>=0?e.substring(t+1):e;return NO(r,i)};var kAe=(r,e={})=>{let t=e.debugLevel||Number(process.env.NM_DEBUG_LEVEL||-1),i=e.check||t>=9,n=e.hoistingLimits||new Map,s={check:i,debugLevel:t,hoistingLimits:n,fastLookupPossible:!0},o;s.debugLevel>=0&&(o=Date.now());let a=F8e(r,s),l=!1,c=0;do l=TO(a,[a],new Set([a.locator]),new Map,s).anotherRoundNeeded,s.fastLookupPossible=!1,c++;while(l);if(s.debugLevel>=0&&console.log(`hoist time: ${Date.now()-o}ms, rounds: ${c}`),s.debugLevel>=1){let u=eE(a);if(TO(a,[a],new Set([a.locator]),new Map,s).isGraphChanged)throw new Error(`The hoisting result is not terminal, prev tree:\n${u}, next tree:\n${eE(a)}`);let f=RAe(a);if(f)throw new Error(`${f}, after hoisting finished:\n${eE(a)}`)}return s.debugLevel>=2&&console.log(eE(a)),N8e(a)},v8e=r=>{let e=r[r.length-1],t=new Map,i=new Set,n=s=>{if(!i.has(s)){i.add(s);for(let o of s.hoistedDependencies.values())t.set(o.name,o);for(let o of s.dependencies.values())s.peerNames.has(o.name)||n(o)}};return n(e),t},x8e=r=>{let e=r[r.length-1],t=new Map,i=new Set,n=new Set,s=(o,a)=>{if(i.has(o))return;i.add(o);for(let c of o.hoistedDependencies.values())if(!a.has(c.name)){let u;for(let g of r)u=g.dependencies.get(c.name),u&&t.set(u.name,u)}let l=new Set;for(let c of o.dependencies.values())l.add(c.name);for(let c of o.dependencies.values())o.peerNames.has(c.name)||s(c,l)};return s(e,n),t},PAe=(r,e)=>{if(e.decoupled)return e;let{name:t,references:i,ident:n,locator:s,dependencies:o,originalDependencies:a,hoistedDependencies:l,peerNames:c,reasons:u,isHoistBorder:g,hoistPriority:f,dependencyKind:h,hoistedFrom:p,hoistedTo:C}=e,y={name:t,references:new Set(i),ident:n,locator:s,dependencies:new Map(o),originalDependencies:new Map(a),hoistedDependencies:new Map(l),peerNames:new Set(c),reasons:new Map(u),decoupled:!0,isHoistBorder:g,hoistPriority:f,dependencyKind:h,hoistedFrom:new Map(p),hoistedTo:new Map(C)},B=y.dependencies.get(t);return B&&B.ident==y.ident&&y.dependencies.set(t,y),r.dependencies.set(y.name,y),y},P8e=(r,e)=>{let t=new Map([[r.name,[r.ident]]]);for(let n of r.dependencies.values())r.peerNames.has(n.name)||t.set(n.name,[n.ident]);let i=Array.from(e.keys());i.sort((n,s)=>{let o=e.get(n),a=e.get(s);return a.hoistPriority!==o.hoistPriority?a.hoistPriority-o.hoistPriority:a.peerDependents.size!==o.peerDependents.size?a.peerDependents.size-o.peerDependents.size:a.dependents.size-o.dependents.size});for(let n of i){let s=n.substring(0,n.indexOf(\"@\",1)),o=n.substring(s.length+1);if(!r.peerNames.has(s)){let a=t.get(s);a||(a=[],t.set(s,a)),a.indexOf(o)<0&&a.push(o)}}return t},FO=r=>{let e=new Set,t=(i,n=new Set)=>{if(!n.has(i)){n.add(i);for(let s of i.peerNames)if(!r.peerNames.has(s)){let o=r.dependencies.get(s);o&&!e.has(o)&&t(o,n)}e.add(i)}};for(let i of r.dependencies.values())r.peerNames.has(i.name)||t(i);return e},TO=(r,e,t,i,n,s=new Set)=>{let o=e[e.length-1];if(s.has(o))return{anotherRoundNeeded:!1,isGraphChanged:!1};s.add(o);let a=T8e(o),l=P8e(o,a),c=r==o?new Map:n.fastLookupPossible?v8e(e):x8e(e),u,g=!1,f=!1,h=new Map(Array.from(l.entries()).map(([C,y])=>[C,y[0]])),p=new Map;do{let C=R8e(r,e,t,c,h,l,i,p,n);C.isGraphChanged&&(f=!0),C.anotherRoundNeeded&&(g=!0),u=!1;for(let[y,B]of l)B.length>1&&!o.dependencies.has(y)&&(h.delete(y),B.shift(),h.set(y,B[0]),u=!0)}while(u);for(let C of o.dependencies.values())if(!o.peerNames.has(C.name)&&!t.has(C.locator)){t.add(C.locator);let y=TO(r,[...e,C],t,p,n);y.isGraphChanged&&(f=!0),y.anotherRoundNeeded&&(g=!0),t.delete(C.locator)}return{anotherRoundNeeded:g,isGraphChanged:f}},D8e=r=>{for(let[e,t]of r.dependencies)if(!r.peerNames.has(e)&&t.ident!==r.ident)return!0;return!1},k8e=(r,e,t,i,n,s,o,a,{outputReason:l,fastLookupPossible:c})=>{let u,g=null,f=new Set;l&&(u=`${Array.from(e).map(y=>ki(y)).join(\"\\u2192\")}`);let h=t[t.length-1],C=!(i.ident===h.ident);if(l&&!C&&(g=\"- self-reference\"),C&&(C=i.dependencyKind!==1,l&&!C&&(g=\"- workspace\")),C&&i.dependencyKind===2&&(C=!D8e(i),l&&!C&&(g=\"- external soft link with unhoisted dependencies\")),C&&(C=h.dependencyKind!==1||h.hoistedFrom.has(i.name)||e.size===1,l&&!C&&(g=h.reasons.get(i.name))),C&&(C=!r.peerNames.has(i.name),l&&!C&&(g=`- cannot shadow peer: ${ki(r.originalDependencies.get(i.name).locator)} at ${u}`)),C){let y=!1,B=n.get(i.name);if(y=!B||B.ident===i.ident,l&&!y&&(g=`- filled by: ${ki(B.locator)} at ${u}`),y)for(let v=t.length-1;v>=1;v--){let T=t[v].dependencies.get(i.name);if(T&&T.ident!==i.ident){y=!1;let H=a.get(h);H||(H=new Set,a.set(h,H)),H.add(i.name),l&&(g=`- filled by ${ki(T.locator)} at ${t.slice(0,v).map(j=>ki(j.locator)).join(\"\\u2192\")}`);break}}C=y}if(C&&(C=s.get(i.name)===i.ident,l&&!C&&(g=`- filled by: ${ki(o.get(i.name)[0])} at ${u}`)),C){let y=!0,B=new Set(i.peerNames);for(let v=t.length-1;v>=1;v--){let D=t[v];for(let T of B){if(D.peerNames.has(T)&&D.originalDependencies.has(T))continue;let H=D.dependencies.get(T);H&&r.dependencies.get(T)!==H&&(v===t.length-1?f.add(H):(f=null,y=!1,l&&(g=`- peer dependency ${ki(H.locator)} from parent ${ki(D.locator)} was not hoisted to ${u}`))),B.delete(T)}if(!y)break}C=y}if(C&&!c)for(let y of i.hoistedDependencies.values()){let B=n.get(y.name)||r.dependencies.get(y.name);if(!B||y.ident!==B.ident){C=!1,l&&(g=`- previously hoisted dependency mismatch, needed: ${ki(y.locator)}, available: ${ki(B==null?void 0:B.locator)}`);break}}return f!==null&&f.size>0?{isHoistable:2,dependsOn:f,reason:g}:{isHoistable:C?0:1,reason:g}},ZQ=r=>`${r.name}@${r.locator}`,R8e=(r,e,t,i,n,s,o,a,l)=>{let c=e[e.length-1],u=new Set,g=!1,f=!1,h=(B,v,D,T,H)=>{if(u.has(T))return;let j=[...v,ZQ(T)],$=[...D,ZQ(T)],V=new Map,W=new Map;for(let re of FO(T)){let O=k8e(c,t,[c,...B,T],re,i,n,s,a,{outputReason:l.debugLevel>=2,fastLookupPossible:l.fastLookupPossible});if(W.set(re,O),O.isHoistable===2)for(let F of O.dependsOn){let ue=V.get(F.name)||new Set;ue.add(re.name),V.set(F.name,ue)}}let _=new Set,A=(re,O,F)=>{if(!_.has(re)){_.add(re),W.set(re,{isHoistable:1,reason:F});for(let ue of V.get(re.name)||[])A(T.dependencies.get(ue),O,l.debugLevel>=2?`- peer dependency ${ki(re.locator)} from parent ${ki(T.locator)} was not hoisted`:\"\")}};for(let[re,O]of W)O.isHoistable===1&&A(re,O,O.reason);let Ae=!1;for(let re of W.keys())if(!_.has(re)){f=!0;let O=o.get(T);O&&O.has(re.name)&&(g=!0),Ae=!0,T.dependencies.delete(re.name),T.hoistedDependencies.set(re.name,re),T.reasons.delete(re.name);let F=c.dependencies.get(re.name);if(l.debugLevel>=2){let ue=Array.from(v).concat([T.locator]).map(ke=>ki(ke)).join(\"\\u2192\"),pe=c.hoistedFrom.get(re.name);pe||(pe=[],c.hoistedFrom.set(re.name,pe)),pe.push(ue),T.hoistedTo.set(re.name,Array.from(e).map(ke=>ki(ke.locator)).join(\"\\u2192\"))}if(!F)c.ident!==re.ident&&(c.dependencies.set(re.name,re),H.add(re));else for(let ue of re.references)F.references.add(ue)}if(T.dependencyKind===2&&Ae&&(g=!0),l.check){let re=RAe(r);if(re)throw new Error(`${re}, after hoisting dependencies of ${[c,...B,T].map(O=>ki(O.locator)).join(\"\\u2192\")}:\n${eE(r)}`)}let ge=FO(T);for(let re of ge)if(_.has(re)){let O=W.get(re);if((n.get(re.name)===re.ident||!T.reasons.has(re.name))&&O.isHoistable!==0&&T.reasons.set(re.name,O.reason),!re.isHoistBorder&&$.indexOf(ZQ(re))<0){u.add(T);let ue=PAe(T,re);h([...B,T],j,$,ue,C),u.delete(T)}}},p,C=new Set(FO(c)),y=Array.from(e).map(B=>ZQ(B));do{p=C,C=new Set;for(let B of p){if(B.locator===c.locator||B.isHoistBorder)continue;let v=PAe(c,B);h([],Array.from(t),y,v,C)}}while(C.size>0);return{anotherRoundNeeded:g,isGraphChanged:f}},RAe=r=>{let e=[],t=new Set,i=new Set,n=(s,o,a)=>{if(t.has(s)||(t.add(s),i.has(s)))return;let l=new Map(o);for(let c of s.dependencies.values())s.peerNames.has(c.name)||l.set(c.name,c);for(let c of s.originalDependencies.values()){let u=l.get(c.name),g=()=>`${Array.from(i).concat([s]).map(f=>ki(f.locator)).join(\"\\u2192\")}`;if(s.peerNames.has(c.name)){let f=o.get(c.name);(f!==u||!f||f.ident!==c.ident)&&e.push(`${g()} - broken peer promise: expected ${c.ident} but found ${f&&f.ident}`)}else{let f=a.hoistedFrom.get(s.name),h=s.hoistedTo.get(c.name),p=`${f?` hoisted from ${f.join(\", \")}`:\"\"}`,C=`${h?` hoisted to ${h}`:\"\"}`,y=`${g()}${p}`;u?u.ident!==c.ident&&e.push(`${y} - broken require promise for ${c.name}${C}: expected ${c.ident}, but found: ${u.ident}`):e.push(`${y} - broken require promise: no required dependency ${c.name}${C} found`)}}i.add(s);for(let c of s.dependencies.values())s.peerNames.has(c.name)||n(c,l,s);i.delete(s)};return n(r,r.dependencies,r),e.join(`\n`)},F8e=(r,e)=>{let{identName:t,name:i,reference:n,peerNames:s}=r,o={name:i,references:new Set([n]),locator:NO(t,n),ident:xAe(t,n),dependencies:new Map,originalDependencies:new Map,hoistedDependencies:new Map,peerNames:new Set(s),reasons:new Map,decoupled:!0,isHoistBorder:!0,hoistPriority:0,dependencyKind:1,hoistedFrom:new Map,hoistedTo:new Map},a=new Map([[r,o]]),l=(c,u)=>{let g=a.get(c),f=!!g;if(!g){let{name:h,identName:p,reference:C,peerNames:y,hoistPriority:B,dependencyKind:v}=c,D=e.hoistingLimits.get(u.locator);g={name:h,references:new Set([C]),locator:NO(p,C),ident:xAe(p,C),dependencies:new Map,originalDependencies:new Map,hoistedDependencies:new Map,peerNames:new Set(y),reasons:new Map,decoupled:!0,isHoistBorder:D?D.has(h):!1,hoistPriority:B||0,dependencyKind:v||0,hoistedFrom:new Map,hoistedTo:new Map},a.set(c,g)}if(u.dependencies.set(c.name,g),u.originalDependencies.set(c.name,g),f){let h=new Set,p=C=>{if(!h.has(C)){h.add(C),C.decoupled=!1;for(let y of C.dependencies.values())C.peerNames.has(y.name)||p(y)}};p(g)}else for(let h of c.dependencies)l(h,g)};for(let c of r.dependencies)l(c,o);return o},LO=r=>r.substring(0,r.indexOf(\"@\",1)),N8e=r=>{let e={name:r.name,identName:LO(r.locator),references:new Set(r.references),dependencies:new Set},t=new Set([r]),i=(n,s,o)=>{let a=t.has(n),l;if(s===n)l=o;else{let{name:c,references:u,locator:g}=n;l={name:c,identName:LO(g),references:u,dependencies:new Set}}if(o.dependencies.add(l),!a){t.add(n);for(let c of n.dependencies.values())n.peerNames.has(c.name)||i(c,n,l);t.delete(n)}};for(let n of r.dependencies.values())i(n,r,e);return e},T8e=r=>{let e=new Map,t=new Set([r]),i=o=>`${o.name}@${o.ident}`,n=o=>{let a=i(o),l=e.get(a);return l||(l={dependents:new Set,peerDependents:new Set,hoistPriority:0},e.set(a,l)),l},s=(o,a)=>{let l=!!t.has(a);if(n(a).dependents.add(o.ident),!l){t.add(a);for(let u of a.dependencies.values()){let g=n(u);g.hoistPriority=Math.max(g.hoistPriority,u.hoistPriority),a.peerNames.has(u.name)?g.peerDependents.add(a.ident):s(a,u)}}};for(let o of r.dependencies.values())r.peerNames.has(o.name)||s(r,o);return e},ki=r=>{if(!r)return\"none\";let e=r.indexOf(\"@\",1),t=r.substring(0,e);t.endsWith(\"$wsroot$\")&&(t=`wh:${t.replace(\"$wsroot$\",\"\")}`);let i=r.substring(e+1);if(i===\"workspace:.\")return\".\";if(i){let n=(i.indexOf(\"#\")>0?i.split(\"#\")[1]:i).replace(\"npm:\",\"\");return i.startsWith(\"virtual\")&&(t=`v:${t}`),n.startsWith(\"workspace\")&&(t=`w:${t}`,n=\"\"),`${t}${n?`@${n}`:\"\"}`}else return`${t}`},DAe=5e4,eE=r=>{let e=0,t=(n,s,o=\"\")=>{if(e>DAe||s.has(n))return\"\";e++;let a=Array.from(n.dependencies.values()).sort((c,u)=>c.name===u.name?0:c.name>u.name?1:-1),l=\"\";s.add(n);for(let c=0;c<a.length;c++){let u=a[c];if(!n.peerNames.has(u.name)&&u!==n){let g=n.reasons.get(u.name),f=LO(u.locator);l+=`${o}${c<a.length-1?\"\\u251C\\u2500\":\"\\u2514\\u2500\"}${(s.has(u)?\">\":\"\")+(f!==u.name?`a:${u.name}:`:\"\")+ki(u.locator)+(g?` ${g}`:\"\")}\n`,l+=t(u,s,`${o}${c<a.length-1?\"\\u2502 \":\"  \"}`)}}return s.delete(n),l};return t(r,new Set)+(e>DAe?`\nTree is too large, part of the tree has been dunped\n`:\"\")};var tE=(i=>(i.WORKSPACES=\"workspaces\",i.DEPENDENCIES=\"dependencies\",i.NONE=\"none\",i))(tE||{}),FAe=\"node_modules\",Hu=\"$wsroot$\";var rE=(r,e)=>{let{packageTree:t,hoistingLimits:i,errors:n,preserveSymlinksRequired:s}=O8e(r,e),o=null;if(n.length===0){let a=kAe(t,{hoistingLimits:i});o=K8e(r,a,e)}return{tree:o,errors:n,preserveSymlinksRequired:s}},sa=r=>`${r.name}@${r.reference}`,MO=r=>{let e=new Map;for(let[t,i]of r.entries())if(!i.dirList){let n=e.get(i.locator);n||(n={target:i.target,linkType:i.linkType,locations:[],aliases:i.aliases},e.set(i.locator,n)),n.locations.push(t)}for(let t of e.values())t.locations=t.locations.sort((i,n)=>{let s=i.split(x.delimiter).length,o=n.split(x.delimiter).length;return n===i?0:s!==o?o-s:n>i?1:-1});return e},NAe=(r,e)=>{let t=P.isVirtualLocator(r)?P.devirtualizeLocator(r):r,i=P.isVirtualLocator(e)?P.devirtualizeLocator(e):e;return P.areLocatorsEqual(t,i)},OO=(r,e,t,i)=>{if(r.linkType!==\"SOFT\")return!1;let n=K.toPortablePath(t.resolveVirtual&&e.reference&&e.reference.startsWith(\"virtual:\")?t.resolveVirtual(r.packageLocation):r.packageLocation);return x.contains(i,n)===null},L8e=r=>{let e=r.getPackageInformation(r.topLevel);if(e===null)throw new Error(\"Assertion failed: Expected the top-level package to have been registered\");if(r.findPackageLocator(e.packageLocation)===null)throw new Error(\"Assertion failed: Expected the top-level package to have a physical locator\");let i=K.toPortablePath(e.packageLocation.slice(0,-1)),n=new Map,s={children:new Map},o=r.getDependencyTreeRoots(),a=new Map,l=new Set,c=(f,h)=>{let p=sa(f);if(l.has(p))return;l.add(p);let C=r.getPackageInformation(f);if(C){let y=h?sa(h):\"\";if(sa(f)!==y&&C.linkType===\"SOFT\"&&!OO(C,f,r,i)){let B=TAe(C,f,r);(!a.get(B)||f.reference.startsWith(\"workspace:\"))&&a.set(B,f)}for(let[B,v]of C.packageDependencies)v!==null&&(C.packagePeers.has(B)||c(r.getLocator(B,v),f))}};for(let f of o)c(f,null);let u=i.split(x.sep);for(let f of a.values()){let h=r.getPackageInformation(f),C=K.toPortablePath(h.packageLocation.slice(0,-1)).split(x.sep).slice(u.length),y=s;for(let B of C){let v=y.children.get(B);v||(v={children:new Map},y.children.set(B,v)),y=v}y.workspaceLocator=f}let g=(f,h)=>{if(f.workspaceLocator){let p=sa(h),C=n.get(p);C||(C=new Set,n.set(p,C)),C.add(f.workspaceLocator)}for(let p of f.children.values())g(p,f.workspaceLocator||h)};for(let f of s.children.values())g(f,s.workspaceLocator);return n},O8e=(r,e)=>{let t=[],i=!1,n=new Map,s=L8e(r),o=r.getPackageInformation(r.topLevel);if(o===null)throw new Error(\"Assertion failed: Expected the top-level package to have been registered\");let a=r.findPackageLocator(o.packageLocation);if(a===null)throw new Error(\"Assertion failed: Expected the top-level package to have a physical locator\");let l=K.toPortablePath(o.packageLocation.slice(0,-1)),c={name:a.name,identName:a.name,reference:a.reference,peerNames:o.packagePeers,dependencies:new Set,dependencyKind:1},u=new Map,g=(h,p)=>`${sa(p)}:${h}`,f=(h,p,C,y,B,v,D,T)=>{var re,O;let H=g(h,C),j=u.get(H),$=!!j;!$&&C.name===a.name&&C.reference===a.reference&&(j=c,u.set(H,c));let V=OO(p,C,r,l);if(!j){let F=0;V?F=2:p.linkType===\"SOFT\"&&C.name.endsWith(Hu)&&(F=1),j={name:h,identName:C.name,reference:C.reference,dependencies:new Set,peerNames:F===1?new Set:p.packagePeers,dependencyKind:F},u.set(H,j)}let W;if(V?W=2:B.linkType===\"SOFT\"?W=1:W=0,j.hoistPriority=Math.max(j.hoistPriority||0,W),T&&!V){let F=sa({name:y.identName,reference:y.reference}),ue=n.get(F)||new Set;n.set(F,ue),ue.add(j.name)}let _=new Map(p.packageDependencies);if(e.project){let F=e.project.workspacesByCwd.get(K.toPortablePath(p.packageLocation.slice(0,-1)));if(F){let ue=new Set([...Array.from(F.manifest.peerDependencies.values(),pe=>P.stringifyIdent(pe)),...Array.from(F.manifest.peerDependenciesMeta.keys())]);for(let pe of ue)_.has(pe)||(_.set(pe,v.get(pe)||null),j.peerNames.add(pe))}}let A=sa({name:C.name.replace(Hu,\"\"),reference:C.reference}),Ae=s.get(A);if(Ae)for(let F of Ae)_.set(`${F.name}${Hu}`,F.reference);(p!==B||p.linkType!==\"SOFT\"||!V&&(!e.selfReferencesByCwd||e.selfReferencesByCwd.get(D)))&&y.dependencies.add(j);let ge=C!==a&&p.linkType===\"SOFT\"&&!C.name.endsWith(Hu)&&!V;if(!$&&!ge){let F=new Map;for(let[ue,pe]of _)if(pe!==null){let ke=r.getLocator(ue,pe),Fe=r.getLocator(ue.replace(Hu,\"\"),pe),Ne=r.getPackageInformation(Fe);if(Ne===null)throw new Error(\"Assertion failed: Expected the package to have been registered\");let oe=OO(Ne,ke,r,l);if(e.validateExternalSoftLinks&&e.project&&oe){Ne.packageDependencies.size>0&&(i=!0);for(let[qe,ne]of Ne.packageDependencies)if(ne!==null){let Y=P.parseLocator(Array.isArray(ne)?`${ne[0]}@${ne[1]}`:`${qe}@${ne}`);if(sa(Y)!==sa(ke)){let he=_.get(qe);if(he){let ie=P.parseLocator(Array.isArray(he)?`${he[0]}@${he[1]}`:`${qe}@${he}`);NAe(ie,Y)||t.push({messageName:71,text:`Cannot link ${P.prettyIdent(e.project.configuration,P.parseIdent(ke.name))} into ${P.prettyLocator(e.project.configuration,P.parseLocator(`${C.name}@${C.reference}`))} dependency ${P.prettyLocator(e.project.configuration,Y)} conflicts with parent dependency ${P.prettyLocator(e.project.configuration,ie)}`})}else{let ie=F.get(qe);if(ie){let de=ie.target,_e=P.parseLocator(Array.isArray(de)?`${de[0]}@${de[1]}`:`${qe}@${de}`);NAe(_e,Y)||t.push({messageName:71,text:`Cannot link ${P.prettyIdent(e.project.configuration,P.parseIdent(ke.name))} into ${P.prettyLocator(e.project.configuration,P.parseLocator(`${C.name}@${C.reference}`))} dependency ${P.prettyLocator(e.project.configuration,Y)} conflicts with dependency ${P.prettyLocator(e.project.configuration,_e)} from sibling portal ${P.prettyIdent(e.project.configuration,P.parseIdent(ie.portal.name))}`})}else F.set(qe,{target:Y.reference,portal:ke})}}}}let le=(re=e.hoistingLimitsByCwd)==null?void 0:re.get(D),Be=oe?D:x.relative(l,K.toPortablePath(Ne.packageLocation))||Oe.dot,fe=(O=e.hoistingLimitsByCwd)==null?void 0:O.get(Be);f(ue,Ne,ke,j,p,_,Be,le===\"dependencies\"||fe===\"dependencies\"||fe===\"workspaces\")}}};return f(a.name,o,a,c,o,o.packageDependencies,Oe.dot,!1),{packageTree:c,hoistingLimits:n,errors:t,preserveSymlinksRequired:i}};function TAe(r,e,t){let i=t.resolveVirtual&&e.reference&&e.reference.startsWith(\"virtual:\")?t.resolveVirtual(r.packageLocation):r.packageLocation;return K.toPortablePath(i||r.packageLocation)}function M8e(r,e,t){let i=e.getLocator(r.name.replace(Hu,\"\"),r.reference),n=e.getPackageInformation(i);if(n===null)throw new Error(\"Assertion failed: Expected the package to be registered\");let s,o;return t.pnpifyFs?(o=K.toPortablePath(n.packageLocation),s=\"SOFT\"):(o=TAe(n,r,e),s=n.linkType),{linkType:s,target:o}}var K8e=(r,e,t)=>{let i=new Map,n=(u,g,f)=>{let{linkType:h,target:p}=M8e(u,r,t);return{locator:sa(u),nodePath:g,target:p,linkType:h,aliases:f}},s=u=>{let[g,f]=u.split(\"/\");return f?{scope:Ur(g),name:Ur(f)}:{scope:null,name:Ur(g)}},o=new Set,a=(u,g,f)=>{if(o.has(u))return;o.add(u);let h=Array.from(u.references).sort().join(\"#\");for(let p of u.dependencies){let C=Array.from(p.references).sort().join(\"#\");if(p.identName===u.identName&&C===h)continue;let y=Array.from(p.references).sort(),B={name:p.identName,reference:y[0]},{name:v,scope:D}=s(p.name),T=D?[D,v]:[v],H=x.join(g,FAe),j=x.join(H,...T),$=`${f}/${B.name}`,V=n(B,f,y.slice(1)),W=!1;if(V.linkType===\"SOFT\"&&t.project){let A=t.project.workspacesByCwd.get(V.target.slice(0,-1));W=!!(A&&!A.manifest.name)}let _=V.linkType===\"SOFT\"&&j.startsWith(V.target);if(!p.name.endsWith(Hu)&&!W&&!_){let A=i.get(j);if(A){if(A.dirList)throw new Error(`Assertion failed: ${j} cannot merge dir node with leaf node`);{let O=P.parseLocator(A.locator),F=P.parseLocator(V.locator);if(A.linkType!==V.linkType)throw new Error(`Assertion failed: ${j} cannot merge nodes with different link types ${A.nodePath}/${P.stringifyLocator(O)} and ${f}/${P.stringifyLocator(F)}`);if(O.identHash!==F.identHash)throw new Error(`Assertion failed: ${j} cannot merge nodes with different idents ${A.nodePath}/${P.stringifyLocator(O)} and ${f}/s${P.stringifyLocator(F)}`);V.aliases=[...V.aliases,...A.aliases,P.parseLocator(A.locator).reference]}}i.set(j,V);let Ae=j.split(\"/\"),ge=Ae.indexOf(FAe),re=Ae.length-1;for(;ge>=0&&re>ge;){let O=K.toPortablePath(Ae.slice(0,re).join(x.sep)),F=Ur(Ae[re]),ue=i.get(O);if(!ue)i.set(O,{dirList:new Set([F])});else if(ue.dirList){if(ue.dirList.has(F))break;ue.dirList.add(F)}re--}}a(p,V.linkType===\"SOFT\"?V.target:j,$)}},l=n({name:e.name,reference:Array.from(e.references)[0]},\"\",[]),c=l.target;return i.set(c,l),a(e,c,\"\"),i};var iM={};ut(iM,{PnpInstaller:()=>Yu,PnpLinker:()=>wl,default:()=>dze,getPnpPath:()=>Bl,jsInstallUtils:()=>po,pnpUtils:()=>hE,quotePathIfNeeded:()=>Qle});var wle=Pe(Xr()),Ble=J(\"url\");var LAe={[\"DEFAULT\"]:{collapsed:!1,next:{[\"*\"]:\"DEFAULT\"}},[\"TOP_LEVEL\"]:{collapsed:!1,next:{fallbackExclusionList:\"FALLBACK_EXCLUSION_LIST\",packageRegistryData:\"PACKAGE_REGISTRY_DATA\",[\"*\"]:\"DEFAULT\"}},[\"FALLBACK_EXCLUSION_LIST\"]:{collapsed:!1,next:{[\"*\"]:\"FALLBACK_EXCLUSION_ENTRIES\"}},[\"FALLBACK_EXCLUSION_ENTRIES\"]:{collapsed:!0,next:{[\"*\"]:\"FALLBACK_EXCLUSION_DATA\"}},[\"FALLBACK_EXCLUSION_DATA\"]:{collapsed:!0,next:{[\"*\"]:\"DEFAULT\"}},[\"PACKAGE_REGISTRY_DATA\"]:{collapsed:!1,next:{[\"*\"]:\"PACKAGE_REGISTRY_ENTRIES\"}},[\"PACKAGE_REGISTRY_ENTRIES\"]:{collapsed:!0,next:{[\"*\"]:\"PACKAGE_STORE_DATA\"}},[\"PACKAGE_STORE_DATA\"]:{collapsed:!1,next:{[\"*\"]:\"PACKAGE_STORE_ENTRIES\"}},[\"PACKAGE_STORE_ENTRIES\"]:{collapsed:!0,next:{[\"*\"]:\"PACKAGE_INFORMATION_DATA\"}},[\"PACKAGE_INFORMATION_DATA\"]:{collapsed:!1,next:{packageDependencies:\"PACKAGE_DEPENDENCIES\",[\"*\"]:\"DEFAULT\"}},[\"PACKAGE_DEPENDENCIES\"]:{collapsed:!1,next:{[\"*\"]:\"PACKAGE_DEPENDENCY\"}},[\"PACKAGE_DEPENDENCY\"]:{collapsed:!0,next:{[\"*\"]:\"DEFAULT\"}}};function U8e(r,e,t){let i=\"\";i+=\"[\";for(let n=0,s=r.length;n<s;++n)i+=_Q(String(n),r[n],e,t).replace(/^ +/g,\"\"),n+1<s&&(i+=\", \");return i+=\"]\",i}function H8e(r,e,t){let i=`${t}  `,n=\"\";n+=t,n+=`[\n`;for(let s=0,o=r.length;s<o;++s)n+=i+_Q(String(s),r[s],e,i).replace(/^ +/,\"\"),s+1<o&&(n+=\",\"),n+=`\n`;return n+=t,n+=\"]\",n}function G8e(r,e,t){let i=Object.keys(r),n=\"\";n+=\"{\";for(let s=0,o=i.length,a=0;s<o;++s){let l=i[s],c=r[l];typeof c>\"u\"||(a!==0&&(n+=\", \"),n+=JSON.stringify(l),n+=\": \",n+=_Q(l,c,e,t).replace(/^ +/g,\"\"),a+=1)}return n+=\"}\",n}function Y8e(r,e,t){let i=Object.keys(r),n=`${t}  `,s=\"\";s+=t,s+=`{\n`;let o=0;for(let a=0,l=i.length;a<l;++a){let c=i[a],u=r[c];typeof u>\"u\"||(o!==0&&(s+=\",\",s+=`\n`),s+=n,s+=JSON.stringify(c),s+=\": \",s+=_Q(c,u,e,n).replace(/^ +/g,\"\"),o+=1)}return o!==0&&(s+=`\n`),s+=t,s+=\"}\",s}function _Q(r,e,t,i){let{next:n}=LAe[t],s=n[r]||n[\"*\"];return OAe(e,s,i)}function OAe(r,e,t){let{collapsed:i}=LAe[e];return Array.isArray(r)?i?U8e(r,e,t):H8e(r,e,t):typeof r==\"object\"&&r!==null?i?G8e(r,e,t):Y8e(r,e,t):JSON.stringify(r)}function MAe(r){return OAe(r,\"TOP_LEVEL\",\"\")}function iE(r,e){let t=Array.from(r);Array.isArray(e)||(e=[e]);let i=[];for(let s of e)i.push(t.map(o=>s(o)));let n=t.map((s,o)=>o);return n.sort((s,o)=>{for(let a of i){let l=a[s]<a[o]?-1:a[s]>a[o]?1:0;if(l!==0)return l}return 0}),n.map(s=>t[s])}function j8e(r){let e=new Map,t=iE(r.fallbackExclusionList||[],[({name:i,reference:n})=>i,({name:i,reference:n})=>n]);for(let{name:i,reference:n}of t){let s=e.get(i);typeof s>\"u\"&&e.set(i,s=new Set),s.add(n)}return Array.from(e).map(([i,n])=>[i,Array.from(n)])}function q8e(r){return iE(r.fallbackPool||[],([e])=>e)}function J8e(r){let e=[];for(let[t,i]of iE(r.packageRegistry,([n])=>n===null?\"0\":`1${n}`)){let n=[];e.push([t,n]);for(let[s,{packageLocation:o,packageDependencies:a,packagePeers:l,linkType:c,discardFromLookup:u}]of iE(i,([g])=>g===null?\"0\":`1${g}`)){let g=[];t!==null&&s!==null&&!a.has(t)&&g.push([t,s]);for(let[p,C]of iE(a.entries(),([y])=>y))g.push([p,C]);let f=l&&l.size>0?Array.from(l):void 0,h=u||void 0;n.push([s,{packageLocation:o,packageDependencies:g,packagePeers:f,linkType:c,discardFromLookup:h}])}}return e}function nE(r){return{__info:[\"This file is automatically generated. Do not touch it, or risk\",\"your modifications being lost. We also recommend you not to read\",\"it either without using the @yarnpkg/pnp package, as the data layout\",\"is entirely unspecified and WILL change from a version to another.\"],dependencyTreeRoots:r.dependencyTreeRoots,enableTopLevelFallback:r.enableTopLevelFallback||!1,ignorePatternData:r.ignorePattern||null,fallbackExclusionList:j8e(r),fallbackPool:q8e(r),packageRegistryData:J8e(r)}}var HAe=Pe(UAe());function GAe(r,e){return[r?`${r}\n`:\"\",`/* eslint-disable */\n`,`\"use strict\";\n`,`\n`,`function $$SETUP_STATE(hydrateRuntimeState, basePath) {\n`,e.replace(/^/gm,\"  \"),`}\n`,`\n`,(0,HAe.default)()].join(\"\")}function W8e(r){return JSON.stringify(r,null,2)}function z8e(r){return`'${r.replace(/\\\\/g,\"\\\\\\\\\").replace(/'/g,\"\\\\'\").replace(/\\n/g,`\\\\\n`)}'`}function V8e(r){return[`return hydrateRuntimeState(JSON.parse(${z8e(MAe(r))}), {basePath: basePath || __dirname});\n`].join(\"\")}function X8e(r){return[`var path = require('path');\n`,`var dataLocation = path.resolve(__dirname, ${JSON.stringify(r)});\n`,`return hydrateRuntimeState(require(dataLocation), {basePath: basePath || path.dirname(dataLocation)});\n`].join(\"\")}function YAe(r){let e=nE(r),t=V8e(e);return GAe(r.shebang,t)}function jAe(r){let e=nE(r),t=X8e(r.dataLocation),i=GAe(r.shebang,t);return{dataFile:W8e(e),loaderFile:i}}var hle=J(\"fs\");var ple=J(\"util\");function UO(r,{basePath:e}){let t=K.toPortablePath(e),i=x.resolve(t),n=r.ignorePatternData!==null?new RegExp(r.ignorePatternData):null,s=new Map,o=new Map(r.packageRegistryData.map(([g,f])=>[g,new Map(f.map(([h,p])=>{var D;if(g===null!=(h===null))throw new Error(\"Assertion failed: The name and reference should be null, or neither should\");let C=(D=p.discardFromLookup)!=null?D:!1,y={name:g,reference:h},B=s.get(p.packageLocation);B?(B.discardFromLookup=B.discardFromLookup&&C,C||(B.locator=y)):s.set(p.packageLocation,{locator:y,discardFromLookup:C});let v=null;return[h,{packageDependencies:new Map(p.packageDependencies),packagePeers:new Set(p.packagePeers),linkType:p.linkType,discardFromLookup:C,get packageLocation(){return v||(v=x.join(i,p.packageLocation))}}]}))])),a=new Map(r.fallbackExclusionList.map(([g,f])=>[g,new Set(f)])),l=new Map(r.fallbackPool),c=r.dependencyTreeRoots,u=r.enableTopLevelFallback;return{basePath:t,dependencyTreeRoots:c,enableTopLevelFallback:u,fallbackExclusionList:a,fallbackPool:l,ignorePattern:n,packageLocatorsByLocations:s,packageRegistry:o}}var gE=J(\"module\"),gA=J(\"url\"),XO=J(\"util\");var qi=J(\"url\");var zAe=Pe(J(\"assert\"));var HO=Array.isArray,sE=JSON.stringify,oE=Object.getOwnPropertyNames,Gu=(r,e)=>Object.prototype.hasOwnProperty.call(r,e),GO=(r,e)=>RegExp.prototype.exec.call(r,e),YO=(r,...e)=>RegExp.prototype[Symbol.replace].apply(r,e),Il=(r,...e)=>String.prototype.endsWith.apply(r,e),jO=(r,...e)=>String.prototype.includes.apply(r,e),qO=(r,...e)=>String.prototype.lastIndexOf.apply(r,e),aE=(r,...e)=>String.prototype.indexOf.apply(r,e),qAe=(r,...e)=>String.prototype.replace.apply(r,e),yl=(r,...e)=>String.prototype.slice.apply(r,e),oa=(r,...e)=>String.prototype.startsWith.apply(r,e),JAe=Map,WAe=JSON.parse;function AE(r,e,t){return class extends t{constructor(...i){super(e(...i)),this.code=r,this.name=`${t.name} [${r}]`}}}var VAe=AE(\"ERR_PACKAGE_IMPORT_NOT_DEFINED\",(r,e,t)=>`Package import specifier \"${r}\" is not defined${e?` in package ${e}package.json`:\"\"} imported from ${t}`,TypeError),JO=AE(\"ERR_INVALID_MODULE_SPECIFIER\",(r,e,t=void 0)=>`Invalid module \"${r}\" ${e}${t?` imported from ${t}`:\"\"}`,TypeError),XAe=AE(\"ERR_INVALID_PACKAGE_TARGET\",(r,e,t,i=!1,n=void 0)=>{let s=typeof t==\"string\"&&!i&&t.length&&!oa(t,\"./\");return e===\".\"?((0,zAe.default)(i===!1),`Invalid \"exports\" main target ${sE(t)} defined in the package config ${r}package.json${n?` imported from ${n}`:\"\"}${s?'; targets must start with \"./\"':\"\"}`):`Invalid \"${i?\"imports\":\"exports\"}\" target ${sE(t)} defined for '${e}' in the package config ${r}package.json${n?` imported from ${n}`:\"\"}${s?'; targets must start with \"./\"':\"\"}`},Error),lE=AE(\"ERR_INVALID_PACKAGE_CONFIG\",(r,e,t)=>`Invalid package config ${r}${e?` while importing ${e}`:\"\"}${t?`. ${t}`:\"\"}`,Error),ZAe=AE(\"ERR_PACKAGE_PATH_NOT_EXPORTED\",(r,e,t=void 0)=>e===\".\"?`No \"exports\" main defined in ${r}package.json${t?` imported from ${t}`:\"\"}`:`Package subpath '${e}' is not defined by \"exports\" in ${r}package.json${t?` imported from ${t}`:\"\"}`,Error);var eb=J(\"url\");function _Ae(r,e){let t=Object.create(null);for(let i=0;i<e.length;i++){let n=e[i];Gu(r,n)&&(t[n]=r[n])}return t}var $Q=new JAe;function Z8e(r,e,t,i){let n=$Q.get(r);if(n!==void 0)return n;let s=i(r);if(s===void 0){let h={pjsonPath:r,exists:!1,main:void 0,name:void 0,type:\"none\",exports:void 0,imports:void 0};return $Q.set(r,h),h}let o;try{o=WAe(s)}catch(h){throw new lE(r,(t?`\"${e}\" from `:\"\")+(0,eb.fileURLToPath)(t||e),h.message)}let{imports:a,main:l,name:c,type:u}=_Ae(o,[\"imports\",\"main\",\"name\",\"type\"]),g=Gu(o,\"exports\")?o.exports:void 0;(typeof a!=\"object\"||a===null)&&(a=void 0),typeof l!=\"string\"&&(l=void 0),typeof c!=\"string\"&&(c=void 0),u!==\"module\"&&u!==\"commonjs\"&&(u=\"none\");let f={pjsonPath:r,exists:!0,main:l,name:c,type:u,exports:g,imports:a};return $Q.set(r,f),f}function $Ae(r,e){let t=new URL(\"./package.json\",r);for(;;){let s=t.pathname;if(Il(s,\"node_modules/package.json\"))break;let o=Z8e((0,eb.fileURLToPath)(t),r,void 0,e);if(o.exists)return o;let a=t;if(t=new URL(\"../package.json\",t),t.pathname===a.pathname)break}let i=(0,eb.fileURLToPath)(t),n={pjsonPath:i,exists:!1,main:void 0,name:void 0,type:\"none\",exports:void 0,imports:void 0};return $Q.set(i,n),n}function _8e(r,e,t){throw new VAe(r,e&&(0,qi.fileURLToPath)(new URL(\".\",e)),(0,qi.fileURLToPath)(t))}function $8e(r,e,t,i){let n=`request is not a valid subpath for the \"${t?\"imports\":\"exports\"}\" resolution of ${(0,qi.fileURLToPath)(e)}`;throw new JO(r,n,i&&(0,qi.fileURLToPath)(i))}function cE(r,e,t,i,n){throw typeof e==\"object\"&&e!==null?e=sE(e,null,\"\"):e=`${e}`,new XAe((0,qi.fileURLToPath)(new URL(\".\",t)),r,e,i,n&&(0,qi.fileURLToPath)(n))}var ele=/(^|\\\\|\\/)((\\.|%2e)(\\.|%2e)?|(n|%6e|%4e)(o|%6f|%4f)(d|%64|%44)(e|%65|%45)(_|%5f)(m|%6d|%4d)(o|%6f|%4f)(d|%64|%44)(u|%75|%55)(l|%6c|%4c)(e|%65|%45)(s|%73|%53))(\\\\|\\/|$)/i,tle=/\\*/g;function eze(r,e,t,i,n,s,o,a){if(e!==\"\"&&!s&&r[r.length-1]!==\"/\"&&cE(t,r,i,o,n),!oa(r,\"./\")){if(o&&!oa(r,\"../\")&&!oa(r,\"/\")){let g=!1;try{new URL(r),g=!0}catch{}if(!g)return s?YO(tle,r,()=>e):r+e}cE(t,r,i,o,n)}GO(ele,yl(r,2))!==null&&cE(t,r,i,o,n);let l=new URL(r,i),c=l.pathname,u=new URL(\".\",i).pathname;if(oa(c,u)||cE(t,r,i,o,n),e===\"\")return l;if(GO(ele,e)!==null){let g=s?qAe(t,\"*\",()=>e):t+e;$8e(g,i,o,n)}return s?new URL(YO(tle,l.href,()=>e)):new URL(e,l)}function tze(r){let e=+r;return`${e}`!==r?!1:e>=0&&e<4294967295}function ip(r,e,t,i,n,s,o,a){if(typeof e==\"string\")return eze(e,t,i,r,n,s,o,a);if(HO(e)){if(e.length===0)return null;let l;for(let c=0;c<e.length;c++){let u=e[c],g;try{g=ip(r,u,t,i,n,s,o,a)}catch(f){if(l=f,f.code===\"ERR_INVALID_PACKAGE_TARGET\")continue;throw f}if(g!==void 0){if(g===null){l=null;continue}return g}}if(l==null)return l;throw l}else if(typeof e==\"object\"&&e!==null){let l=oE(e);for(let c=0;c<l.length;c++){let u=l[c];if(tze(u))throw new lE((0,qi.fileURLToPath)(r),n,'\"exports\" cannot contain numeric property keys.')}for(let c=0;c<l.length;c++){let u=l[c];if(u===\"default\"||a.has(u)){let g=e[u],f=ip(r,g,t,i,n,s,o,a);if(f===void 0)continue;return f}}return}else if(e===null)return null;cE(i,e,r,o,n)}function ile(r,e){let t=aE(r,\"*\"),i=aE(e,\"*\"),n=t===-1?r.length:t+1,s=i===-1?e.length:i+1;return n>s?-1:s>n||t===-1?1:i===-1||r.length>e.length?-1:e.length>r.length?1:0}function rze(r,e,t){if(typeof r==\"string\"||HO(r))return!0;if(typeof r!=\"object\"||r===null)return!1;let i=oE(r),n=!1,s=0;for(let o=0;o<i.length;o++){let a=i[o],l=a===\"\"||a[0]!==\".\";if(s++===0)n=l;else if(n!==l)throw new lE((0,qi.fileURLToPath)(e),t,`\"exports\" cannot contain some keys starting with '.' and some not. The exports object must either be an object of package subpath keys or an object of main entry condition name keys only.`)}return n}function WO(r,e,t){throw new ZAe((0,qi.fileURLToPath)(new URL(\".\",e)),r,t&&(0,qi.fileURLToPath)(t))}var rle=new Set;function ize(r,e,t){let i=(0,qi.fileURLToPath)(e);rle.has(i+\"|\"+r)||(rle.add(i+\"|\"+r),process.emitWarning(`Use of deprecated trailing slash pattern mapping \"${r}\" in the \"exports\" field module resolution of the package at ${i}${t?` imported from ${(0,qi.fileURLToPath)(t)}`:\"\"}. Mapping specifiers ending in \"/\" is no longer supported.`,\"DeprecationWarning\",\"DEP0155\"))}function nle({packageJSONUrl:r,packageSubpath:e,exports:t,base:i,conditions:n}){if(rze(t,r,i)&&(t={\".\":t}),Gu(t,e)&&!jO(e,\"*\")&&!Il(e,\"/\")){let l=t[e],c=ip(r,l,\"\",e,i,!1,!1,n);return c==null&&WO(e,r,i),c}let s=\"\",o,a=oE(t);for(let l=0;l<a.length;l++){let c=a[l],u=aE(c,\"*\");if(u!==-1&&oa(e,yl(c,0,u))){Il(e,\"/\")&&ize(e,r,i);let g=yl(c,u+1);e.length>=c.length&&Il(e,g)&&ile(s,c)===1&&qO(c,\"*\")===u&&(s=c,o=yl(e,u,e.length-g.length))}}if(s){let l=t[s],c=ip(r,l,o,s,i,!0,!1,n);return c==null&&WO(e,r,i),c}WO(e,r,i)}function sle({name:r,base:e,conditions:t,readFileSyncFn:i}){if(r===\"#\"||oa(r,\"#/\")||Il(r,\"/\")){let o=\"is not a valid internal imports specifier name\";throw new JO(r,o,(0,qi.fileURLToPath)(e))}let n,s=$Ae(e,i);if(s.exists){n=(0,qi.pathToFileURL)(s.pjsonPath);let o=s.imports;if(o)if(Gu(o,r)&&!jO(r,\"*\")){let a=ip(n,o[r],\"\",r,e,!1,!0,t);if(a!=null)return a}else{let a=\"\",l,c=oE(o);for(let u=0;u<c.length;u++){let g=c[u],f=aE(g,\"*\");if(f!==-1&&oa(r,yl(g,0,f))){let h=yl(g,f+1);r.length>=g.length&&Il(r,h)&&ile(a,g)===1&&qO(g,\"*\")===f&&(a=g,l=yl(r,f,r.length-h.length))}}if(a){let u=o[a],g=ip(n,u,l,a,e,!0,!0,t);if(g!=null)return g}}}_8e(r,n,e)}var nze=new Set([\"BUILTIN_NODE_RESOLUTION_FAILED\",\"MISSING_DEPENDENCY\",\"MISSING_PEER_DEPENDENCY\",\"QUALIFIED_PATH_RESOLUTION_FAILED\",\"UNDECLARED_DEPENDENCY\"]);function ri(r,e,t={},i){i!=null||(i=nze.has(r)?\"MODULE_NOT_FOUND\":r);let n={configurable:!0,writable:!0,enumerable:!1};return Object.defineProperties(new Error(e),{code:{...n,value:i},pnpCode:{...n,value:r},data:{...n,value:t}})}function ho(r){return K.normalize(K.fromPortablePath(r))}var lle=Pe(ale());function cle(r){return sze(),VO[r]}var VO;function sze(){VO||(VO={\"--conditions\":[],...Ale(oze()),...Ale(process.execArgv)})}function Ale(r){return(0,lle.default)({\"--conditions\":[String],\"-C\":\"--conditions\"},{argv:r,permissive:!0})}function oze(){let r=[],e=aze(process.env.NODE_OPTIONS||\"\",r);return r.length,e}function aze(r,e){let t=[],i=!1,n=!0;for(let s=0;s<r.length;++s){let o=r[s];if(o===\"\\\\\"&&i){if(s+1===r.length)return e.push(`invalid value for NODE_OPTIONS (invalid escape)\n`),t;o=r[++s]}else if(o===\" \"&&!i){n=!0;continue}else if(o==='\"'){i=!i;continue}n?(t.push(o),n=!1):t[t.length-1]+=o}return i&&e.push(`invalid value for NODE_OPTIONS (unterminated string)\n`),t}var gle=J(\"module\");var[Ji,aa]=process.versions.node.split(\".\").map(r=>parseInt(r,10)),sBt=Ji>16||Ji===16&&aa>=12,oBt=Ji>17||Ji===17&&aa>=5||Ji===16&&aa>=15,aBt=Ji>17||Ji===17&&aa>=1||Ji===16&&aa>14,ule=Ji>19||Ji===19&&aa>=2||Ji===18&&aa>=13,ABt=Ji>19||Ji===19&&aa>=3,lBt=Ji>18||Ji===18&&aa>=1||Ji===16&&aa>=17;var Aze=new Set(gle.Module.builtinModules||Object.keys(process.binding(\"natives\"))),tb=r=>r.startsWith(\"node:\")||Aze.has(r);function fle(r){if(process.env.WATCH_REPORT_DEPENDENCIES&&process.send)if(r=r.map(e=>K.fromPortablePath(Br.resolveVirtual(K.toPortablePath(e)))),ule)process.send({\"watch:require\":r});else for(let e of r)process.send({\"watch:require\":e})}function ZO(r,e){let t=Number(process.env.PNP_ALWAYS_WARN_ON_FALLBACK)>0,i=Number(process.env.PNP_DEBUG_LEVEL),n=/^(?![a-zA-Z]:[\\\\/]|\\\\\\\\|\\.{0,2}(?:\\/|$))((?:node:)?(?:@[^/]+\\/)?[^/]+)\\/*(.*|)$/,s=/^(\\/|\\.{1,2}(\\/|$))/,o=/\\/$/,a=/^\\.{0,2}\\//,l={name:null,reference:null},c=[],u=new Set;if(r.enableTopLevelFallback===!0&&c.push(l),e.compatibilityMode!==!1)for(let oe of[\"react-scripts\",\"gatsby\"]){let le=r.packageRegistry.get(oe);if(le)for(let Be of le.keys()){if(Be===null)throw new Error(\"Assertion failed: This reference shouldn't be null\");c.push({name:oe,reference:Be})}}let{ignorePattern:g,packageRegistry:f,packageLocatorsByLocations:h}=r;function p(oe,le){return{fn:oe,args:le,error:null,result:null}}function C(oe){var qe,ne,Y,he,ie,de;let le=(Y=(ne=(qe=process.stderr)==null?void 0:qe.hasColors)==null?void 0:ne.call(qe))!=null?Y:process.stdout.isTTY,Be=(_e,Pt)=>`\\x1B[${_e}m${Pt}\\x1B[0m`,fe=oe.error;console.error(fe?Be(\"31;1\",`\\u2716 ${(he=oe.error)==null?void 0:he.message.replace(/\\n.*/s,\"\")}`):Be(\"33;1\",\"\\u203C Resolution\")),oe.args.length>0&&console.error();for(let _e of oe.args)console.error(`  ${Be(\"37;1\",\"In \\u2190\")} ${(0,XO.inspect)(_e,{colors:le,compact:!0})}`);oe.result&&(console.error(),console.error(`  ${Be(\"37;1\",\"Out \\u2192\")} ${(0,XO.inspect)(oe.result,{colors:le,compact:!0})}`));let ae=(de=(ie=new Error().stack.match(/(?<=^ +)at.*/gm))==null?void 0:ie.slice(2))!=null?de:[];if(ae.length>0){console.error();for(let _e of ae)console.error(`  ${Be(\"38;5;244\",_e)}`)}console.error()}function y(oe,le){if(e.allowDebug===!1)return le;if(Number.isFinite(i)){if(i>=2)return(...Be)=>{let fe=p(oe,Be);try{return fe.result=le(...Be)}catch(ae){throw fe.error=ae}finally{C(fe)}};if(i>=1)return(...Be)=>{try{return le(...Be)}catch(fe){let ae=p(oe,Be);throw ae.error=fe,C(ae),fe}}}return le}function B(oe){let le=A(oe);if(!le)throw ri(\"INTERNAL\",\"Couldn't find a matching entry in the dependency tree for the specified parent (this is probably an internal error)\");return le}function v(oe){if(oe.name===null)return!0;for(let le of r.dependencyTreeRoots)if(le.name===oe.name&&le.reference===oe.reference)return!0;return!1}let D=new Set([\"node\",\"require\",...cle(\"--conditions\")]);function T(oe,le=D,Be){let fe=re(x.join(oe,\"internal.js\"),{resolveIgnored:!0,includeDiscardFromLookup:!0});if(fe===null)throw ri(\"INTERNAL\",`The locator that owns the \"${oe}\" path can't be found inside the dependency tree (this is probably an internal error)`);let{packageLocation:ae}=B(fe),qe=x.join(ae,xt.manifest);if(!e.fakeFs.existsSync(qe))return null;let ne=JSON.parse(e.fakeFs.readFileSync(qe,\"utf8\"));if(ne.exports==null)return null;let Y=x.contains(ae,oe);if(Y===null)throw ri(\"INTERNAL\",\"unqualifiedPath doesn't contain the packageLocation (this is probably an internal error)\");Y!==\".\"&&!a.test(Y)&&(Y=`./${Y}`);try{let he=nle({packageJSONUrl:(0,gA.pathToFileURL)(K.fromPortablePath(qe)),packageSubpath:Y,exports:ne.exports,base:Be?(0,gA.pathToFileURL)(K.fromPortablePath(Be)):null,conditions:le});return K.toPortablePath((0,gA.fileURLToPath)(he))}catch(he){throw ri(\"EXPORTS_RESOLUTION_FAILED\",he.message,{unqualifiedPath:ho(oe),locator:fe,pkgJson:ne,subpath:ho(Y),conditions:le},he.code)}}function H(oe,le,{extensions:Be}){let fe;try{le.push(oe),fe=e.fakeFs.statSync(oe)}catch{}if(fe&&!fe.isDirectory())return e.fakeFs.realpathSync(oe);if(fe&&fe.isDirectory()){let ae;try{ae=JSON.parse(e.fakeFs.readFileSync(x.join(oe,xt.manifest),\"utf8\"))}catch{}let qe;if(ae&&ae.main&&(qe=x.resolve(oe,ae.main)),qe&&qe!==oe){let ne=H(qe,le,{extensions:Be});if(ne!==null)return ne}}for(let ae=0,qe=Be.length;ae<qe;ae++){let ne=`${oe}${Be[ae]}`;if(le.push(ne),e.fakeFs.existsSync(ne))return ne}if(fe&&fe.isDirectory())for(let ae=0,qe=Be.length;ae<qe;ae++){let ne=x.format({dir:oe,name:\"index\",ext:Be[ae]});if(le.push(ne),e.fakeFs.existsSync(ne))return ne}return null}function j(oe){let le=new gE.Module(oe,null);return le.filename=oe,le.paths=gE.Module._nodeModulePaths(oe),le}function $(oe,le){return le.endsWith(\"/\")&&(le=x.join(le,\"internal.js\")),gE.Module._resolveFilename(K.fromPortablePath(oe),j(K.fromPortablePath(le)),!1,{plugnplay:!1})}function V(oe){if(g===null)return!1;let le=x.contains(r.basePath,oe);return le===null?!1:!!g.test(le.replace(/\\/$/,\"\"))}let W={std:3,resolveVirtual:1,getAllLocators:1},_=l;function A({name:oe,reference:le}){let Be=f.get(oe);if(!Be)return null;let fe=Be.get(le);return fe||null}function Ae({name:oe,reference:le}){let Be=[];for(let[fe,ae]of f)if(fe!==null)for(let[qe,ne]of ae)qe===null||ne.packageDependencies.get(oe)!==le||fe===oe&&qe===le||Be.push({name:fe,reference:qe});return Be}function ge(oe,le){let Be=new Map,fe=new Set,ae=ne=>{let Y=JSON.stringify(ne.name);if(fe.has(Y))return;fe.add(Y);let he=Ae(ne);for(let ie of he)if(B(ie).packagePeers.has(oe))ae(ie);else{let _e=Be.get(ie.name);typeof _e>\"u\"&&Be.set(ie.name,_e=new Set),_e.add(ie.reference)}};ae(le);let qe=[];for(let ne of[...Be.keys()].sort())for(let Y of[...Be.get(ne)].sort())qe.push({name:ne,reference:Y});return qe}function re(oe,{resolveIgnored:le=!1,includeDiscardFromLookup:Be=!1}={}){if(V(oe)&&!le)return null;let fe=x.relative(r.basePath,oe);fe.match(s)||(fe=`./${fe}`),fe.endsWith(\"/\")||(fe=`${fe}/`);do{let ae=h.get(fe);if(typeof ae>\"u\"||ae.discardFromLookup&&!Be){fe=fe.substring(0,fe.lastIndexOf(\"/\",fe.length-2)+1);continue}return ae.locator}while(fe!==\"\");return null}function O(oe){try{return e.fakeFs.readFileSync(K.toPortablePath(oe),\"utf8\")}catch(le){if(le.code===\"ENOENT\")return;throw le}}function F(oe,le,{considerBuiltins:Be=!0}={}){if(oe.startsWith(\"#\"))throw new Error(\"resolveToUnqualified can not handle private import mappings\");if(oe===\"pnpapi\")return K.toPortablePath(e.pnpapiResolution);if(Be&&tb(oe))return null;let fe=ho(oe),ae=le&&ho(le);if(le&&V(le)&&(!x.isAbsolute(oe)||re(oe)===null)){let Y=$(oe,le);if(Y===!1)throw ri(\"BUILTIN_NODE_RESOLUTION_FAILED\",`The builtin node resolution algorithm was unable to resolve the requested module (it didn't go through the pnp resolver because the issuer was explicitely ignored by the regexp)\n\nRequire request: \"${fe}\"\nRequired by: ${ae}\n`,{request:fe,issuer:ae});return K.toPortablePath(Y)}let qe,ne=oe.match(n);if(ne){if(!le)throw ri(\"API_ERROR\",\"The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute\",{request:fe,issuer:ae});let[,Y,he]=ne,ie=re(le);if(!ie){let hr=$(oe,le);if(hr===!1)throw ri(\"BUILTIN_NODE_RESOLUTION_FAILED\",`The builtin node resolution algorithm was unable to resolve the requested module (it didn't go through the pnp resolver because the issuer doesn't seem to be part of the Yarn-managed dependency tree).\n\nRequire path: \"${fe}\"\nRequired by: ${ae}\n`,{request:fe,issuer:ae});return K.toPortablePath(hr)}let _e=B(ie).packageDependencies.get(Y),Pt=null;if(_e==null&&ie.name!==null){let hr=r.fallbackExclusionList.get(ie.name);if(!hr||!hr.has(ie.reference)){for(let ni=0,Ks=c.length;ni<Ks;++ni){let Ii=B(c[ni]).packageDependencies.get(Y);if(Ii!=null){t?Pt=Ii:_e=Ii;break}}if(r.enableTopLevelFallback&&_e==null&&Pt===null){let ni=r.fallbackPool.get(Y);ni!=null&&(Pt=ni)}}}let It=null;if(_e===null)if(v(ie))It=ri(\"MISSING_PEER_DEPENDENCY\",`Your application tried to access ${Y} (a peer dependency); this isn't allowed as there is no ancestor to satisfy the requirement. Use a devDependency if needed.\n\nRequired package: ${Y}${Y!==fe?` (via \"${fe}\")`:\"\"}\nRequired by: ${ae}\n`,{request:fe,issuer:ae,dependencyName:Y});else{let hr=ge(Y,ie);hr.every(fi=>v(fi))?It=ri(\"MISSING_PEER_DEPENDENCY\",`${ie.name} tried to access ${Y} (a peer dependency) but it isn't provided by your application; this makes the require call ambiguous and unsound.\n\nRequired package: ${Y}${Y!==fe?` (via \"${fe}\")`:\"\"}\nRequired by: ${ie.name}@${ie.reference} (via ${ae})\n${hr.map(fi=>`Ancestor breaking the chain: ${fi.name}@${fi.reference}\n`).join(\"\")}\n`,{request:fe,issuer:ae,issuerLocator:Object.assign({},ie),dependencyName:Y,brokenAncestors:hr}):It=ri(\"MISSING_PEER_DEPENDENCY\",`${ie.name} tried to access ${Y} (a peer dependency) but it isn't provided by its ancestors; this makes the require call ambiguous and unsound.\n\nRequired package: ${Y}${Y!==fe?` (via \"${fe}\")`:\"\"}\nRequired by: ${ie.name}@${ie.reference} (via ${ae})\n\n${hr.map(fi=>`Ancestor breaking the chain: ${fi.name}@${fi.reference}\n`).join(\"\")}\n`,{request:fe,issuer:ae,issuerLocator:Object.assign({},ie),dependencyName:Y,brokenAncestors:hr})}else _e===void 0&&(!Be&&tb(oe)?v(ie)?It=ri(\"UNDECLARED_DEPENDENCY\",`Your application tried to access ${Y}. While this module is usually interpreted as a Node builtin, your resolver is running inside a non-Node resolution context where such builtins are ignored. Since ${Y} isn't otherwise declared in your dependencies, this makes the require call ambiguous and unsound.\n\nRequired package: ${Y}${Y!==fe?` (via \"${fe}\")`:\"\"}\nRequired by: ${ae}\n`,{request:fe,issuer:ae,dependencyName:Y}):It=ri(\"UNDECLARED_DEPENDENCY\",`${ie.name} tried to access ${Y}. While this module is usually interpreted as a Node builtin, your resolver is running inside a non-Node resolution context where such builtins are ignored. Since ${Y} isn't otherwise declared in ${ie.name}'s dependencies, this makes the require call ambiguous and unsound.\n\nRequired package: ${Y}${Y!==fe?` (via \"${fe}\")`:\"\"}\nRequired by: ${ae}\n`,{request:fe,issuer:ae,issuerLocator:Object.assign({},ie),dependencyName:Y}):v(ie)?It=ri(\"UNDECLARED_DEPENDENCY\",`Your application tried to access ${Y}, but it isn't declared in your dependencies; this makes the require call ambiguous and unsound.\n\nRequired package: ${Y}${Y!==fe?` (via \"${fe}\")`:\"\"}\nRequired by: ${ae}\n`,{request:fe,issuer:ae,dependencyName:Y}):It=ri(\"UNDECLARED_DEPENDENCY\",`${ie.name} tried to access ${Y}, but it isn't declared in its dependencies; this makes the require call ambiguous and unsound.\n\nRequired package: ${Y}${Y!==fe?` (via \"${fe}\")`:\"\"}\nRequired by: ${ie.name}@${ie.reference} (via ${ae})\n`,{request:fe,issuer:ae,issuerLocator:Object.assign({},ie),dependencyName:Y}));if(_e==null){if(Pt===null||It===null)throw It||new Error(\"Assertion failed: Expected an error to have been set\");_e=Pt;let hr=It.message.replace(/\\n.*/g,\"\");It.message=hr,!u.has(hr)&&i!==0&&(u.add(hr),process.emitWarning(It))}let Or=Array.isArray(_e)?{name:_e[0],reference:_e[1]}:{name:Y,reference:_e},ii=B(Or);if(!ii.packageLocation)throw ri(\"MISSING_DEPENDENCY\",`A dependency seems valid but didn't get installed for some reason. This might be caused by a partial install, such as dev vs prod.\n\nRequired package: ${Or.name}@${Or.reference}${Or.name!==fe?` (via \"${fe}\")`:\"\"}\nRequired by: ${ie.name}@${ie.reference} (via ${ae})\n`,{request:fe,issuer:ae,dependencyLocator:Object.assign({},Or)});let gi=ii.packageLocation;he?qe=x.join(gi,he):qe=gi}else if(x.isAbsolute(oe))qe=x.normalize(oe);else{if(!le)throw ri(\"API_ERROR\",\"The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute\",{request:fe,issuer:ae});let Y=x.resolve(le);le.match(o)?qe=x.normalize(x.join(Y,oe)):qe=x.normalize(x.join(x.dirname(Y),oe))}return x.normalize(qe)}function ue(oe,le,Be=D,fe){if(s.test(oe))return le;let ae=T(le,Be,fe);return ae?x.normalize(ae):le}function pe(oe,{extensions:le=Object.keys(gE.Module._extensions)}={}){var ae,qe;let Be=[],fe=H(oe,Be,{extensions:le});if(fe)return x.normalize(fe);{fle(Be.map(he=>K.fromPortablePath(he)));let ne=ho(oe),Y=re(oe);if(Y){let{packageLocation:he}=B(Y),ie=!0;try{e.fakeFs.accessSync(he)}catch(de){if((de==null?void 0:de.code)===\"ENOENT\")ie=!1;else{let _e=((qe=(ae=de==null?void 0:de.message)!=null?ae:de)!=null?qe:\"empty exception thrown\").replace(/^[A-Z]/,Pt=>Pt.toLowerCase());throw ri(\"QUALIFIED_PATH_RESOLUTION_FAILED\",`Required package exists but could not be accessed (${_e}).\n\nMissing package: ${Y.name}@${Y.reference}\nExpected package location: ${ho(he)}\n`,{unqualifiedPath:ne,extensions:le})}}if(!ie){let de=he.includes(\"/unplugged/\")?\"Required unplugged package missing from disk. This may happen when switching branches without running installs (unplugged packages must be fully materialized on disk to work).\":\"Required package missing from disk. If you keep your packages inside your repository then restarting the Node process may be enough. Otherwise, try to run an install first.\";throw ri(\"QUALIFIED_PATH_RESOLUTION_FAILED\",`${de}\n\nMissing package: ${Y.name}@${Y.reference}\nExpected package location: ${ho(he)}\n`,{unqualifiedPath:ne,extensions:le})}}throw ri(\"QUALIFIED_PATH_RESOLUTION_FAILED\",`Qualified path resolution failed: we looked for the following paths, but none could be accessed.\n\nSource path: ${ne}\n${Be.map(he=>`Not found: ${ho(he)}\n`).join(\"\")}`,{unqualifiedPath:ne,extensions:le})}}function ke(oe,le,Be){var ae;if(!le)throw new Error(\"Assertion failed: An issuer is required to resolve private import mappings\");let fe=sle({name:oe,base:(0,gA.pathToFileURL)(K.fromPortablePath(le)),conditions:(ae=Be.conditions)!=null?ae:D,readFileSyncFn:O});if(fe instanceof gA.URL)return pe(K.toPortablePath((0,gA.fileURLToPath)(fe)),{extensions:Be.extensions});if(fe.startsWith(\"#\"))throw new Error(\"Mapping from one private import to another isn't allowed\");return Fe(fe,le,Be)}function Fe(oe,le,Be={}){try{if(oe.startsWith(\"#\"))return ke(oe,le,Be);let{considerBuiltins:fe,extensions:ae,conditions:qe}=Be,ne=F(oe,le,{considerBuiltins:fe});if(oe===\"pnpapi\")return ne;if(ne===null)return null;let Y=()=>le!==null?V(le):!1,he=(!fe||!tb(oe))&&!Y()?ue(oe,ne,qe,le):ne;return pe(he,{extensions:ae})}catch(fe){throw Object.prototype.hasOwnProperty.call(fe,\"pnpCode\")&&Object.assign(fe.data,{request:ho(oe),issuer:le&&ho(le)}),fe}}function Ne(oe){let le=x.normalize(oe),Be=Br.resolveVirtual(le);return Be!==le?Be:null}return{VERSIONS:W,topLevel:_,getLocator:(oe,le)=>Array.isArray(le)?{name:le[0],reference:le[1]}:{name:oe,reference:le},getDependencyTreeRoots:()=>[...r.dependencyTreeRoots],getAllLocators(){let oe=[];for(let[le,Be]of f)for(let fe of Be.keys())le!==null&&fe!==null&&oe.push({name:le,reference:fe});return oe},getPackageInformation:oe=>{let le=A(oe);if(le===null)return null;let Be=K.fromPortablePath(le.packageLocation);return{...le,packageLocation:Be}},findPackageLocator:oe=>re(K.toPortablePath(oe)),resolveToUnqualified:y(\"resolveToUnqualified\",(oe,le,Be)=>{let fe=le!==null?K.toPortablePath(le):null,ae=F(K.toPortablePath(oe),fe,Be);return ae===null?null:K.fromPortablePath(ae)}),resolveUnqualified:y(\"resolveUnqualified\",(oe,le)=>K.fromPortablePath(pe(K.toPortablePath(oe),le))),resolveRequest:y(\"resolveRequest\",(oe,le,Be)=>{let fe=le!==null?K.toPortablePath(le):null,ae=Fe(K.toPortablePath(oe),fe,Be);return ae===null?null:K.fromPortablePath(ae)}),resolveVirtual:y(\"resolveVirtual\",oe=>{let le=Ne(K.toPortablePath(oe));return le!==null?K.fromPortablePath(le):null})}}var SBt=(0,ple.promisify)(hle.readFile);var dle=(r,e,t)=>{let i=nE(r),n=UO(i,{basePath:e}),s=K.join(e,xt.pnpCjs);return ZO(n,{fakeFs:t,pnpapiResolution:s})};var $O=Pe(mle());var po={};ut(po,{checkAndReportManifestCompatibility:()=>Ile,checkManifestCompatibility:()=>Ele,extractBuildScripts:()=>rb,getExtractHint:()=>eM,hasBindingGyp:()=>tM});function Ele(r){return P.isPackageCompatible(r,ws.getArchitectureSet())}function Ile(r,e,{configuration:t,report:i}){return Ele(r)?!0:(i==null||i.reportWarningOnce(76,`${P.prettyLocator(t,r)} The ${ws.getArchitectureName()} architecture is incompatible with this package, ${e} skipped.`),!1)}function rb(r,e,t,{configuration:i,report:n}){let s=[];for(let a of[\"preinstall\",\"install\",\"postinstall\"])e.manifest.scripts.has(a)&&s.push([0,a]);return!e.manifest.scripts.has(\"install\")&&e.misc.hasBindingGyp&&s.push([1,\"node-gyp rebuild\"]),s.length===0?[]:r.linkType!==\"HARD\"?(n==null||n.reportWarningOnce(6,`${P.prettyLocator(i,r)} lists build scripts, but is referenced through a soft link. Soft links don't support build scripts, so they'll be ignored.`),[]):t&&t.built===!1?(n==null||n.reportInfoOnce(5,`${P.prettyLocator(i,r)} lists build scripts, but its build has been explicitly disabled through configuration.`),[]):!i.get(\"enableScripts\")&&!t.built?(n==null||n.reportWarningOnce(4,`${P.prettyLocator(i,r)} lists build scripts, but all build scripts have been disabled.`),[]):Ile(r,\"build\",{configuration:i,report:n})?s:[]}var cze=new Set([\".exe\",\".h\",\".hh\",\".hpp\",\".c\",\".cc\",\".cpp\",\".java\",\".jar\",\".node\"]);function eM(r){return r.packageFs.getExtractHint({relevantExtensions:cze})}function tM(r){let e=x.join(r.prefixPath,\"binding.gyp\");return r.packageFs.existsSync(e)}var hE={};ut(hE,{getUnpluggedPath:()=>fE});function fE(r,{configuration:e}){return x.resolve(e.get(\"pnpUnpluggedFolder\"),P.slugifyLocator(r))}var uze=new Set([P.makeIdent(null,\"open\").identHash,P.makeIdent(null,\"opn\").identHash]),wl=class{constructor(){this.mode=\"strict\";this.pnpCache=new Map}supportsPackage(e,t){return this.isEnabled(t)}async findPackageLocation(e,t){if(!this.isEnabled(t))throw new Error(\"Assertion failed: Expected the PnP linker to be enabled\");let i=Bl(t.project).cjs;if(!M.existsSync(i))throw new be(`The project in ${ee.pretty(t.project.configuration,`${t.project.cwd}/package.json`,ee.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let n=Ie.getFactoryWithDefault(this.pnpCache,i,()=>Ie.dynamicRequire(i,{cachingStrategy:Ie.CachingStrategy.FsTime})),s={name:P.stringifyIdent(e),reference:e.reference},o=n.getPackageInformation(s);if(!o)throw new be(`Couldn't find ${P.prettyLocator(t.project.configuration,e)} in the currently installed PnP map - running an install might help`);return K.toPortablePath(o.packageLocation)}async findPackageLocator(e,t){if(!this.isEnabled(t))return null;let i=Bl(t.project).cjs;if(!M.existsSync(i))return null;let s=Ie.getFactoryWithDefault(this.pnpCache,i,()=>Ie.dynamicRequire(i,{cachingStrategy:Ie.CachingStrategy.FsTime})).findPackageLocator(K.fromPortablePath(e));return s?P.makeLocator(P.parseIdent(s.name),s.reference):null}makeInstaller(e){return new Yu(e)}isEnabled(e){return!(e.project.configuration.get(\"nodeLinker\")!==\"pnp\"||e.project.configuration.get(\"pnpMode\")!==this.mode)}},Yu=class{constructor(e){this.opts=e;this.mode=\"strict\";this.asyncActions=new Ie.AsyncActions(10);this.packageRegistry=new Map;this.virtualTemplates=new Map;this.isESMLoaderRequired=!1;this.customData={store:new Map};this.unpluggedPaths=new Set;this.opts=e}getCustomDataKey(){return JSON.stringify({name:\"PnpInstaller\",version:2})}attachCustomData(e){this.customData=e}async installPackage(e,t,i){let n=P.stringifyIdent(e),s=e.reference,o=!!this.opts.project.tryWorkspaceByLocator(e),a=P.isVirtualLocator(e),l=e.peerDependencies.size>0&&!a,c=!l&&!o,u=!l&&e.linkType!==\"SOFT\",g,f;if(c||u){let D=a?P.devirtualizeLocator(e):e;g=this.customData.store.get(D.locatorHash),typeof g>\"u\"&&(g=await gze(t),e.linkType===\"HARD\"&&this.customData.store.set(D.locatorHash,g)),g.manifest.type===\"module\"&&(this.isESMLoaderRequired=!0),f=this.opts.project.getDependencyMeta(D,e.version)}let h=c?rb(e,g,f,{configuration:this.opts.project.configuration,report:this.opts.report}):[],p=u?await this.unplugPackageIfNeeded(e,g,t,f,i):t.packageFs;if(x.isAbsolute(t.prefixPath))throw new Error(`Assertion failed: Expected the prefix path (${t.prefixPath}) to be relative to the parent`);let C=x.resolve(p.getRealPath(),t.prefixPath),y=rM(this.opts.project.cwd,C),B=new Map,v=new Set;if(a){for(let D of e.peerDependencies.values())B.set(P.stringifyIdent(D),null),v.add(P.stringifyIdent(D));if(!o){let D=P.devirtualizeLocator(e);this.virtualTemplates.set(D.locatorHash,{location:rM(this.opts.project.cwd,Br.resolveVirtual(C)),locator:D})}}return Ie.getMapWithDefault(this.packageRegistry,n).set(s,{packageLocation:y,packageDependencies:B,packagePeers:v,linkType:e.linkType,discardFromLookup:t.discardFromLookup||!1}),{packageLocation:C,buildDirective:h.length>0?h:null}}async attachInternalDependencies(e,t){let i=this.getPackageInformation(e);for(let[n,s]of t){let o=P.areIdentsEqual(n,s)?s.reference:[P.stringifyIdent(s),s.reference];i.packageDependencies.set(P.stringifyIdent(n),o)}}async attachExternalDependents(e,t){for(let i of t)this.getDiskInformation(i).packageDependencies.set(P.stringifyIdent(e),e.reference)}async finalizeInstall(){if(this.opts.project.configuration.get(\"pnpMode\")!==this.mode)return;let e=Bl(this.opts.project);if(M.existsSync(e.cjsLegacy)&&(this.opts.report.reportWarning(0,`Removing the old ${ee.pretty(this.opts.project.configuration,xt.pnpJs,ee.Type.PATH)} file. You might need to manually update existing references to reference the new ${ee.pretty(this.opts.project.configuration,xt.pnpCjs,ee.Type.PATH)} file. If you use Editor SDKs, you'll have to rerun ${ee.pretty(this.opts.project.configuration,\"yarn sdks\",ee.Type.CODE)}.`),await M.removePromise(e.cjsLegacy)),this.isEsmEnabled()||await M.removePromise(e.esmLoader),this.opts.project.configuration.get(\"nodeLinker\")!==\"pnp\"){await M.removePromise(e.cjs),await M.removePromise(this.opts.project.configuration.get(\"pnpDataPath\")),await M.removePromise(e.esmLoader),await M.removePromise(this.opts.project.configuration.get(\"pnpUnpluggedFolder\"));return}for(let{locator:u,location:g}of this.virtualTemplates.values())Ie.getMapWithDefault(this.packageRegistry,P.stringifyIdent(u)).set(u.reference,{packageLocation:g,packageDependencies:new Map,packagePeers:new Set,linkType:\"SOFT\",discardFromLookup:!1});this.packageRegistry.set(null,new Map([[null,this.getPackageInformation(this.opts.project.topLevelWorkspace.anchoredLocator)]]));let t=this.opts.project.configuration.get(\"pnpFallbackMode\"),i=this.opts.project.workspaces.map(({anchoredLocator:u})=>({name:P.stringifyIdent(u),reference:u.reference})),n=t!==\"none\",s=[],o=new Map,a=Ie.buildIgnorePattern([\".yarn/sdks/**\",...this.opts.project.configuration.get(\"pnpIgnorePatterns\")]),l=this.packageRegistry,c=this.opts.project.configuration.get(\"pnpShebang\");if(t===\"dependencies-only\")for(let u of this.opts.project.storedPackages.values())this.opts.project.tryWorkspaceByLocator(u)&&s.push({name:P.stringifyIdent(u),reference:u.reference});return await this.asyncActions.wait(),await this.finalizeInstallWithPnp({dependencyTreeRoots:i,enableTopLevelFallback:n,fallbackExclusionList:s,fallbackPool:o,ignorePattern:a,packageRegistry:l,shebang:c}),{customData:this.customData}}async transformPnpSettings(e){}isEsmEnabled(){if(this.opts.project.configuration.sources.has(\"pnpEnableEsmLoader\"))return this.opts.project.configuration.get(\"pnpEnableEsmLoader\");if(this.isESMLoaderRequired)return!0;for(let e of this.opts.project.workspaces)if(e.manifest.type===\"module\")return!0;return!1}async finalizeInstallWithPnp(e){let t=Bl(this.opts.project),i=this.opts.project.configuration.get(\"pnpDataPath\"),n=await this.locateNodeModules(e.ignorePattern);if(n.length>0){this.opts.report.reportWarning(31,\"One or more node_modules have been detected and will be removed. This operation may take some time.\");for(let o of n)await M.removePromise(o)}if(await this.transformPnpSettings(e),this.opts.project.configuration.get(\"pnpEnableInlining\")){let o=YAe(e);await M.changeFilePromise(t.cjs,o,{automaticNewlines:!0,mode:493}),await M.removePromise(i)}else{let o=x.relative(x.dirname(t.cjs),i),{dataFile:a,loaderFile:l}=jAe({...e,dataLocation:o});await M.changeFilePromise(t.cjs,l,{automaticNewlines:!0,mode:493}),await M.changeFilePromise(i,a,{automaticNewlines:!0,mode:420})}this.isEsmEnabled()&&(this.opts.report.reportWarning(0,\"ESM support for PnP uses the experimental loader API and is therefore experimental\"),await M.changeFilePromise(t.esmLoader,(0,$O.default)(),{automaticNewlines:!0,mode:420}));let s=this.opts.project.configuration.get(\"pnpUnpluggedFolder\");if(this.unpluggedPaths.size===0)await M.removePromise(s);else for(let o of await M.readdirPromise(s)){let a=x.resolve(s,o);this.unpluggedPaths.has(a)||await M.removePromise(a)}}async locateNodeModules(e){let t=[],i=e?new RegExp(e):null;for(let n of this.opts.project.workspaces){let s=x.join(n.cwd,\"node_modules\");if(i&&i.test(x.relative(this.opts.project.cwd,n.cwd))||!M.existsSync(s))continue;let o=await M.readdirPromise(s,{withFileTypes:!0}),a=o.filter(l=>!l.isDirectory()||l.name===\".bin\"||!l.name.startsWith(\".\"));if(a.length===o.length)t.push(s);else for(let l of a)t.push(x.join(s,l.name))}return t}async unplugPackageIfNeeded(e,t,i,n,s){return this.shouldBeUnplugged(e,t,n)?this.unplugPackage(e,i,s):i.packageFs}shouldBeUnplugged(e,t,i){return typeof i.unplugged<\"u\"?i.unplugged:uze.has(e.identHash)||e.conditions!=null?!0:t.manifest.preferUnplugged!==null?t.manifest.preferUnplugged:!!(rb(e,t,i,{configuration:this.opts.project.configuration}).length>0||t.misc.extractHint)}async unplugPackage(e,t,i){let n=fE(e,{configuration:this.opts.project.configuration});return this.opts.project.disabledLocators.has(e.locatorHash)?new bo(n,{baseFs:t.packageFs,pathUtils:x}):(this.unpluggedPaths.add(n),i.holdFetchResult(this.asyncActions.set(e.locatorHash,async()=>{let s=x.join(n,t.prefixPath,\".ready\");await M.existsPromise(s)||(this.opts.project.storedBuildState.delete(e.locatorHash),await M.mkdirPromise(n,{recursive:!0}),await M.copyPromise(n,Oe.dot,{baseFs:t.packageFs,overwrite:!1}),await M.writeFilePromise(s,\"\"))})),new qt(n))}getPackageInformation(e){let t=P.stringifyIdent(e),i=e.reference,n=this.packageRegistry.get(t);if(!n)throw new Error(`Assertion failed: The package information store should have been available (for ${P.prettyIdent(this.opts.project.configuration,e)})`);let s=n.get(i);if(!s)throw new Error(`Assertion failed: The package information should have been available (for ${P.prettyLocator(this.opts.project.configuration,e)})`);return s}getDiskInformation(e){let t=Ie.getMapWithDefault(this.packageRegistry,\"@@disk\"),i=rM(this.opts.project.cwd,e);return Ie.getFactoryWithDefault(t,i,()=>({packageLocation:i,packageDependencies:new Map,packagePeers:new Set,linkType:\"SOFT\",discardFromLookup:!1}))}};function rM(r,e){let t=x.relative(r,e);return t.match(/^\\.{0,2}\\//)||(t=`./${t}`),t.replace(/\\/?$/,\"/\")}async function gze(r){var i;let e=(i=await ot.tryFind(r.prefixPath,{baseFs:r.packageFs}))!=null?i:new ot,t=new Set([\"preinstall\",\"install\",\"postinstall\"]);for(let n of e.scripts.keys())t.has(n)||e.scripts.delete(n);return{manifest:{scripts:e.scripts,preferUnplugged:e.preferUnplugged,type:e.type},misc:{extractHint:eM(r),hasBindingGyp:tM(r)}}}var yle=Pe(Bn());var ju=class extends De{constructor(){super(...arguments);this.all=z.Boolean(\"-A,--all\",!1,{description:\"Unplug direct dependencies from the entire project\"});this.recursive=z.Boolean(\"-R,--recursive\",!1,{description:\"Unplug both direct and transitive dependencies\"});this.json=z.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.patterns=z.Rest()}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,workspace:n}=await je.find(t,this.context.cwd),s=await Rt.find(t);if(!n)throw new ct(i.cwd,this.context.cwd);if(t.get(\"nodeLinker\")!==\"pnp\")throw new be(\"This command can only be used if the `nodeLinker` option is set to `pnp`\");await i.restoreInstallState();let o=new Set(this.patterns),a=this.patterns.map(h=>{let p=P.parseDescriptor(h),C=p.range!==\"unknown\"?p:P.makeDescriptor(p,\"*\");if(!vt.validRange(C.range))throw new be(`The range of the descriptor patterns must be a valid semver range (${P.prettyDescriptor(t,C)})`);return y=>{let B=P.stringifyIdent(y);return!yle.default.isMatch(B,P.stringifyIdent(C))||y.version&&!vt.satisfiesWithPrereleases(y.version,C.range)?!1:(o.delete(h),!0)}}),l=()=>{let h=[];for(let p of i.storedPackages.values())!i.tryWorkspaceByLocator(p)&&!P.isVirtualLocator(p)&&a.some(C=>C(p))&&h.push(p);return h},c=h=>{let p=new Set,C=[],y=(B,v)=>{if(!p.has(B.locatorHash)&&(p.add(B.locatorHash),!i.tryWorkspaceByLocator(B)&&a.some(D=>D(B))&&C.push(B),!(v>0&&!this.recursive)))for(let D of B.dependencies.values()){let T=i.storedResolutions.get(D.descriptorHash);if(!T)throw new Error(\"Assertion failed: The resolution should have been registered\");let H=i.storedPackages.get(T);if(!H)throw new Error(\"Assertion failed: The package should have been registered\");y(H,v+1)}};for(let B of h){let v=i.storedPackages.get(B.anchoredLocator.locatorHash);if(!v)throw new Error(\"Assertion failed: The package should have been registered\");y(v,0)}return C},u,g;if(this.all&&this.recursive?(u=l(),g=\"the project\"):this.all?(u=c(i.workspaces),g=\"any workspace\"):(u=c([n]),g=\"this workspace\"),o.size>1)throw new be(`Patterns ${ee.prettyList(t,o,ee.Type.CODE)} don't match any packages referenced by ${g}`);if(o.size>0)throw new be(`Pattern ${ee.prettyList(t,o,ee.Type.CODE)} doesn't match any packages referenced by ${g}`);return u=Ie.sortMap(u,h=>P.stringifyLocator(h)),(await Ge.start({configuration:t,stdout:this.context.stdout,json:this.json},async h=>{var p;for(let C of u){let y=(p=C.version)!=null?p:\"unknown\",B=i.topLevelWorkspace.manifest.ensureDependencyMeta(P.makeDescriptor(C,y));B.unplugged=!0,h.reportInfo(0,`Will unpack ${P.prettyLocator(t,C)} to ${ee.pretty(t,fE(C,{configuration:t}),ee.Type.PATH)}`),h.reportJson({locator:P.stringifyLocator(C),version:y})}await i.topLevelWorkspace.persistManifest(),h.reportSeparator(),await i.install({cache:s,report:h})})).exitCode()}};ju.paths=[[\"unplug\"]],ju.usage=ve.Usage({description:\"force the unpacking of a list of packages\",details:\"\\n      This command will add the selectors matching the specified patterns to the list of packages that must be unplugged when installed.\\n\\n      A package being unplugged means that instead of being referenced directly through its archive, it will be unpacked at install time in the directory configured via `pnpUnpluggedFolder`. Note that unpacking packages this way is generally not recommended because it'll make it harder to store your packages within the repository. However, it's a good approach to quickly and safely debug some packages, and can even sometimes be required depending on the context (for example when the package contains shellscripts).\\n\\n      Running the command will set a persistent flag inside your top-level `package.json`, in the `dependenciesMeta` field. As such, to undo its effects, you'll need to revert the changes made to the manifest and run `yarn install` to apply the modification.\\n\\n      By default, only direct dependencies from the current workspace are affected. If `-A,--all` is set, direct dependencies from the entire project are affected. Using the `-R,--recursive` flag will affect transitive dependencies as well as direct ones.\\n\\n      This command accepts glob patterns inside the scope and name components (not the range). Make sure to escape the patterns to prevent your own shell from trying to expand them.\\n    \",examples:[[\"Unplug the lodash dependency from the active workspace\",\"yarn unplug lodash\"],[\"Unplug all instances of lodash referenced by any workspace\",\"yarn unplug lodash -A\"],[\"Unplug all instances of lodash referenced by the active workspace and its dependencies\",\"yarn unplug lodash -R\"],[\"Unplug all instances of lodash, anywhere\",\"yarn unplug lodash -AR\"],[\"Unplug one specific version of lodash\",\"yarn unplug lodash@1.2.3\"],[\"Unplug all packages with the `@babel` scope\",\"yarn unplug '@babel/*'\"],[\"Unplug all packages (only for testing, not recommended)\",\"yarn unplug -R '*'\"]]});var Bl=r=>({cjs:x.join(r.cwd,xt.pnpCjs),cjsLegacy:x.join(r.cwd,xt.pnpJs),esmLoader:x.join(r.cwd,\".pnp.loader.mjs\")}),Qle=r=>/\\s/.test(r)?JSON.stringify(r):r;async function fze(r,e,t){let i=Bl(r),n=`--require ${Qle(K.fromPortablePath(i.cjs))}`;if(M.existsSync(i.esmLoader)&&(n=`${n} --experimental-loader ${(0,Ble.pathToFileURL)(K.fromPortablePath(i.esmLoader)).href}`),i.cjs.includes(\" \")&&wle.default.lt(process.versions.node,\"12.0.0\"))throw new Error(`Expected the build location to not include spaces when using Node < 12.0.0 (${process.versions.node})`);if(M.existsSync(i.cjs)){let s=e.NODE_OPTIONS||\"\",o=/\\s*--require\\s+\\S*\\.pnp\\.c?js\\s*/g,a=/\\s*--experimental-loader\\s+\\S*\\.pnp\\.loader\\.mjs\\s*/;s=s.replace(o,\" \").replace(a,\" \").trim(),s=s?`${n} ${s}`:n,e.NODE_OPTIONS=s}}async function hze(r,e){let t=Bl(r);e(t.cjs),e(t.esmLoader),e(r.configuration.get(\"pnpDataPath\")),e(r.configuration.get(\"pnpUnpluggedFolder\"))}var pze={hooks:{populateYarnPaths:hze,setupScriptEnvironment:fze},configuration:{nodeLinker:{description:'The linker used for installing Node packages, one of: \"pnp\", \"node-modules\"',type:\"STRING\",default:\"pnp\"},pnpMode:{description:\"If 'strict', generates standard PnP maps. If 'loose', merges them with the n_m resolution.\",type:\"STRING\",default:\"strict\"},pnpShebang:{description:\"String to prepend to the generated PnP script\",type:\"STRING\",default:\"#!/usr/bin/env node\"},pnpIgnorePatterns:{description:\"Array of glob patterns; files matching them will use the classic resolution\",type:\"STRING\",default:[],isArray:!0},pnpEnableEsmLoader:{description:\"If true, Yarn will generate an ESM loader (`.pnp.loader.mjs`). If this is not explicitly set Yarn tries to automatically detect whether ESM support is required.\",type:\"BOOLEAN\",default:!1},pnpEnableInlining:{description:\"If true, the PnP data will be inlined along with the generated loader\",type:\"BOOLEAN\",default:!0},pnpFallbackMode:{description:\"If true, the generated PnP loader will follow the top-level fallback rule\",type:\"STRING\",default:\"dependencies-only\"},pnpUnpluggedFolder:{description:\"Folder where the unplugged packages must be stored\",type:\"ABSOLUTE_PATH\",default:\"./.yarn/unplugged\"},pnpDataPath:{description:\"Path of the file where the PnP data (used by the loader) must be written\",type:\"ABSOLUTE_PATH\",default:\"./.pnp.data.json\"}},linkers:[wl],commands:[ju]},dze=pze;var Rle=Pe(Ple());var cM=Pe(J(\"crypto\")),Fle=Pe(J(\"fs\")),Nle=1,kr=\"node_modules\",ib=\".bin\",Tle=\".yarn-state.yml\",Fze=1e3;var nb=class{constructor(){this.installStateCache=new Map}supportsPackage(e,t){return this.isEnabled(t)}async findPackageLocation(e,t){if(!this.isEnabled(t))throw new Error(\"Assertion failed: Expected the node-modules linker to be enabled\");let i=t.project.tryWorkspaceByLocator(e);if(i)return i.cwd;let n=await Ie.getFactoryWithDefault(this.installStateCache,t.project.cwd,async()=>await lM(t.project,{unrollAliases:!0}));if(n===null)throw new be(\"Couldn't find the node_modules state file - running an install might help (findPackageLocation)\");let s=n.locatorMap.get(P.stringifyLocator(e));if(!s){let l=new be(`Couldn't find ${P.prettyLocator(t.project.configuration,e)} in the currently installed node_modules map - running an install might help`);throw l.code=\"LOCATOR_NOT_INSTALLED\",l}let o=s.locations.sort((l,c)=>l.split(x.sep).length-c.split(x.sep).length),a=x.join(t.project.configuration.startingCwd,kr);return o.find(l=>x.contains(a,l))||s.locations[0]}async findPackageLocator(e,t){if(!this.isEnabled(t))return null;let i=await Ie.getFactoryWithDefault(this.installStateCache,t.project.cwd,async()=>await lM(t.project,{unrollAliases:!0}));if(i===null)return null;let{locationRoot:n,segments:s}=sb(x.resolve(e),{skipPrefix:t.project.cwd}),o=i.locationTree.get(n);if(!o)return null;let a=o.locator;for(let l of s){if(o=o.children.get(l),!o)break;a=o.locator||a}return P.parseLocator(a)}makeInstaller(e){return new AM(e)}isEnabled(e){return e.project.configuration.get(\"nodeLinker\")===\"node-modules\"}},AM=class{constructor(e){this.opts=e;this.localStore=new Map;this.realLocatorChecksums=new Map;this.customData={store:new Map}}getCustomDataKey(){return JSON.stringify({name:\"NodeModulesInstaller\",version:2})}attachCustomData(e){this.customData=e}async installPackage(e,t){var u;let i=x.resolve(t.packageFs.getRealPath(),t.prefixPath),n=this.customData.store.get(e.locatorHash);if(typeof n>\"u\"&&(n=await Nze(e,t),e.linkType===\"HARD\"&&this.customData.store.set(e.locatorHash,n)),!P.isPackageCompatible(e,this.opts.project.configuration.getSupportedArchitectures()))return{packageLocation:null,buildDirective:null};let s=new Map,o=new Set;s.has(P.stringifyIdent(e))||s.set(P.stringifyIdent(e),e.reference);let a=e;if(P.isVirtualLocator(e)){a=P.devirtualizeLocator(e);for(let g of e.peerDependencies.values())s.set(P.stringifyIdent(g),null),o.add(P.stringifyIdent(g))}let l={packageLocation:`${K.fromPortablePath(i)}/`,packageDependencies:s,packagePeers:o,linkType:e.linkType,discardFromLookup:(u=t.discardFromLookup)!=null?u:!1};this.localStore.set(e.locatorHash,{pkg:e,customPackageData:n,dependencyMeta:this.opts.project.getDependencyMeta(e,e.version),pnpNode:l});let c=t.checksum?t.checksum.substring(t.checksum.indexOf(\"/\")+1):null;return this.realLocatorChecksums.set(a.locatorHash,c),{packageLocation:i,buildDirective:null}}async attachInternalDependencies(e,t){let i=this.localStore.get(e.locatorHash);if(typeof i>\"u\")throw new Error(\"Assertion failed: Expected information object to have been registered\");for(let[n,s]of t){let o=P.areIdentsEqual(n,s)?s.reference:[P.stringifyIdent(s),s.reference];i.pnpNode.packageDependencies.set(P.stringifyIdent(n),o)}}async attachExternalDependents(e,t){throw new Error(\"External dependencies haven't been implemented for the node-modules linker\")}async finalizeInstall(){if(this.opts.project.configuration.get(\"nodeLinker\")!==\"node-modules\")return;let e=new Br({baseFs:new Kn({libzip:await an(),maxOpenFiles:80,readOnlyArchives:!0})}),t=await lM(this.opts.project),i=this.opts.project.configuration.get(\"nmMode\");(t===null||i!==t.nmMode)&&(this.opts.project.storedBuildState.clear(),t={locatorMap:new Map,binSymlinks:new Map,locationTree:new Map,nmMode:i,mtimeMs:0});let n=new Map(this.opts.project.workspaces.map(f=>{var p,C;let h=this.opts.project.configuration.get(\"nmHoistingLimits\");try{h=Ie.validateEnum(tE,(C=(p=f.manifest.installConfig)==null?void 0:p.hoistingLimits)!=null?C:h)}catch{let B=P.prettyWorkspace(this.opts.project.configuration,f);this.opts.report.reportWarning(57,`${B}: Invalid 'installConfig.hoistingLimits' value. Expected one of ${Object.values(tE).join(\", \")}, using default: \"${h}\"`)}return[f.relativeCwd,h]})),s=new Map(this.opts.project.workspaces.map(f=>{var p,C;let h=this.opts.project.configuration.get(\"nmSelfReferences\");return h=(C=(p=f.manifest.installConfig)==null?void 0:p.selfReferences)!=null?C:h,[f.relativeCwd,h]})),o={VERSIONS:{std:1},topLevel:{name:null,reference:null},getLocator:(f,h)=>Array.isArray(h)?{name:h[0],reference:h[1]}:{name:f,reference:h},getDependencyTreeRoots:()=>this.opts.project.workspaces.map(f=>{let h=f.anchoredLocator;return{name:P.stringifyIdent(f.locator),reference:h.reference}}),getPackageInformation:f=>{let h=f.reference===null?this.opts.project.topLevelWorkspace.anchoredLocator:P.makeLocator(P.parseIdent(f.name),f.reference),p=this.localStore.get(h.locatorHash);if(typeof p>\"u\")throw new Error(\"Assertion failed: Expected the package reference to have been registered\");return p.pnpNode},findPackageLocator:f=>{let h=this.opts.project.tryWorkspaceByCwd(K.toPortablePath(f));if(h!==null){let p=h.anchoredLocator;return{name:P.stringifyIdent(p),reference:p.reference}}throw new Error(\"Assertion failed: Unimplemented\")},resolveToUnqualified:()=>{throw new Error(\"Assertion failed: Unimplemented\")},resolveUnqualified:()=>{throw new Error(\"Assertion failed: Unimplemented\")},resolveRequest:()=>{throw new Error(\"Assertion failed: Unimplemented\")},resolveVirtual:f=>K.fromPortablePath(Br.resolveVirtual(K.toPortablePath(f)))},{tree:a,errors:l,preserveSymlinksRequired:c}=rE(o,{pnpifyFs:!1,validateExternalSoftLinks:!0,hoistingLimitsByCwd:n,project:this.opts.project,selfReferencesByCwd:s});if(!a){for(let{messageName:f,text:h}of l)this.opts.report.reportError(f,h);return}let u=MO(a);await Uze(t,u,{baseFs:e,project:this.opts.project,report:this.opts.report,realLocatorChecksums:this.realLocatorChecksums,loadManifest:async f=>{let h=P.parseLocator(f),p=this.localStore.get(h.locatorHash);if(typeof p>\"u\")throw new Error(\"Assertion failed: Expected the slot to exist\");return p.customPackageData.manifest}});let g=[];for(let[f,h]of u.entries()){if(Kle(f))continue;let p=P.parseLocator(f),C=this.localStore.get(p.locatorHash);if(typeof C>\"u\")throw new Error(\"Assertion failed: Expected the slot to exist\");if(this.opts.project.tryWorkspaceByLocator(C.pkg))continue;let y=po.extractBuildScripts(C.pkg,C.customPackageData,C.dependencyMeta,{configuration:this.opts.project.configuration,report:this.opts.report});y.length!==0&&g.push({buildLocations:h.locations,locatorHash:p.locatorHash,buildDirective:y})}return c&&this.opts.report.reportWarning(72,`The application uses portals and that's why ${ee.pretty(this.opts.project.configuration,\"--preserve-symlinks\",ee.Type.CODE)} Node option is required for launching it`),{customData:this.customData,records:g}}};async function Nze(r,e){var n;let t=(n=await ot.tryFind(e.prefixPath,{baseFs:e.packageFs}))!=null?n:new ot,i=new Set([\"preinstall\",\"install\",\"postinstall\"]);for(let s of t.scripts.keys())i.has(s)||t.scripts.delete(s);return{manifest:{bin:t.bin,scripts:t.scripts},misc:{extractHint:po.getExtractHint(e),hasBindingGyp:po.hasBindingGyp(e)}}}async function Tze(r,e,t,i,{installChangedByUser:n}){let s=\"\";s+=`# Warning: This file is automatically generated. Removing it is fine, but will\n`,s+=`# cause your node_modules installation to become invalidated.\n`,s+=`\n`,s+=`__metadata:\n`,s+=`  version: ${Nle}\n`,s+=`  nmMode: ${i.value}\n`;let o=Array.from(e.keys()).sort(),a=P.stringifyLocator(r.topLevelWorkspace.anchoredLocator);for(let u of o){let g=e.get(u);s+=`\n`,s+=`${JSON.stringify(u)}:\n`,s+=`  locations:\n`;for(let f of g.locations){let h=x.contains(r.cwd,f);if(h===null)throw new Error(`Assertion failed: Expected the path to be within the project (${f})`);s+=`    - ${JSON.stringify(h)}\n`}if(g.aliases.length>0){s+=`  aliases:\n`;for(let f of g.aliases)s+=`    - ${JSON.stringify(f)}\n`}if(u===a&&t.size>0){s+=`  bin:\n`;for(let[f,h]of t){let p=x.contains(r.cwd,f);if(p===null)throw new Error(`Assertion failed: Expected the path to be within the project (${f})`);s+=`    ${JSON.stringify(p)}:\n`;for(let[C,y]of h){let B=x.relative(x.join(f,kr),y);s+=`      ${JSON.stringify(C)}: ${JSON.stringify(B)}\n`}}}}let l=r.cwd,c=x.join(l,kr,Tle);n&&await M.removePromise(c),await M.changeFilePromise(c,s,{automaticNewlines:!0})}async function lM(r,{unrollAliases:e=!1}={}){let t=r.cwd,i=x.join(t,kr,Tle),n;try{n=await M.statPromise(i)}catch{}if(!n)return null;let s=yi(await M.readFilePromise(i,\"utf8\"));if(s.__metadata.version>Nle)return null;let o=s.__metadata.nmMode||\"classic\",a=new Map,l=new Map;delete s.__metadata;for(let[c,u]of Object.entries(s)){let g=u.locations.map(h=>x.join(t,h)),f=u.bin;if(f)for(let[h,p]of Object.entries(f)){let C=x.join(t,K.toPortablePath(h)),y=Ie.getMapWithDefault(l,C);for(let[B,v]of Object.entries(p))y.set(Ur(B),K.toPortablePath([C,kr,v].join(x.sep)))}if(a.set(c,{target:Oe.dot,linkType:\"HARD\",locations:g,aliases:u.aliases||[]}),e&&u.aliases)for(let h of u.aliases){let{scope:p,name:C}=P.parseLocator(c),y=P.makeLocator(P.makeIdent(p,C),h),B=P.stringifyLocator(y);a.set(B,{target:Oe.dot,linkType:\"HARD\",locations:g,aliases:[]})}}return{locatorMap:a,binSymlinks:l,locationTree:Lle(a,{skipPrefix:r.cwd}),nmMode:o,mtimeMs:n.mtimeMs}}var sp=async(r,e)=>{if(r.split(x.sep).indexOf(kr)<0)throw new Error(`Assertion failed: trying to remove dir that doesn't contain node_modules: ${r}`);try{if(!e.innerLoop){let i=e.allowSymlink?await M.statPromise(r):await M.lstatPromise(r);if(e.allowSymlink&&!i.isDirectory()||!e.allowSymlink&&i.isSymbolicLink()){await M.unlinkPromise(r);return}}let t=await M.readdirPromise(r,{withFileTypes:!0});for(let i of t){let n=x.join(r,Ur(i.name));i.isDirectory()?(i.name!==kr||e&&e.innerLoop)&&await sp(n,{innerLoop:!0,contentsOnly:!1}):await M.unlinkPromise(n)}e.contentsOnly||await M.rmdirPromise(r)}catch(t){if(t.code!==\"ENOENT\"&&t.code!==\"ENOTEMPTY\")throw t}},Dle=4,sb=(r,{skipPrefix:e})=>{let t=x.contains(e,r);if(t===null)throw new Error(`Assertion failed: Writing attempt prevented to ${r} which is outside project root: ${e}`);let i=t.split(x.sep).filter(l=>l!==\"\"),n=i.indexOf(kr),s=i.slice(0,n).join(x.sep),o=x.join(e,s),a=i.slice(n);return{locationRoot:o,segments:a}},Lle=(r,{skipPrefix:e})=>{let t=new Map;if(r===null)return t;let i=()=>({children:new Map,linkType:\"HARD\"});for(let[n,s]of r.entries()){if(s.linkType===\"SOFT\"&&x.contains(e,s.target)!==null){let a=Ie.getFactoryWithDefault(t,s.target,i);a.locator=n,a.linkType=s.linkType}for(let o of s.locations){let{locationRoot:a,segments:l}=sb(o,{skipPrefix:e}),c=Ie.getFactoryWithDefault(t,a,i);for(let u=0;u<l.length;++u){let g=l[u];if(g!==\".\"){let f=Ie.getFactoryWithDefault(c.children,g,i);c.children.set(g,f),c=f}u===l.length-1&&(c.locator=n,c.linkType=s.linkType)}}}return t},uM=async(r,e)=>{let t;try{process.platform===\"win32\"&&(t=await M.lstatPromise(r))}catch{}process.platform==\"win32\"&&(!t||t.isDirectory())?await M.symlinkPromise(r,e,\"junction\"):await M.symlinkPromise(x.relative(x.dirname(e),r),e)};async function Ole(r,e,t){let i=x.join(r,Ur(`${cM.default.randomBytes(16).toString(\"hex\")}.tmp`));try{await M.writeFilePromise(i,t);try{await M.linkPromise(i,e)}catch{}}finally{await M.unlinkPromise(i)}}async function Lze({srcPath:r,dstPath:e,entry:t,globalHardlinksStore:i,baseFs:n,nmMode:s}){if(t.kind===Mle.FILE){if(s.value===\"hardlinks-global\"&&i&&t.digest){let a=x.join(i,t.digest.substring(0,2),`${t.digest.substring(2)}.dat`),l;try{let c=await M.statPromise(a);if(c&&(!t.mtimeMs||c.mtimeMs>t.mtimeMs||c.mtimeMs<t.mtimeMs-Fze))if(await li.checksumFile(a,{baseFs:M,algorithm:\"sha1\"})!==t.digest){let g=x.join(i,Ur(`${cM.default.randomBytes(16).toString(\"hex\")}.tmp`));await M.renamePromise(a,g);let f=await n.readFilePromise(r);await M.writeFilePromise(g,f);try{await M.linkPromise(g,a),t.mtimeMs=new Date().getTime(),await M.unlinkPromise(g)}catch{}}else t.mtimeMs||(t.mtimeMs=Math.ceil(c.mtimeMs));await M.linkPromise(a,e),l=!0}catch{l=!1}if(!l){let c=await n.readFilePromise(r);await Ole(i,a,c),t.mtimeMs=new Date().getTime();try{await M.linkPromise(a,e)}catch(u){u&&u.code&&u.code==\"EXDEV\"&&(s.value=\"hardlinks-local\",await n.copyFilePromise(r,e))}}}else await n.copyFilePromise(r,e);let o=t.mode&511;o!==420&&await M.chmodPromise(e,o)}}var Mle=(i=>(i.FILE=\"file\",i.DIRECTORY=\"directory\",i.SYMLINK=\"symlink\",i))(Mle||{}),Oze=async(r,e,{baseFs:t,globalHardlinksStore:i,nmMode:n,packageChecksum:s})=>{await M.mkdirPromise(r,{recursive:!0});let o=async(c=Oe.dot)=>{let u=x.join(e,c),g=await t.readdirPromise(u,{withFileTypes:!0}),f=new Map;for(let h of g){let p=x.join(c,h.name),C,y=x.join(u,h.name);if(h.isFile()){if(C={kind:\"file\",mode:(await t.lstatPromise(y)).mode},n.value===\"hardlinks-global\"){let B=await li.checksumFile(y,{baseFs:t,algorithm:\"sha1\"});C.digest=B}}else if(h.isDirectory())C={kind:\"directory\"};else if(h.isSymbolicLink())C={kind:\"symlink\",symlinkTo:await t.readlinkPromise(y)};else throw new Error(`Unsupported file type (file: ${y}, mode: 0o${await t.statSync(y).mode.toString(8).padStart(6,\"0\")})`);if(f.set(p,C),h.isDirectory()&&p!==kr){let B=await o(p);for(let[v,D]of B)f.set(v,D)}}return f},a;if(n.value===\"hardlinks-global\"&&i&&s){let c=x.join(i,s.substring(0,2),`${s.substring(2)}.json`);try{a=new Map(Object.entries(JSON.parse(await M.readFilePromise(c,\"utf8\"))))}catch{a=await o()}}else a=await o();let l=!1;for(let[c,u]of a){let g=x.join(e,c),f=x.join(r,c);if(u.kind===\"directory\")await M.mkdirPromise(f,{recursive:!0});else if(u.kind===\"file\"){let h=u.mtimeMs;await Lze({srcPath:g,dstPath:f,entry:u,nmMode:n,baseFs:t,globalHardlinksStore:i}),u.mtimeMs!==h&&(l=!0)}else u.kind===\"symlink\"&&await uM(x.resolve(x.dirname(f),u.symlinkTo),f)}if(n.value===\"hardlinks-global\"&&i&&l&&s){let c=x.join(i,s.substring(0,2),`${s.substring(2)}.json`);await M.removePromise(c),await Ole(i,c,Buffer.from(JSON.stringify(Object.fromEntries(a))))}};function Mze(r,e,t,i){let n=new Map,s=new Map,o=new Map,a=!1,l=(c,u,g,f,h)=>{let p=!0,C=x.join(c,u),y=new Set;if(u===kr||u.startsWith(\"@\")){let v;try{v=M.statSync(C)}catch{}p=!!v,v?v.mtimeMs>t?(a=!0,y=new Set(M.readdirSync(C))):y=new Set(g.children.get(u).children.keys()):a=!0;let D=e.get(c);if(D){let T=x.join(c,kr,ib),H;try{H=M.statSync(T)}catch{}if(!H)a=!0;else if(H.mtimeMs>t){a=!0;let j=new Set(M.readdirSync(T)),$=new Map;s.set(c,$);for(let[V,W]of D)j.has(V)&&$.set(V,W)}else s.set(c,D)}}else p=h.has(u);let B=g.children.get(u);if(p){let{linkType:v,locator:D}=B,T={children:new Map,linkType:v,locator:D};if(f.children.set(u,T),D){let H=Ie.getSetWithDefault(o,D);H.add(C),o.set(D,H)}for(let H of B.children.keys())l(C,H,B,T,y)}else B.locator&&i.storedBuildState.delete(P.parseLocator(B.locator).locatorHash)};for(let[c,u]of r){let{linkType:g,locator:f}=u,h={children:new Map,linkType:g,locator:f};if(n.set(c,h),f){let p=Ie.getSetWithDefault(o,u.locator);p.add(c),o.set(u.locator,p)}u.children.has(kr)&&l(c,kr,u,h,new Set)}return{locationTree:n,binSymlinks:s,locatorLocations:o,installChangedByUser:a}}function Kle(r){let e=P.parseDescriptor(r);return P.isVirtualDescriptor(e)&&(e=P.devirtualizeDescriptor(e)),e.range.startsWith(\"link:\")}async function Kze(r,e,t,{loadManifest:i}){let n=new Map;for(let[a,{locations:l}]of r){let c=Kle(a)?null:await i(a,l[0]),u=new Map;if(c)for(let[g,f]of c.bin){let h=x.join(l[0],f);f!==\"\"&&M.existsSync(h)&&u.set(g,f)}n.set(a,u)}let s=new Map,o=(a,l,c)=>{let u=new Map,g=x.contains(t,a);if(c.locator&&g!==null){let f=n.get(c.locator);for(let[h,p]of f){let C=x.join(a,K.toPortablePath(p));u.set(Ur(h),C)}for(let[h,p]of c.children){let C=x.join(a,h),y=o(C,C,p);y.size>0&&s.set(a,new Map([...s.get(a)||new Map,...y]))}}else for(let[f,h]of c.children){let p=o(x.join(a,f),l,h);for(let[C,y]of p)u.set(C,y)}return u};for(let[a,l]of e){let c=o(a,a,l);c.size>0&&s.set(a,new Map([...s.get(a)||new Map,...c]))}return s}var kle=(r,e)=>{if(!r||!e)return r===e;let t=P.parseLocator(r);P.isVirtualLocator(t)&&(t=P.devirtualizeLocator(t));let i=P.parseLocator(e);return P.isVirtualLocator(i)&&(i=P.devirtualizeLocator(i)),P.areLocatorsEqual(t,i)};function gM(r){return x.join(r.get(\"globalFolder\"),\"store\")}async function Uze(r,e,{baseFs:t,project:i,report:n,loadManifest:s,realLocatorChecksums:o}){let a=x.join(i.cwd,kr),{locationTree:l,binSymlinks:c,locatorLocations:u,installChangedByUser:g}=Mze(r.locationTree,r.binSymlinks,r.mtimeMs,i),f=Lle(e,{skipPrefix:i.cwd}),h=[],p=async({srcDir:V,dstDir:W,linkType:_,globalHardlinksStore:A,nmMode:Ae,packageChecksum:ge})=>{let re=(async()=>{try{_===\"SOFT\"?(await M.mkdirPromise(x.dirname(W),{recursive:!0}),await uM(x.resolve(V),W)):await Oze(W,V,{baseFs:t,globalHardlinksStore:A,nmMode:Ae,packageChecksum:ge})}catch(O){throw O.message=`While persisting ${V} -> ${W} ${O.message}`,O}finally{T.tick()}})().then(()=>h.splice(h.indexOf(re),1));h.push(re),h.length>Dle&&await Promise.race(h)},C=async(V,W,_)=>{let A=(async()=>{let Ae=async(ge,re,O)=>{try{O.innerLoop||await M.mkdirPromise(re,{recursive:!0});let F=await M.readdirPromise(ge,{withFileTypes:!0});for(let ue of F){if(!O.innerLoop&&ue.name===ib)continue;let pe=x.join(ge,ue.name),ke=x.join(re,ue.name);ue.isDirectory()?(ue.name!==kr||O&&O.innerLoop)&&(await M.mkdirPromise(ke,{recursive:!0}),await Ae(pe,ke,{...O,innerLoop:!0})):$.value===\"hardlinks-local\"||$.value===\"hardlinks-global\"?await M.linkPromise(pe,ke):await M.copyFilePromise(pe,ke,Fle.default.constants.COPYFILE_FICLONE)}}catch(F){throw O.innerLoop||(F.message=`While cloning ${ge} -> ${re} ${F.message}`),F}finally{O.innerLoop||T.tick()}};await Ae(V,W,_)})().then(()=>h.splice(h.indexOf(A),1));h.push(A),h.length>Dle&&await Promise.race(h)},y=async(V,W,_)=>{if(_)for(let[A,Ae]of W.children){let ge=_.children.get(A);await y(x.join(V,A),Ae,ge)}else{W.children.has(kr)&&await sp(x.join(V,kr),{contentsOnly:!1});let A=x.basename(V)===kr&&f.has(x.join(x.dirname(V),x.sep));await sp(V,{contentsOnly:V===a,allowSymlink:A})}};for(let[V,W]of l){let _=f.get(V);for(let[A,Ae]of W.children){if(A===\".\")continue;let ge=_&&_.children.get(A),re=x.join(V,A);await y(re,Ae,ge)}}let B=async(V,W,_)=>{if(_){kle(W.locator,_.locator)||await sp(V,{contentsOnly:W.linkType===\"HARD\"});for(let[A,Ae]of W.children){let ge=_.children.get(A);await B(x.join(V,A),Ae,ge)}}else{W.children.has(kr)&&await sp(x.join(V,kr),{contentsOnly:!0});let A=x.basename(V)===kr&&f.has(x.join(x.dirname(V),x.sep));await sp(V,{contentsOnly:W.linkType===\"HARD\",allowSymlink:A})}};for(let[V,W]of f){let _=l.get(V);for(let[A,Ae]of W.children){if(A===\".\")continue;let ge=_&&_.children.get(A);await B(x.join(V,A),Ae,ge)}}let v=new Map,D=[];for(let[V,W]of u)for(let _ of W){let{locationRoot:A,segments:Ae}=sb(_,{skipPrefix:i.cwd}),ge=f.get(A),re=A;if(ge){for(let O of Ae)if(re=x.join(re,O),ge=ge.children.get(O),!ge)break;if(ge){let O=kle(ge.locator,V),F=e.get(ge.locator),ue=F.target,pe=re,ke=F.linkType;if(O)v.has(ue)||v.set(ue,pe);else if(ue!==pe){let Fe=P.parseLocator(ge.locator);P.isVirtualLocator(Fe)&&(Fe=P.devirtualizeLocator(Fe)),D.push({srcDir:ue,dstDir:pe,linkType:ke,realLocatorHash:Fe.locatorHash})}}}}for(let[V,{locations:W}]of e.entries())for(let _ of W){let{locationRoot:A,segments:Ae}=sb(_,{skipPrefix:i.cwd}),ge=l.get(A),re=f.get(A),O=A,F=e.get(V),ue=P.parseLocator(V);P.isVirtualLocator(ue)&&(ue=P.devirtualizeLocator(ue));let pe=ue.locatorHash,ke=F.target,Fe=_;if(ke===Fe)continue;let Ne=F.linkType;for(let oe of Ae)re=re.children.get(oe);if(!ge)D.push({srcDir:ke,dstDir:Fe,linkType:Ne,realLocatorHash:pe});else for(let oe of Ae)if(O=x.join(O,oe),ge=ge.children.get(oe),!ge){D.push({srcDir:ke,dstDir:Fe,linkType:Ne,realLocatorHash:pe});break}}let T=vi.progressViaCounter(D.length),H=n.reportProgress(T),j=i.configuration.get(\"nmMode\"),$={value:j};try{let V=$.value===\"hardlinks-global\"?`${gM(i.configuration)}/v1`:null;if(V&&!await M.existsPromise(V)){await M.mkdirpPromise(V);for(let _=0;_<256;_++)await M.mkdirPromise(x.join(V,_.toString(16).padStart(2,\"0\")))}for(let _ of D)(_.linkType===\"SOFT\"||!v.has(_.srcDir))&&(v.set(_.srcDir,_.dstDir),await p({..._,globalHardlinksStore:V,nmMode:$,packageChecksum:o.get(_.realLocatorHash)||null}));await Promise.all(h),h.length=0;for(let _ of D){let A=v.get(_.srcDir);_.linkType!==\"SOFT\"&&_.dstDir!==A&&await C(A,_.dstDir,{nmMode:$})}await Promise.all(h),await M.mkdirPromise(a,{recursive:!0});let W=await Kze(e,f,i.cwd,{loadManifest:s});await Hze(c,W,i.cwd),await Tze(i,e,W,$,{installChangedByUser:g}),j==\"hardlinks-global\"&&$.value==\"hardlinks-local\"&&n.reportWarningOnce(74,\"'nmMode' has been downgraded to 'hardlinks-local' due to global cache and install folder being on different devices\")}finally{H.stop()}}async function Hze(r,e,t){for(let i of r.keys()){if(x.contains(t,i)===null)throw new Error(`Assertion failed. Excepted bin symlink location to be inside project dir, instead it was at ${i}`);if(!e.has(i)){let n=x.join(i,kr,ib);await M.removePromise(n)}}for(let[i,n]of e){if(x.contains(t,i)===null)throw new Error(`Assertion failed. Excepted bin symlink location to be inside project dir, instead it was at ${i}`);let s=x.join(i,kr,ib),o=r.get(i)||new Map;await M.mkdirPromise(s,{recursive:!0});for(let a of o.keys())n.has(a)||(await M.removePromise(x.join(s,a)),process.platform===\"win32\"&&await M.removePromise(x.join(s,Ur(`${a}.cmd`))));for(let[a,l]of n){let c=o.get(a),u=x.join(s,a);c!==l&&(process.platform===\"win32\"?await(0,Rle.default)(K.fromPortablePath(l),K.fromPortablePath(u),{createPwshFile:!1}):(await M.removePromise(u),await uM(l,u),x.contains(t,await M.realpathPromise(l))!==null&&await M.chmodPromise(l,493)))}}}var ob=class extends wl{constructor(){super(...arguments);this.mode=\"loose\"}makeInstaller(t){return new fM(t)}},fM=class extends Yu{constructor(){super(...arguments);this.mode=\"loose\"}async transformPnpSettings(t){let i=new Br({baseFs:new Kn({libzip:await an(),maxOpenFiles:80,readOnlyArchives:!0})}),n=dle(t,this.opts.project.cwd,i),{tree:s,errors:o}=rE(n,{pnpifyFs:!1,project:this.opts.project});if(!s){for(let{messageName:g,text:f}of o)this.opts.report.reportError(g,f);return}let a=new Map;t.fallbackPool=a;let l=(g,f)=>{let h=P.parseLocator(f.locator),p=P.stringifyIdent(h);p===g?a.set(g,h.reference):a.set(g,[p,h.reference])},c=x.join(this.opts.project.cwd,xt.nodeModules),u=s.get(c);if(!(typeof u>\"u\")){if(\"target\"in u)throw new Error(\"Assertion failed: Expected the root junction point to be a directory\");for(let g of u.dirList){let f=x.join(c,g),h=s.get(f);if(typeof h>\"u\")throw new Error(\"Assertion failed: Expected the child to have been registered\");if(\"target\"in h)l(g,h);else for(let p of h.dirList){let C=x.join(f,p),y=s.get(C);if(typeof y>\"u\")throw new Error(\"Assertion failed: Expected the subchild to have been registered\");if(\"target\"in y)l(`${g}/${p}`,y);else throw new Error(\"Assertion failed: Expected the leaf junction to be a package\")}}}}};var Gze={hooks:{cleanGlobalArtifacts:async r=>{let e=gM(r);await M.removePromise(e)}},configuration:{nmHoistingLimits:{description:\"Prevent packages to be hoisted past specific levels\",type:\"STRING\",values:[\"workspaces\",\"dependencies\",\"none\"],default:\"none\"},nmMode:{description:'If set to \"hardlinks-local\" Yarn will utilize hardlinks to reduce disk space consumption inside \"node_modules\" directories. With \"hardlinks-global\" Yarn will use global content addressable storage to reduce \"node_modules\" size across all the projects using this option.',type:\"STRING\",values:[\"classic\",\"hardlinks-local\",\"hardlinks-global\"],default:\"classic\"},nmSelfReferences:{description:\"If set to 'false' the workspace will not be allowed to require itself and corresponding self-referencing symlink will not be created\",type:\"BOOLEAN\",default:!0}},linkers:[nb,ob]},Yze=Gze;var u1={};ut(u1,{default:()=>ZVe,npmConfigUtils:()=>or,npmHttpUtils:()=>Mt,npmPublishUtils:()=>Cp});var qle=Pe(Xr());var gr=\"npm:\";var Mt={};ut(Mt,{AuthType:()=>jle,customPackageError:()=>qze,del:()=>zze,get:()=>mo,getIdentUrl:()=>bl,handleInvalidAuthenticationError:()=>Ql,post:()=>Jze,put:()=>Wze});var CM=Pe(Km()),Yle=J(\"url\");var or={};ut(or,{RegistryType:()=>Ule,getAuditRegistry:()=>jze,getAuthConfiguration:()=>dM,getDefaultRegistry:()=>ab,getPublishRegistry:()=>Hle,getRegistryConfiguration:()=>Gle,getScopeConfiguration:()=>pM,getScopeRegistry:()=>fA,normalizeRegistry:()=>Co});var Ule=(i=>(i.AUDIT_REGISTRY=\"npmAuditRegistry\",i.FETCH_REGISTRY=\"npmRegistryServer\",i.PUBLISH_REGISTRY=\"npmPublishRegistry\",i))(Ule||{});function Co(r){return r.replace(/\\/$/,\"\")}function jze(r,{configuration:e}){let t=e.get(\"npmAuditRegistry\");return t!==null?Co(t):Hle(r,{configuration:e})}function Hle(r,{configuration:e}){var t;return(t=r.publishConfig)!=null&&t.registry?Co(r.publishConfig.registry):r.name?fA(r.name.scope,{configuration:e,type:\"npmPublishRegistry\"}):ab({configuration:e,type:\"npmPublishRegistry\"})}function fA(r,{configuration:e,type:t=\"npmRegistryServer\"}){let i=pM(r,{configuration:e});if(i===null)return ab({configuration:e,type:t});let n=i.get(t);return n===null?ab({configuration:e,type:t}):Co(n)}function ab({configuration:r,type:e=\"npmRegistryServer\"}){let t=r.get(e);return Co(t!==null?t:r.get(\"npmRegistryServer\"))}function Gle(r,{configuration:e}){let t=e.get(\"npmRegistries\"),i=Co(r),n=t.get(i);if(typeof n<\"u\")return n;let s=t.get(i.replace(/^[a-z]+:/,\"\"));return typeof s<\"u\"?s:null}function pM(r,{configuration:e}){if(r===null)return null;let i=e.get(\"npmScopes\").get(r);return i||null}function dM(r,{configuration:e,ident:t}){let i=t&&pM(t.scope,{configuration:e});return(i==null?void 0:i.get(\"npmAuthIdent\"))||(i==null?void 0:i.get(\"npmAuthToken\"))?i:Gle(r,{configuration:e})||e}var jle=(n=>(n[n.NO_AUTH=0]=\"NO_AUTH\",n[n.BEST_EFFORT=1]=\"BEST_EFFORT\",n[n.CONFIGURATION=2]=\"CONFIGURATION\",n[n.ALWAYS_AUTH=3]=\"ALWAYS_AUTH\",n))(jle||{});async function Ql(r,{attemptedAs:e,registry:t,headers:i,configuration:n}){var s,o;if(lb(r))throw new at(41,\"Invalid OTP token\");if(((s=r.originalError)==null?void 0:s.name)===\"HTTPError\"&&((o=r.originalError)==null?void 0:o.response.statusCode)===401)throw new at(41,`Invalid authentication (${typeof e!=\"string\"?`as ${await Xze(t,i,{configuration:n})}`:`attempted as ${e}`})`)}function qze(r){var e;return((e=r.response)==null?void 0:e.statusCode)===404?\"Package not found\":null}function bl(r){return r.scope?`/@${r.scope}%2f${r.name}`:`/${r.name}`}async function mo(r,{configuration:e,headers:t,ident:i,authType:n,registry:s,...o}){if(i&&typeof s>\"u\"&&(s=fA(i.scope,{configuration:e})),i&&i.scope&&typeof n>\"u\"&&(n=1),typeof s!=\"string\")throw new Error(\"Assertion failed: The registry should be a string\");let a=await Ab(s,{authType:n,configuration:e,ident:i});a&&(t={...t,authorization:a});try{return await Xt.get(r.charAt(0)===\"/\"?`${s}${r}`:r,{configuration:e,headers:t,...o})}catch(l){throw await Ql(l,{registry:s,configuration:e,headers:t}),l}}async function Jze(r,e,{attemptedAs:t,configuration:i,headers:n,ident:s,authType:o=3,registry:a,otp:l,...c}){if(s&&typeof a>\"u\"&&(a=fA(s.scope,{configuration:i})),typeof a!=\"string\")throw new Error(\"Assertion failed: The registry should be a string\");let u=await Ab(a,{authType:o,configuration:i,ident:s});u&&(n={...n,authorization:u}),l&&(n={...n,...op(l)});try{return await Xt.post(a+r,e,{configuration:i,headers:n,...c})}catch(g){if(!lb(g)||l)throw await Ql(g,{attemptedAs:t,registry:a,configuration:i,headers:n}),g;l=await mM(g,{configuration:i});let f={...n,...op(l)};try{return await Xt.post(`${a}${r}`,e,{configuration:i,headers:f,...c})}catch(h){throw await Ql(h,{attemptedAs:t,registry:a,configuration:i,headers:n}),h}}}async function Wze(r,e,{attemptedAs:t,configuration:i,headers:n,ident:s,authType:o=3,registry:a,otp:l,...c}){if(s&&typeof a>\"u\"&&(a=fA(s.scope,{configuration:i})),typeof a!=\"string\")throw new Error(\"Assertion failed: The registry should be a string\");let u=await Ab(a,{authType:o,configuration:i,ident:s});u&&(n={...n,authorization:u}),l&&(n={...n,...op(l)});try{return await Xt.put(a+r,e,{configuration:i,headers:n,...c})}catch(g){if(!lb(g))throw await Ql(g,{attemptedAs:t,registry:a,configuration:i,headers:n}),g;l=await mM(g,{configuration:i});let f={...n,...op(l)};try{return await Xt.put(`${a}${r}`,e,{configuration:i,headers:f,...c})}catch(h){throw await Ql(h,{attemptedAs:t,registry:a,configuration:i,headers:n}),h}}}async function zze(r,{attemptedAs:e,configuration:t,headers:i,ident:n,authType:s=3,registry:o,otp:a,...l}){if(n&&typeof o>\"u\"&&(o=fA(n.scope,{configuration:t})),typeof o!=\"string\")throw new Error(\"Assertion failed: The registry should be a string\");let c=await Ab(o,{authType:s,configuration:t,ident:n});c&&(i={...i,authorization:c}),a&&(i={...i,...op(a)});try{return await Xt.del(o+r,{configuration:t,headers:i,...l})}catch(u){if(!lb(u)||a)throw await Ql(u,{attemptedAs:e,registry:o,configuration:t,headers:i}),u;a=await mM(u,{configuration:t});let g={...i,...op(a)};try{return await Xt.del(`${o}${r}`,{configuration:t,headers:g,...l})}catch(f){throw await Ql(f,{attemptedAs:e,registry:o,configuration:t,headers:i}),f}}}async function Ab(r,{authType:e=2,configuration:t,ident:i}){let n=dM(r,{configuration:t,ident:i}),s=Vze(n,e);if(!s)return null;let o=await t.reduceHook(a=>a.getNpmAuthenticationHeader,void 0,r,{configuration:t,ident:i});if(o)return o;if(n.get(\"npmAuthToken\"))return`Bearer ${n.get(\"npmAuthToken\")}`;if(n.get(\"npmAuthIdent\")){let a=n.get(\"npmAuthIdent\");return a.includes(\":\")?`Basic ${Buffer.from(a).toString(\"base64\")}`:`Basic ${a}`}if(s&&e!==1)throw new at(33,\"No authentication configured for request\");return null}function Vze(r,e){switch(e){case 2:return r.get(\"npmAlwaysAuth\");case 1:case 3:return!0;case 0:return!1;default:throw new Error(\"Unreachable\")}}async function Xze(r,e,{configuration:t}){var i;if(typeof e>\"u\"||typeof e.authorization>\"u\")return\"an anonymous user\";try{return(i=(await Xt.get(new Yle.URL(`${r}/-/whoami`).href,{configuration:t,headers:e,jsonResponse:!0})).username)!=null?i:\"an unknown user\"}catch{return\"an unknown user\"}}async function mM(r,{configuration:e}){var n;let t=(n=r.originalError)==null?void 0:n.response.headers[\"npm-notice\"];if(t&&(await Ge.start({configuration:e,stdout:process.stdout,includeFooter:!1},async s=>{if(s.reportInfo(0,t.replace(/(https?:\\/\\/\\S+)/g,ee.pretty(e,\"$1\",ee.Type.URL))),!process.env.YARN_IS_TEST_ENV){let o=t.match(/open (https?:\\/\\/\\S+)/i);if(o&&ws.openUrl){let{openNow:a}=await(0,CM.prompt)({type:\"confirm\",name:\"openNow\",message:\"Do you want to try to open this url now?\",required:!0,initial:!0,onCancel:()=>process.exit(130)});a&&(await ws.openUrl(o[1])||(s.reportSeparator(),s.reportWarning(0,\"We failed to automatically open the url; you'll have to open it yourself in your browser of choice.\")))}}}),process.stdout.write(`\n`)),process.env.YARN_IS_TEST_ENV)return process.env.YARN_INJECT_NPM_2FA_TOKEN||\"\";let{otp:i}=await(0,CM.prompt)({type:\"password\",name:\"otp\",message:\"One-time password:\",required:!0,onCancel:()=>process.exit(130)});return process.stdout.write(`\n`),i}function lb(r){var e,t;if(((e=r.originalError)==null?void 0:e.name)!==\"HTTPError\")return!1;try{return((t=r.originalError)==null?void 0:t.response.headers[\"www-authenticate\"].split(/,\\s*/).map(n=>n.toLowerCase())).includes(\"otp\")}catch{return!1}}function op(r){return{[\"npm-otp\"]:r}}var cb=class{supports(e,t){if(!e.reference.startsWith(gr))return!1;let{selector:i,params:n}=P.parseRange(e.reference);return!(!qle.default.valid(i)||n===null||typeof n.__archiveUrl!=\"string\")}getLocalPath(e,t){return null}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,[n,s,o]=await t.cache.fetchPackageFromCache(e,i,{onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from the remote server`),loader:()=>this.fetchFromNetwork(e,t),skipIntegrityCheck:t.skipIntegrityCheck,...t.cacheOptions});return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,t){let{params:i}=P.parseRange(e.reference);if(i===null||typeof i.__archiveUrl!=\"string\")throw new Error(\"Assertion failed: The archiveUrl querystring parameter should have been available\");let n=await mo(i.__archiveUrl,{configuration:t.project.configuration,ident:e});return await mi.convertToZip(n,{compressionLevel:t.project.configuration.get(\"compressionLevel\"),prefixPath:P.getIdentVendorPath(e),stripComponents:1})}};var ub=class{supportsDescriptor(e,t){return!(!e.range.startsWith(gr)||!P.tryParseDescriptor(e.range.slice(gr.length),!0))}supportsLocator(e,t){return!1}shouldPersistResolution(e,t){throw new Error(\"Unreachable\")}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){let i=P.parseDescriptor(e.range.slice(gr.length),!0);return t.resolver.getResolutionDependencies(i,t)}async getCandidates(e,t,i){let n=P.parseDescriptor(e.range.slice(gr.length),!0);return await i.resolver.getCandidates(n,t,i)}async getSatisfying(e,t,i){let n=P.parseDescriptor(e.range.slice(gr.length),!0);return i.resolver.getSatisfying(n,t,i)}resolve(e,t){throw new Error(\"Unreachable\")}};var Jle=Pe(Xr()),Wle=J(\"url\");var Ls=class{supports(e,t){if(!e.reference.startsWith(gr))return!1;let i=new Wle.URL(e.reference);return!(!Jle.default.valid(i.pathname)||i.searchParams.has(\"__archiveUrl\"))}getLocalPath(e,t){return null}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,[n,s,o]=await t.cache.fetchPackageFromCache(e,i,{onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from the remote registry`),loader:()=>this.fetchFromNetwork(e,t),skipIntegrityCheck:t.skipIntegrityCheck,...t.cacheOptions});return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,t){let i;try{i=await mo(Ls.getLocatorUrl(e),{configuration:t.project.configuration,ident:e})}catch{i=await mo(Ls.getLocatorUrl(e).replace(/%2f/g,\"/\"),{configuration:t.project.configuration,ident:e})}return await mi.convertToZip(i,{compressionLevel:t.project.configuration.get(\"compressionLevel\"),prefixPath:P.getIdentVendorPath(e),stripComponents:1})}static isConventionalTarballUrl(e,t,{configuration:i}){let n=fA(e.scope,{configuration:i}),s=Ls.getLocatorUrl(e);return t=t.replace(/^https?:(\\/\\/(?:[^/]+\\.)?npmjs.org(?:$|\\/))/,\"https:$1\"),n=n.replace(/^https:\\/\\/registry\\.npmjs\\.org($|\\/)/,\"https://registry.yarnpkg.com$1\"),t=t.replace(/^https:\\/\\/registry\\.npmjs\\.org($|\\/)/,\"https://registry.yarnpkg.com$1\"),t===n+s||t===n+s.replace(/%2f/g,\"/\")}static getLocatorUrl(e){let t=vt.clean(e.reference.slice(gr.length));if(t===null)throw new at(10,\"The npm semver resolver got selected, but the version isn't semver\");return`${bl(e)}/-/${e.name}-${t}.tgz`}};var zle=Pe(Xr());var gb=P.makeIdent(null,\"node-gyp\"),Zze=/\\b(node-gyp|prebuild-install)\\b/,fb=class{supportsDescriptor(e,t){return e.range.startsWith(gr)?!!vt.validRange(e.range.slice(gr.length)):!1}supportsLocator(e,t){if(!e.reference.startsWith(gr))return!1;let{selector:i}=P.parseRange(e.reference);return!!zle.default.valid(i)}shouldPersistResolution(e,t){return!0}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){let n=vt.validRange(e.range.slice(gr.length));if(n===null)throw new Error(`Expected a valid range, got ${e.range.slice(gr.length)}`);let s=await mo(bl(e),{configuration:i.project.configuration,ident:e,jsonResponse:!0}),o=Ie.mapAndFilter(Object.keys(s.versions),c=>{try{let u=new vt.SemVer(c);if(n.test(u))return u}catch{}return Ie.mapAndFilter.skip}),a=o.filter(c=>!s.versions[c.raw].deprecated),l=a.length>0?a:o;return l.sort((c,u)=>-c.compare(u)),l.map(c=>{let u=P.makeLocator(e,`${gr}${c.raw}`),g=s.versions[c.raw].dist.tarball;return Ls.isConventionalTarballUrl(u,g,{configuration:i.project.configuration})?u:P.bindLocator(u,{__archiveUrl:g})})}async getSatisfying(e,t,i){let n=vt.validRange(e.range.slice(gr.length));if(n===null)throw new Error(`Expected a valid range, got ${e.range.slice(gr.length)}`);return Ie.mapAndFilter(t,s=>{try{let{selector:o}=P.parseRange(s,{requireProtocol:gr}),a=new vt.SemVer(o);if(n.test(a))return{reference:s,version:a}}catch{}return Ie.mapAndFilter.skip}).sort((s,o)=>-s.version.compare(o.version)).map(({reference:s})=>P.makeLocator(e,s))}async resolve(e,t){let{selector:i}=P.parseRange(e.reference),n=vt.clean(i);if(n===null)throw new at(10,\"The npm semver resolver got selected, but the version isn't semver\");let s=await mo(bl(e),{configuration:t.project.configuration,ident:e,jsonResponse:!0});if(!Object.prototype.hasOwnProperty.call(s,\"versions\"))throw new at(15,'Registry returned invalid data for - missing \"versions\" field');if(!Object.prototype.hasOwnProperty.call(s.versions,n))throw new at(16,`Registry failed to return reference \"${n}\"`);let o=new ot;if(o.load(s.versions[n]),!o.dependencies.has(gb.identHash)&&!o.peerDependencies.has(gb.identHash)){for(let a of o.scripts.values())if(a.match(Zze)){o.dependencies.set(gb.identHash,P.makeDescriptor(gb,\"latest\")),t.report.reportWarningOnce(32,`${P.prettyLocator(t.project.configuration,e)}: Implicit dependencies on node-gyp are discouraged`);break}}if(typeof o.raw.deprecated==\"string\"&&o.raw.deprecated!==\"\"){let a=P.prettyLocator(t.project.configuration,e),l=o.raw.deprecated.match(/\\S/)?`${a} is deprecated: ${o.raw.deprecated}`:`${a} is deprecated`;t.report.reportWarningOnce(61,l)}return{...e,version:n,languageName:\"node\",linkType:\"HARD\",conditions:o.getConditions(),dependencies:o.dependencies,peerDependencies:o.peerDependencies,dependenciesMeta:o.dependenciesMeta,peerDependenciesMeta:o.peerDependenciesMeta,bin:o.bin}}};var hb=class{supportsDescriptor(e,t){return!(!e.range.startsWith(gr)||!Rf.test(e.range.slice(gr.length)))}supportsLocator(e,t){return!1}shouldPersistResolution(e,t){throw new Error(\"Unreachable\")}bindDescriptor(e,t,i){return e}getResolutionDependencies(e,t){return[]}async getCandidates(e,t,i){let n=e.range.slice(gr.length),s=await mo(bl(e),{configuration:i.project.configuration,ident:e,jsonResponse:!0});if(!Object.prototype.hasOwnProperty.call(s,\"dist-tags\"))throw new at(15,'Registry returned invalid data - missing \"dist-tags\" field');let o=s[\"dist-tags\"];if(!Object.prototype.hasOwnProperty.call(o,n))throw new at(16,`Registry failed to return tag \"${n}\"`);let a=o[n],l=P.makeLocator(e,`${gr}${a}`),c=s.versions[a].dist.tarball;return Ls.isConventionalTarballUrl(l,c,{configuration:i.project.configuration})?[l]:[P.bindLocator(l,{__archiveUrl:c})]}async getSatisfying(e,t,i){return null}async resolve(e,t){throw new Error(\"Unreachable\")}};var Cp={};ut(Cp,{getGitHead:()=>VVe,getPublishAccess:()=>Mue,getReadmeContent:()=>Kue,makePublishBody:()=>zVe});var o1={};ut(o1,{default:()=>DVe,packUtils:()=>ca});var ca={};ut(ca,{genPackList:()=>Ob,genPackStream:()=>s1,genPackageManifest:()=>bue,hasPackScripts:()=>i1,prepareForPack:()=>n1});var r1=Pe(Bn()),Bue=Pe(Eue()),Que=J(\"zlib\"),EVe=[\"/package.json\",\"/readme\",\"/readme.*\",\"/license\",\"/license.*\",\"/licence\",\"/licence.*\",\"/changelog\",\"/changelog.*\"],IVe=[\"/package.tgz\",\".github\",\".git\",\".hg\",\"node_modules\",\".npmignore\",\".gitignore\",\".#*\",\".DS_Store\"];async function i1(r){return!!(Wt.hasWorkspaceScript(r,\"prepack\")||Wt.hasWorkspaceScript(r,\"postpack\"))}async function n1(r,{report:e},t){await Wt.maybeExecuteWorkspaceLifecycleScript(r,\"prepack\",{report:e});try{let i=x.join(r.cwd,ot.fileName);await M.existsPromise(i)&&await r.manifest.loadFile(i,{baseFs:M}),await t()}finally{await Wt.maybeExecuteWorkspaceLifecycleScript(r,\"postpack\",{report:e})}}async function s1(r,e){var s,o;typeof e>\"u\"&&(e=await Ob(r));let t=new Set;for(let a of(o=(s=r.manifest.publishConfig)==null?void 0:s.executableFiles)!=null?o:new Set)t.add(x.normalize(a));for(let a of r.manifest.bin.values())t.add(x.normalize(a));let i=Bue.default.pack();process.nextTick(async()=>{for(let a of e){let l=x.normalize(a),c=x.resolve(r.cwd,l),u=x.join(\"package\",l),g=await M.lstatPromise(c),f={name:u,mtime:new Date(xr.SAFE_TIME*1e3)},h=t.has(l)?493:420,p,C,y=new Promise((v,D)=>{p=v,C=D}),B=v=>{v?C(v):p()};if(g.isFile()){let v;l===\"package.json\"?v=Buffer.from(JSON.stringify(await bue(r),null,2)):v=await M.readFilePromise(c),i.entry({...f,mode:h,type:\"file\"},v,B)}else g.isSymbolicLink()?i.entry({...f,mode:h,type:\"symlink\",linkname:await M.readlinkPromise(c)},B):B(new Error(`Unsupported file type ${g.mode} for ${K.fromPortablePath(l)}`));await y}i.finalize()});let n=(0,Que.createGzip)();return i.pipe(n),n}async function bue(r){let e=JSON.parse(JSON.stringify(r.manifest.raw));return await r.project.configuration.triggerHook(t=>t.beforeWorkspacePacking,r,e),e}async function Ob(r){var g,f,h,p,C,y,B,v;let e=r.project,t=e.configuration,i={accept:[],reject:[]};for(let D of IVe)i.reject.push(D);for(let D of EVe)i.accept.push(D);i.reject.push(t.get(\"rcFilename\"));let n=D=>{if(D===null||!D.startsWith(`${r.cwd}/`))return;let T=x.relative(r.cwd,D),H=x.resolve(Oe.root,T);i.reject.push(H)};n(x.resolve(e.cwd,t.get(\"lockfileFilename\"))),n(t.get(\"cacheFolder\")),n(t.get(\"globalFolder\")),n(t.get(\"installStatePath\")),n(t.get(\"virtualFolder\")),n(t.get(\"yarnPath\")),await t.triggerHook(D=>D.populateYarnPaths,e,D=>{n(D)});for(let D of e.workspaces){let T=x.relative(r.cwd,D.cwd);T!==\"\"&&!T.match(/^(\\.\\.)?\\//)&&i.reject.push(`/${T}`)}let s={accept:[],reject:[]},o=(f=(g=r.manifest.publishConfig)==null?void 0:g.main)!=null?f:r.manifest.main,a=(p=(h=r.manifest.publishConfig)==null?void 0:h.module)!=null?p:r.manifest.module,l=(y=(C=r.manifest.publishConfig)==null?void 0:C.browser)!=null?y:r.manifest.browser,c=(v=(B=r.manifest.publishConfig)==null?void 0:B.bin)!=null?v:r.manifest.bin;o!=null&&s.accept.push(x.resolve(Oe.root,o)),a!=null&&s.accept.push(x.resolve(Oe.root,a)),typeof l==\"string\"&&s.accept.push(x.resolve(Oe.root,l));for(let D of c.values())s.accept.push(x.resolve(Oe.root,D));if(l instanceof Map)for(let[D,T]of l.entries())s.accept.push(x.resolve(Oe.root,D)),typeof T==\"string\"&&s.accept.push(x.resolve(Oe.root,T));let u=r.manifest.files!==null;if(u){s.reject.push(\"/*\");for(let D of r.manifest.files)Sue(s.accept,D,{cwd:Oe.root})}return await yVe(r.cwd,{hasExplicitFileList:u,globalList:i,ignoreList:s})}async function yVe(r,{hasExplicitFileList:e,globalList:t,ignoreList:i}){let n=[],s=new So(r),o=[[Oe.root,[i]]];for(;o.length>0;){let[a,l]=o.pop(),c=await s.lstatPromise(a);if(!yue(a,{globalList:t,ignoreLists:c.isDirectory()?null:l}))if(c.isDirectory()){let u=await s.readdirPromise(a),g=!1,f=!1;if(!e||a!==Oe.root)for(let C of u)g=g||C===\".gitignore\",f=f||C===\".npmignore\";let h=f?await Iue(s,a,\".npmignore\"):g?await Iue(s,a,\".gitignore\"):null,p=h!==null?[h].concat(l):l;yue(a,{globalList:t,ignoreLists:l})&&(p=[...l,{accept:[],reject:[\"**/*\"]}]);for(let C of u)o.push([x.resolve(a,C),p])}else(c.isFile()||c.isSymbolicLink())&&n.push(x.relative(Oe.root,a))}return n.sort()}async function Iue(r,e,t){let i={accept:[],reject:[]},n=await r.readFilePromise(x.join(e,t),\"utf8\");for(let s of n.split(/\\n/g))Sue(i.reject,s,{cwd:e});return i}function wVe(r,{cwd:e}){let t=r[0]===\"!\";return t&&(r=r.slice(1)),r.match(/\\.{0,1}\\//)&&(r=x.resolve(e,r)),t&&(r=`!${r}`),r}function Sue(r,e,{cwd:t}){let i=e.trim();i===\"\"||i[0]===\"#\"||r.push(wVe(i,{cwd:t}))}function yue(r,{globalList:e,ignoreLists:t}){let i=Lb(r,e.accept);if(i!==0)return i===2;let n=Lb(r,e.reject);if(n!==0)return n===1;if(t!==null)for(let s of t){let o=Lb(r,s.accept);if(o!==0)return o===2;let a=Lb(r,s.reject);if(a!==0)return a===1}return!1}function Lb(r,e){let t=e,i=[];for(let n=0;n<e.length;++n)e[n][0]!==\"!\"?t!==e&&t.push(e[n]):(t===e&&(t=e.slice(0,n)),i.push(e[n].slice(1)));return wue(r,i)?2:wue(r,t)?1:0}function wue(r,e){let t=e,i=[];for(let n=0;n<e.length;++n)e[n].includes(\"/\")?t!==e&&t.push(e[n]):(t===e&&(t=e.slice(0,n)),i.push(e[n]));return!!(r1.default.isMatch(r,t,{dot:!0,nocase:!0})||r1.default.isMatch(r,i,{dot:!0,basename:!0,nocase:!0}))}var Vu=class extends De{constructor(){super(...arguments);this.installIfNeeded=z.Boolean(\"--install-if-needed\",!1,{description:\"Run a preliminary `yarn install` if the package contains build scripts\"});this.dryRun=z.Boolean(\"-n,--dry-run\",!1,{description:\"Print the file paths without actually generating the package archive\"});this.json=z.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.out=z.String(\"-o,--out\",{description:\"Create the archive at the specified path\"});this.filename=z.String(\"--filename\",{hidden:!0})}async execute(){var l;let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,workspace:n}=await je.find(t,this.context.cwd);if(!n)throw new ct(i.cwd,this.context.cwd);await i1(n)&&(this.installIfNeeded?await i.install({cache:await Rt.find(t),report:new ti}):await i.restoreInstallState());let s=(l=this.out)!=null?l:this.filename,o=typeof s<\"u\"?x.resolve(this.context.cwd,BVe(s,{workspace:n})):x.resolve(n.cwd,\"package.tgz\");return(await Ge.start({configuration:t,stdout:this.context.stdout,json:this.json},async c=>{await n1(n,{report:c},async()=>{c.reportJson({base:K.fromPortablePath(n.cwd)});let u=await Ob(n);for(let g of u)c.reportInfo(null,K.fromPortablePath(g)),c.reportJson({location:K.fromPortablePath(g)});if(!this.dryRun){let g=await s1(n,u),f=M.createWriteStream(o);g.pipe(f),await new Promise(h=>{f.on(\"finish\",h)})}}),this.dryRun||(c.reportInfo(0,`Package archive generated in ${ee.pretty(t,o,ee.Type.PATH)}`),c.reportJson({output:K.fromPortablePath(o)}))})).exitCode()}};Vu.paths=[[\"pack\"]],Vu.usage=ve.Usage({description:\"generate a tarball from the active workspace\",details:\"\\n      This command will turn the active workspace into a compressed archive suitable for publishing. The archive will by default be stored at the root of the workspace (`package.tgz`).\\n\\n      If the `-o,---out` is set the archive will be created at the specified path. The `%s` and `%v` variables can be used within the path and will be respectively replaced by the package name and version.\\n    \",examples:[[\"Create an archive from the active workspace\",\"yarn pack\"],[\"List the files that would be made part of the workspace's archive\",\"yarn pack --dry-run\"],[\"Name and output the archive in a dedicated folder\",\"yarn pack --out /artifacts/%s-%v.tgz\"]]});function BVe(r,{workspace:e}){let t=r.replace(\"%s\",QVe(e)).replace(\"%v\",bVe(e));return K.toPortablePath(t)}function QVe(r){return r.manifest.name!==null?P.slugifyIdent(r.manifest.name):\"package\"}function bVe(r){return r.manifest.version!==null?r.manifest.version:\"unknown\"}var SVe=[\"dependencies\",\"devDependencies\",\"peerDependencies\"],vVe=\"workspace:\",xVe=(r,e)=>{var i,n;e.publishConfig&&(e.publishConfig.type&&(e.type=e.publishConfig.type),e.publishConfig.main&&(e.main=e.publishConfig.main),e.publishConfig.browser&&(e.browser=e.publishConfig.browser),e.publishConfig.module&&(e.module=e.publishConfig.module),e.publishConfig.exports&&(e.exports=e.publishConfig.exports),e.publishConfig.imports&&(e.imports=e.publishConfig.imports),e.publishConfig.bin&&(e.bin=e.publishConfig.bin));let t=r.project;for(let s of SVe)for(let o of r.manifest.getForScope(s).values()){let a=t.tryWorkspaceByDescriptor(o),l=P.parseRange(o.range);if(l.protocol===vVe)if(a===null){if(t.tryWorkspaceByIdent(o)===null)throw new at(21,`${P.prettyDescriptor(t.configuration,o)}: No local workspace found for this range`)}else{let c;P.areDescriptorsEqual(o,a.anchoredDescriptor)||l.selector===\"*\"?c=(i=a.manifest.version)!=null?i:\"0.0.0\":l.selector===\"~\"||l.selector===\"^\"?c=`${l.selector}${(n=a.manifest.version)!=null?n:\"0.0.0\"}`:c=l.selector;let u=s===\"dependencies\"?P.makeDescriptor(o,\"unknown\"):null,g=u!==null&&r.manifest.ensureDependencyMeta(u).optional?\"optionalDependencies\":s;e[g][P.stringifyIdent(o)]=c}}},PVe={hooks:{beforeWorkspacePacking:xVe},commands:[Vu]},DVe=PVe;var Tue=J(\"crypto\"),Lue=Pe(Nue()),Oue=J(\"url\");async function zVe(r,e,{access:t,tag:i,registry:n,gitHead:s}){let o=r.manifest.name,a=r.manifest.version,l=P.stringifyIdent(o),c=(0,Tue.createHash)(\"sha1\").update(e).digest(\"hex\"),u=Lue.default.fromData(e).toString(),g=t!=null?t:Mue(r,o),f=await Kue(r),h=await ca.genPackageManifest(r),p=`${l}-${a}.tgz`,C=new Oue.URL(`${Co(n)}/${l}/-/${p}`);return{_id:l,_attachments:{[p]:{content_type:\"application/octet-stream\",data:e.toString(\"base64\"),length:e.length}},name:l,access:g,[\"dist-tags\"]:{[i]:a},versions:{[a]:{...h,_id:`${l}@${a}`,name:l,version:a,gitHead:s,dist:{shasum:c,integrity:u,tarball:C.toString()}}},readme:f}}async function VVe(r){try{let{stdout:e}=await Cr.execvp(\"git\",[\"rev-parse\",\"--revs-only\",\"HEAD\"],{cwd:r});return e.trim()===\"\"?void 0:e.trim()}catch{return}}function Mue(r,e){let t=r.project.configuration;return r.manifest.publishConfig&&typeof r.manifest.publishConfig.access==\"string\"?r.manifest.publishConfig.access:t.get(\"npmPublishAccess\")!==null?t.get(\"npmPublishAccess\"):e.scope?\"restricted\":\"public\"}async function Kue(r){let e=K.toPortablePath(`${r.cwd}/README.md`),t=r.manifest.name,n=`# ${P.stringifyIdent(t)}\n`;try{n=await M.readFilePromise(e,\"utf8\")}catch(s){if(s.code===\"ENOENT\")return n;throw s}return n}var c1={npmAlwaysAuth:{description:\"URL of the selected npm registry (note: npm enterprise isn't supported)\",type:\"BOOLEAN\",default:!1},npmAuthIdent:{description:\"Authentication identity for the npm registry (_auth in npm and yarn v1)\",type:\"SECRET\",default:null},npmAuthToken:{description:\"Authentication token for the npm registry (_authToken in npm and yarn v1)\",type:\"SECRET\",default:null}},Uue={npmAuditRegistry:{description:\"Registry to query for audit reports\",type:\"STRING\",default:null},npmPublishRegistry:{description:\"Registry to push packages to\",type:\"STRING\",default:null},npmRegistryServer:{description:\"URL of the selected npm registry (note: npm enterprise isn't supported)\",type:\"STRING\",default:\"https://registry.yarnpkg.com\"}},XVe={configuration:{...c1,...Uue,npmScopes:{description:\"Settings per package scope\",type:\"MAP\",valueDefinition:{description:\"\",type:\"SHAPE\",properties:{...c1,...Uue}}},npmRegistries:{description:\"Settings per registry\",type:\"MAP\",normalizeKeys:Co,valueDefinition:{description:\"\",type:\"SHAPE\",properties:{...c1}}}},fetchers:[cb,Ls],resolvers:[ub,fb,hb]},ZVe=XVe;var p1={};ut(p1,{default:()=>a9e});var kE=Pe(Bn());ls();var Mb=(i=>(i.All=\"all\",i.Production=\"production\",i.Development=\"development\",i))(Mb||{}),Kb=(s=>(s.Info=\"info\",s.Low=\"low\",s.Moderate=\"moderate\",s.High=\"high\",s.Critical=\"critical\",s))(Kb||{});var DE=[\"info\",\"low\",\"moderate\",\"high\",\"critical\"];function Gue(r,e){let t=[],i=new Set,n=o=>{i.has(o)||(i.add(o),t.push(o))};for(let o of e)n(o);let s=new Set;for(;t.length>0;){let o=t.shift(),a=r.storedResolutions.get(o);if(typeof a>\"u\")throw new Error(\"Assertion failed: Expected the resolution to have been registered\");let l=r.storedPackages.get(a);if(!!l){s.add(o);for(let c of l.dependencies.values())n(c.descriptorHash)}}return s}function _Ve(r,e){return new Set([...r].filter(t=>!e.has(t)))}function $Ve(r,e,{all:t}){let i=t?r.workspaces:[e],n=i.map(f=>f.manifest),s=new Set(n.map(f=>[...f.dependencies].map(([h,p])=>h)).flat()),o=new Set(n.map(f=>[...f.devDependencies].map(([h,p])=>h)).flat()),a=i.map(f=>[...f.dependencies.values()]).flat(),l=a.filter(f=>s.has(f.identHash)).map(f=>f.descriptorHash),c=a.filter(f=>o.has(f.identHash)).map(f=>f.descriptorHash),u=Gue(r,l),g=Gue(r,c);return _Ve(g,u)}function Yue(r){let e={};for(let t of r)e[P.stringifyIdent(t)]=P.parseRange(t.range).selector;return e}function jue(r){if(typeof r>\"u\")return new Set(DE);let e=DE.indexOf(r),t=DE.slice(e);return new Set(t)}function e9e(r,e){let t=jue(e),i={};for(let n of t)i[n]=r[n];return i}function que(r,e){var i;let t=e9e(r,e);for(let n of Object.keys(t))if((i=t[n])!=null?i:0>0)return!0;return!1}function Jue(r,e){var s;let t={},i={children:t},n=Object.values(r.advisories);if(e!=null){let o=jue(e);n=n.filter(a=>o.has(a.severity))}for(let o of Ie.sortMap(n,a=>a.module_name))t[o.module_name]={label:o.module_name,value:ee.tuple(ee.Type.RANGE,o.findings.map(a=>a.version).join(\", \")),children:{ID:{label:\"ID\",value:ee.tuple(ee.Type.NUMBER,o.id)},Issue:{label:\"Issue\",value:ee.tuple(ee.Type.NO_HINT,o.title)},URL:{label:\"URL\",value:ee.tuple(ee.Type.URL,o.url)},Severity:{label:\"Severity\",value:ee.tuple(ee.Type.NO_HINT,o.severity)},[\"Vulnerable Versions\"]:{label:\"Vulnerable Versions\",value:ee.tuple(ee.Type.RANGE,o.vulnerable_versions)},[\"Patched Versions\"]:{label:\"Patched Versions\",value:ee.tuple(ee.Type.RANGE,o.patched_versions)},Via:{label:\"Via\",value:ee.tuple(ee.Type.NO_HINT,Array.from(new Set(o.findings.map(a=>a.paths).flat().map(a=>a.split(\">\")[0]))).join(\", \"))},Recommendation:{label:\"Recommendation\",value:ee.tuple(ee.Type.NO_HINT,(s=o.recommendation)==null?void 0:s.replace(/\\n/g,\" \"))}}};return i}function Wue(r,e,{all:t,environment:i}){let n=t?r.workspaces:[e],s=[\"all\",\"production\"].includes(i),o=[];if(s)for(let c of n)for(let u of c.manifest.dependencies.values())o.push(u);let a=[\"all\",\"development\"].includes(i),l=[];if(a)for(let c of n)for(let u of c.manifest.devDependencies.values())l.push(u);return Yue([...o,...l].filter(c=>P.parseRange(c.range).protocol===null))}function zue(r,e,{all:t}){var s;let i=$Ve(r,e,{all:t}),n={};for(let o of r.storedPackages.values())n[P.stringifyIdent(o)]={version:(s=o.version)!=null?s:\"0.0.0\",integrity:o.identHash,requires:Yue(o.dependencies.values()),dev:i.has(P.convertLocatorToDescriptor(o).descriptorHash)};return n}var _u=class extends De{constructor(){super(...arguments);this.all=z.Boolean(\"-A,--all\",!1,{description:\"Audit dependencies from all workspaces\"});this.recursive=z.Boolean(\"-R,--recursive\",!1,{description:\"Audit transitive dependencies as well\"});this.environment=z.String(\"--environment\",\"all\",{description:\"Which environments to cover\",validator:Zi(Mb)});this.json=z.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.severity=z.String(\"--severity\",\"info\",{description:\"Minimal severity requested for packages to be displayed\",validator:Zi(Kb)});this.excludes=z.Array(\"--exclude\",[],{description:\"Array of glob patterns of packages to exclude from audit\"});this.ignores=z.Array(\"--ignore\",[],{description:\"Array of glob patterns of advisory ID's to ignore in the audit report\"})}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,workspace:n}=await je.find(t,this.context.cwd);if(!n)throw new ct(i.cwd,this.context.cwd);await i.restoreInstallState();let s=Wue(i,n,{all:this.all,environment:this.environment}),o=zue(i,n,{all:this.all});if(!this.recursive)for(let C of Object.keys(o))Object.prototype.hasOwnProperty.call(s,C)?o[C].requires={}:delete o[C];let a=Array.from(new Set([...t.get(\"npmAuditExcludePackages\"),...this.excludes]));if(a){for(let C of Object.keys(s))kE.default.isMatch(C,a)&&delete s[C];for(let C of Object.keys(o))kE.default.isMatch(C,a)&&delete o[C];for(let C of Object.keys(o))for(let y of Object.keys(o[C].requires))kE.default.isMatch(y,a)&&delete o[C].requires[y]}let l={requires:s,dependencies:o},c=or.getAuditRegistry(n.manifest,{configuration:t}),u,g=await ra.start({configuration:t,stdout:this.context.stdout},async()=>{u=await Mt.post(\"/-/npm/v1/security/audits/quick\",l,{authType:Mt.AuthType.BEST_EFFORT,configuration:t,jsonResponse:!0,registry:c})});if(g.hasErrors())return g.exitCode();let f=Array.from(new Set([...t.get(\"npmAuditIgnoreAdvisories\"),...this.ignores]));if(f){for(let C of Object.keys(u.advisories))if(kE.default.isMatch(C,f)){let y=u.advisories[C],B=0;y.findings.forEach(v=>B+=v.paths.length),u.metadata.vulnerabilities[y.severity]-=B,delete u.advisories[C]}}let h=que(u.metadata.vulnerabilities,this.severity);return!this.json&&h?(es.emitTree(Jue(u,this.severity),{configuration:t,json:this.json,stdout:this.context.stdout,separators:2}),1):(await Ge.start({configuration:t,includeFooter:!1,json:this.json,stdout:this.context.stdout},async C=>{C.reportJson(u),h||C.reportInfo(1,\"No audit suggestions\")})).exitCode()}};_u.paths=[[\"npm\",\"audit\"]],_u.usage=ve.Usage({description:\"perform a vulnerability audit against the installed packages\",details:`\n      This command checks for known security reports on the packages you use. The reports are by default extracted from the npm registry, and may or may not be relevant to your actual program (not all vulnerabilities affect all code paths).\n\n      For consistency with our other commands the default is to only check the direct dependencies for the active workspace. To extend this search to all workspaces, use \\`-A,--all\\`. To extend this search to both direct and transitive dependencies, use \\`-R,--recursive\\`.\n\n      Applying the \\`--severity\\` flag will limit the audit table to vulnerabilities of the corresponding severity and above. Valid values are ${DE.map(t=>`\\`${t}\\``).join(\", \")}.\n\n      If the \\`--json\\` flag is set, Yarn will print the output exactly as received from the registry. Regardless of this flag, the process will exit with a non-zero exit code if a report is found for the selected packages.\n\n      If certain packages produce false positives for a particular environment, the \\`--exclude\\` flag can be used to exclude any number of packages from the audit. This can also be set in the configuration file with the \\`npmAuditExcludePackages\\` option.\n\n      If particular advisories are needed to be ignored, the \\`--ignore\\` flag can be used with Advisory ID's to ignore any number of advisories in the audit report. This can also be set in the configuration file with the \\`npmAuditIgnoreAdvisories\\` option.\n\n      To understand the dependency tree requiring vulnerable packages, check the raw report with the \\`--json\\` flag or use \\`yarn why <package>\\` to get more information as to who depends on them.\n    `,examples:[[\"Checks for known security issues with the installed packages. The output is a list of known issues.\",\"yarn npm audit\"],[\"Audit dependencies in all workspaces\",\"yarn npm audit --all\"],[\"Limit auditing to `dependencies` (excludes `devDependencies`)\",\"yarn npm audit --environment production\"],[\"Show audit report as valid JSON\",\"yarn npm audit --json\"],[\"Audit all direct and transitive dependencies\",\"yarn npm audit --recursive\"],[\"Output moderate (or more severe) vulnerabilities\",\"yarn npm audit --severity moderate\"],[\"Exclude certain packages\",\"yarn npm audit --exclude package1 --exclude package2\"],[\"Ignore specific advisories\",\"yarn npm audit --ignore 1234567 --ignore 7654321\"]]});var g1=Pe(Xr()),f1=J(\"util\"),$u=class extends De{constructor(){super(...arguments);this.fields=z.String(\"-f,--fields\",{description:\"A comma-separated list of manifest fields that should be displayed\"});this.json=z.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.packages=z.Rest()}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i}=await je.find(t,this.context.cwd),n=typeof this.fields<\"u\"?new Set([\"name\",...this.fields.split(/\\s*,\\s*/)]):null,s=[],o=!1,a=await Ge.start({configuration:t,includeFooter:!1,json:this.json,stdout:this.context.stdout},async l=>{for(let c of this.packages){let u;if(c===\".\"){let T=i.topLevelWorkspace;if(!T.manifest.name)throw new be(`Missing ${ee.pretty(t,\"name\",ee.Type.CODE)} field in ${K.fromPortablePath(x.join(T.cwd,xt.manifest))}`);u=P.makeDescriptor(T.manifest.name,\"unknown\")}else u=P.parseDescriptor(c);let g=Mt.getIdentUrl(u),f=h1(await Mt.get(g,{configuration:t,ident:u,jsonResponse:!0,customErrorMessage:Mt.customPackageError})),h=Object.keys(f.versions).sort(g1.default.compareLoose),C=f[\"dist-tags\"].latest||h[h.length-1],y=vt.validRange(u.range);if(y){let T=g1.default.maxSatisfying(h,y);T!==null?C=T:(l.reportWarning(0,`Unmet range ${P.prettyRange(t,u.range)}; falling back to the latest version`),o=!0)}else Object.prototype.hasOwnProperty.call(f[\"dist-tags\"],u.range)?C=f[\"dist-tags\"][u.range]:u.range!==\"unknown\"&&(l.reportWarning(0,`Unknown tag ${P.prettyRange(t,u.range)}; falling back to the latest version`),o=!0);let B=f.versions[C],v={...f,...B,version:C,versions:h},D;if(n!==null){D={};for(let T of n){let H=v[T];if(typeof H<\"u\")D[T]=H;else{l.reportWarning(1,`The ${ee.pretty(t,T,ee.Type.CODE)} field doesn't exist inside ${P.prettyIdent(t,u)}'s information`),o=!0;continue}}}else this.json||(delete v.dist,delete v.readme,delete v.users),D=v;l.reportJson(D),this.json||s.push(D)}});f1.inspect.styles.name=\"cyan\";for(let l of s)(l!==s[0]||o)&&this.context.stdout.write(`\n`),this.context.stdout.write(`${(0,f1.inspect)(l,{depth:1/0,colors:!0,compact:!1})}\n`);return a.exitCode()}};$u.paths=[[\"npm\",\"info\"]],$u.usage=ve.Usage({category:\"Npm-related commands\",description:\"show information about a package\",details:\"\\n      This command fetches information about a package from the npm registry and prints it in a tree format.\\n\\n      The package does not have to be installed locally, but needs to have been published (in particular, local changes will be ignored even for workspaces).\\n\\n      Append `@<range>` to the package argument to provide information specific to the latest version that satisfies the range or to the corresponding tagged version. If the range is invalid or if there is no version satisfying the range, the command will print a warning and fall back to the latest version.\\n\\n      If the `-f,--fields` option is set, it's a comma-separated list of fields which will be used to only display part of the package information.\\n\\n      By default, this command won't return the `dist`, `readme`, and `users` fields, since they are often very long. To explicitly request those fields, explicitly list them with the `--fields` flag or request the output in JSON mode.\\n    \",examples:[[\"Show all available information about react (except the `dist`, `readme`, and `users` fields)\",\"yarn npm info react\"],[\"Show all available information about react as valid JSON (including the `dist`, `readme`, and `users` fields)\",\"yarn npm info react --json\"],[\"Show all available information about react@16.12.0\",\"yarn npm info react@16.12.0\"],[\"Show all available information about react@next\",\"yarn npm info react@next\"],[\"Show the description of react\",\"yarn npm info react --fields description\"],[\"Show all available versions of react\",\"yarn npm info react --fields versions\"],[\"Show the readme of react\",\"yarn npm info react --fields readme\"],[\"Show a few fields of react\",\"yarn npm info react --fields homepage,repository\"]]});function h1(r){if(Array.isArray(r)){let e=[];for(let t of r)t=h1(t),t&&e.push(t);return e}else if(typeof r==\"object\"&&r!==null){let e={};for(let t of Object.keys(r)){if(t.startsWith(\"_\"))continue;let i=h1(r[t]);i&&(e[t]=i)}return e}else return r||null}var Vue=Pe(Km()),eg=class extends De{constructor(){super(...arguments);this.scope=z.String(\"-s,--scope\",{description:\"Login to the registry configured for a given scope\"});this.publish=z.Boolean(\"--publish\",!1,{description:\"Login to the publish registry\"});this.alwaysAuth=z.Boolean(\"--always-auth\",{description:\"Set the npmAlwaysAuth configuration\"})}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),i=await Ub({configuration:t,cwd:this.context.cwd,publish:this.publish,scope:this.scope});return(await Ge.start({configuration:t,stdout:this.context.stdout,includeFooter:!1},async s=>{let o=await i9e({configuration:t,registry:i,report:s,stdin:this.context.stdin,stdout:this.context.stdout}),a=`/-/user/org.couchdb.user:${encodeURIComponent(o.name)}`,l=await Mt.put(a,o,{attemptedAs:o.name,configuration:t,registry:i,jsonResponse:!0,authType:Mt.AuthType.NO_AUTH});return await r9e(i,l.token,{alwaysAuth:this.alwaysAuth,scope:this.scope}),s.reportInfo(0,\"Successfully logged in\")})).exitCode()}};eg.paths=[[\"npm\",\"login\"]],eg.usage=ve.Usage({category:\"Npm-related commands\",description:\"store new login info to access the npm registry\",details:\"\\n      This command will ask you for your username, password, and 2FA One-Time-Password (when it applies). It will then modify your local configuration (in your home folder, never in the project itself) to reference the new tokens thus generated.\\n\\n      Adding the `-s,--scope` flag will cause the authentication to be done against whatever registry is configured for the associated scope (see also `npmScopes`).\\n\\n      Adding the `--publish` flag will cause the authentication to be done against the registry used when publishing the package (see also `publishConfig.registry` and `npmPublishRegistry`).\\n    \",examples:[[\"Login to the default registry\",\"yarn npm login\"],[\"Login to the registry linked to the @my-scope registry\",\"yarn npm login --scope my-scope\"],[\"Login to the publish registry for the current package\",\"yarn npm login --publish\"]]});async function Ub({scope:r,publish:e,configuration:t,cwd:i}){return r&&e?or.getScopeRegistry(r,{configuration:t,type:or.RegistryType.PUBLISH_REGISTRY}):r?or.getScopeRegistry(r,{configuration:t}):e?or.getPublishRegistry((await Hh(t,i)).manifest,{configuration:t}):or.getDefaultRegistry({configuration:t})}async function r9e(r,e,{alwaysAuth:t,scope:i}){let n=o=>a=>{let l=Ie.isIndexableObject(a)?a:{},c=l[o],u=Ie.isIndexableObject(c)?c:{};return{...l,[o]:{...u,...t!==void 0?{npmAlwaysAuth:t}:{},npmAuthToken:e}}},s=i?{npmScopes:n(i)}:{npmRegistries:n(r)};return await ye.updateHomeConfiguration(s)}async function i9e({configuration:r,registry:e,report:t,stdin:i,stdout:n}){t.reportInfo(0,`Logging in to ${ee.pretty(r,e,ee.Type.URL)}`);let s=!1;if(e.match(/^https:\\/\\/npm\\.pkg\\.github\\.com(\\/|$)/)&&(t.reportInfo(0,\"You seem to be using the GitHub Package Registry. Tokens must be generated with the 'repo', 'write:packages', and 'read:packages' permissions.\"),s=!0),t.reportSeparator(),process.env.YARN_IS_TEST_ENV)return{name:process.env.YARN_INJECT_NPM_USER||\"\",password:process.env.YARN_INJECT_NPM_PASSWORD||\"\"};let{username:o,password:a}=await(0,Vue.prompt)([{type:\"input\",name:\"username\",message:\"Username:\",required:!0,onCancel:()=>process.exit(130),stdin:i,stdout:n},{type:\"password\",name:\"password\",message:s?\"Token:\":\"Password:\",required:!0,onCancel:()=>process.exit(130),stdin:i,stdout:n}]);return t.reportSeparator(),{name:o,password:a}}var mp=new Set([\"npmAuthIdent\",\"npmAuthToken\"]),tg=class extends De{constructor(){super(...arguments);this.scope=z.String(\"-s,--scope\",{description:\"Logout of the registry configured for a given scope\"});this.publish=z.Boolean(\"--publish\",!1,{description:\"Logout of the publish registry\"});this.all=z.Boolean(\"-A,--all\",!1,{description:\"Logout of all registries\"})}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),i=async()=>{var c;let s=await Ub({configuration:t,cwd:this.context.cwd,publish:this.publish,scope:this.scope}),o=await ye.find(this.context.cwd,this.context.plugins),a=P.makeIdent((c=this.scope)!=null?c:null,\"pkg\");return!or.getAuthConfiguration(s,{configuration:o,ident:a}).get(\"npmAuthToken\")};return(await Ge.start({configuration:t,stdout:this.context.stdout},async s=>{if(this.all&&(await s9e(),s.reportInfo(0,\"Successfully logged out from everything\")),this.scope){await Xue(\"npmScopes\",this.scope),await i()?s.reportInfo(0,`Successfully logged out from ${this.scope}`):s.reportWarning(0,\"Scope authentication settings removed, but some other ones settings still apply to it\");return}let o=await Ub({configuration:t,cwd:this.context.cwd,publish:this.publish});await Xue(\"npmRegistries\",o),await i()?s.reportInfo(0,`Successfully logged out from ${o}`):s.reportWarning(0,\"Registry authentication settings removed, but some other ones settings still apply to it\")})).exitCode()}};tg.paths=[[\"npm\",\"logout\"]],tg.usage=ve.Usage({category:\"Npm-related commands\",description:\"logout of the npm registry\",details:\"\\n      This command will log you out by modifying your local configuration (in your home folder, never in the project itself) to delete all credentials linked to a registry.\\n\\n      Adding the `-s,--scope` flag will cause the deletion to be done against whatever registry is configured for the associated scope (see also `npmScopes`).\\n\\n      Adding the `--publish` flag will cause the deletion to be done against the registry used when publishing the package (see also `publishConfig.registry` and `npmPublishRegistry`).\\n\\n      Adding the `-A,--all` flag will cause the deletion to be done against all registries and scopes.\\n    \",examples:[[\"Logout of the default registry\",\"yarn npm logout\"],[\"Logout of the @my-scope scope\",\"yarn npm logout --scope my-scope\"],[\"Logout of the publish registry for the current package\",\"yarn npm logout --publish\"],[\"Logout of all registries\",\"yarn npm logout --all\"]]});function n9e(r,e){let t=r[e];if(!Ie.isIndexableObject(t))return!1;let i=new Set(Object.keys(t));if([...mp].every(s=>!i.has(s)))return!1;for(let s of mp)i.delete(s);if(i.size===0)return r[e]=void 0,!0;let n={...t};for(let s of mp)delete n[s];return r[e]=n,!0}async function s9e(){let r=e=>{let t=!1,i=Ie.isIndexableObject(e)?{...e}:{};i.npmAuthToken&&(delete i.npmAuthToken,t=!0);for(let n of Object.keys(i))n9e(i,n)&&(t=!0);if(Object.keys(i).length!==0)return t?i:e};return await ye.updateHomeConfiguration({npmRegistries:r,npmScopes:r})}async function Xue(r,e){return await ye.updateHomeConfiguration({[r]:t=>{let i=Ie.isIndexableObject(t)?t:{};if(!Object.prototype.hasOwnProperty.call(i,e))return t;let n=i[e],s=Ie.isIndexableObject(n)?n:{},o=new Set(Object.keys(s));if([...mp].every(l=>!o.has(l)))return t;for(let l of mp)o.delete(l);if(o.size===0)return Object.keys(i).length===1?void 0:{...i,[e]:void 0};let a={};for(let l of mp)a[l]=void 0;return{...i,[e]:{...s,...a}}}})}var rg=class extends De{constructor(){super(...arguments);this.access=z.String(\"--access\",{description:\"The access for the published package (public or restricted)\"});this.tag=z.String(\"--tag\",\"latest\",{description:\"The tag on the registry that the package should be attached to\"});this.tolerateRepublish=z.Boolean(\"--tolerate-republish\",!1,{description:\"Warn and exit when republishing an already existing version of a package\"});this.otp=z.String(\"--otp\",{description:\"The OTP token to use with the command\"})}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,workspace:n}=await je.find(t,this.context.cwd);if(!n)throw new ct(i.cwd,this.context.cwd);if(n.manifest.private)throw new be(\"Private workspaces cannot be published\");if(n.manifest.name===null||n.manifest.version===null)throw new be(\"Workspaces must have valid names and versions to be published on an external registry\");await i.restoreInstallState();let s=n.manifest.name,o=n.manifest.version,a=or.getPublishRegistry(n.manifest,{configuration:t});return(await Ge.start({configuration:t,stdout:this.context.stdout},async c=>{var u,g;if(this.tolerateRepublish)try{let f=await Mt.get(Mt.getIdentUrl(s),{configuration:t,registry:a,ident:s,jsonResponse:!0});if(!Object.prototype.hasOwnProperty.call(f,\"versions\"))throw new at(15,'Registry returned invalid data for - missing \"versions\" field');if(Object.prototype.hasOwnProperty.call(f.versions,o)){c.reportWarning(0,`Registry already knows about version ${o}; skipping.`);return}}catch(f){if(((g=(u=f.originalError)==null?void 0:u.response)==null?void 0:g.statusCode)!==404)throw f}await Wt.maybeExecuteWorkspaceLifecycleScript(n,\"prepublish\",{report:c}),await ca.prepareForPack(n,{report:c},async()=>{let f=await ca.genPackList(n);for(let B of f)c.reportInfo(null,B);let h=await ca.genPackStream(n,f),p=await Ie.bufferStream(h),C=await Cp.getGitHead(n.cwd),y=await Cp.makePublishBody(n,p,{access:this.access,tag:this.tag,registry:a,gitHead:C});await Mt.put(Mt.getIdentUrl(s),y,{configuration:t,registry:a,ident:s,otp:this.otp,jsonResponse:!0})}),c.reportInfo(0,\"Package archive published\")})).exitCode()}};rg.paths=[[\"npm\",\"publish\"]],rg.usage=ve.Usage({category:\"Npm-related commands\",description:\"publish the active workspace to the npm registry\",details:'\\n      This command will pack the active workspace into a fresh archive and upload it to the npm registry.\\n\\n      The package will by default be attached to the `latest` tag on the registry, but this behavior can be overriden by using the `--tag` option.\\n\\n      Note that for legacy reasons scoped packages are by default published with an access set to `restricted` (aka \"private packages\"). This requires you to register for a paid npm plan. In case you simply wish to publish a public scoped package to the registry (for free), just add the `--access public` flag. This behavior can be enabled by default through the `npmPublishAccess` settings.\\n    ',examples:[[\"Publish the active workspace\",\"yarn npm publish\"]]});var Zue=Pe(Xr());var ig=class extends De{constructor(){super(...arguments);this.json=z.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.package=z.String({required:!1})}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,workspace:n}=await je.find(t,this.context.cwd),s;if(typeof this.package<\"u\")s=P.parseIdent(this.package);else{if(!n)throw new ct(i.cwd,this.context.cwd);if(!n.manifest.name)throw new be(`Missing 'name' field in ${K.fromPortablePath(x.join(n.cwd,xt.manifest))}`);s=n.manifest.name}let o=await RE(s,t),l={children:Ie.sortMap(Object.entries(o),([c])=>c).map(([c,u])=>({value:ee.tuple(ee.Type.RESOLUTION,{descriptor:P.makeDescriptor(s,c),locator:P.makeLocator(s,u)})}))};return es.emitTree(l,{configuration:t,json:this.json,stdout:this.context.stdout})}};ig.paths=[[\"npm\",\"tag\",\"list\"]],ig.usage=ve.Usage({category:\"Npm-related commands\",description:\"list all dist-tags of a package\",details:`\n      This command will list all tags of a package from the npm registry.\n\n      If the package is not specified, Yarn will default to the current workspace.\n    `,examples:[[\"List all tags of package `my-pkg`\",\"yarn npm tag list my-pkg\"]]});async function RE(r,e){let t=`/-/package${Mt.getIdentUrl(r)}/dist-tags`;return Mt.get(t,{configuration:e,ident:r,jsonResponse:!0,customErrorMessage:Mt.customPackageError})}var ng=class extends De{constructor(){super(...arguments);this.package=z.String();this.tag=z.String()}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,workspace:n}=await je.find(t,this.context.cwd);if(!n)throw new ct(i.cwd,this.context.cwd);let s=P.parseDescriptor(this.package,!0),o=s.range;if(!Zue.default.valid(o))throw new be(`The range ${ee.pretty(t,s.range,ee.Type.RANGE)} must be a valid semver version`);let a=or.getPublishRegistry(n.manifest,{configuration:t}),l=ee.pretty(t,s,ee.Type.IDENT),c=ee.pretty(t,o,ee.Type.RANGE),u=ee.pretty(t,this.tag,ee.Type.CODE);return(await Ge.start({configuration:t,stdout:this.context.stdout},async f=>{let h=await RE(s,t);Object.prototype.hasOwnProperty.call(h,this.tag)&&h[this.tag]===o&&f.reportWarning(0,`Tag ${u} is already set to version ${c}`);let p=`/-/package${Mt.getIdentUrl(s)}/dist-tags/${encodeURIComponent(this.tag)}`;await Mt.put(p,o,{configuration:t,registry:a,ident:s,jsonRequest:!0,jsonResponse:!0}),f.reportInfo(0,`Tag ${u} added to version ${c} of package ${l}`)})).exitCode()}};ng.paths=[[\"npm\",\"tag\",\"add\"]],ng.usage=ve.Usage({category:\"Npm-related commands\",description:\"add a tag for a specific version of a package\",details:`\n      This command will add a tag to the npm registry for a specific version of a package. If the tag already exists, it will be overwritten.\n    `,examples:[[\"Add a `beta` tag for version `2.3.4-beta.4` of package `my-pkg`\",\"yarn npm tag add my-pkg@2.3.4-beta.4 beta\"]]});var sg=class extends De{constructor(){super(...arguments);this.package=z.String();this.tag=z.String()}async execute(){if(this.tag===\"latest\")throw new be(\"The 'latest' tag cannot be removed.\");let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,workspace:n}=await je.find(t,this.context.cwd);if(!n)throw new ct(i.cwd,this.context.cwd);let s=P.parseIdent(this.package),o=or.getPublishRegistry(n.manifest,{configuration:t}),a=ee.pretty(t,this.tag,ee.Type.CODE),l=ee.pretty(t,s,ee.Type.IDENT),c=await RE(s,t);if(!Object.prototype.hasOwnProperty.call(c,this.tag))throw new be(`${a} is not a tag of package ${l}`);return(await Ge.start({configuration:t,stdout:this.context.stdout},async g=>{let f=`/-/package${Mt.getIdentUrl(s)}/dist-tags/${encodeURIComponent(this.tag)}`;await Mt.del(f,{configuration:t,registry:o,ident:s,jsonResponse:!0}),g.reportInfo(0,`Tag ${a} removed from package ${l}`)})).exitCode()}};sg.paths=[[\"npm\",\"tag\",\"remove\"]],sg.usage=ve.Usage({category:\"Npm-related commands\",description:\"remove a tag from a package\",details:`\n      This command will remove a tag from a package from the npm registry.\n    `,examples:[[\"Remove the `beta` tag from package `my-pkg`\",\"yarn npm tag remove my-pkg beta\"]]});var og=class extends De{constructor(){super(...arguments);this.scope=z.String(\"-s,--scope\",{description:\"Print username for the registry configured for a given scope\"});this.publish=z.Boolean(\"--publish\",!1,{description:\"Print username for the publish registry\"})}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),i;return this.scope&&this.publish?i=or.getScopeRegistry(this.scope,{configuration:t,type:or.RegistryType.PUBLISH_REGISTRY}):this.scope?i=or.getScopeRegistry(this.scope,{configuration:t}):this.publish?i=or.getPublishRegistry((await Hh(t,this.context.cwd)).manifest,{configuration:t}):i=or.getDefaultRegistry({configuration:t}),(await Ge.start({configuration:t,stdout:this.context.stdout},async s=>{var a,l;let o;try{o=await Mt.get(\"/-/whoami\",{configuration:t,registry:i,authType:Mt.AuthType.ALWAYS_AUTH,jsonResponse:!0,ident:this.scope?P.makeIdent(this.scope,\"\"):void 0})}catch(c){if(((a=c.response)==null?void 0:a.statusCode)===401||((l=c.response)==null?void 0:l.statusCode)===403){s.reportError(41,\"Authentication failed - your credentials may have expired\");return}else throw c}s.reportInfo(0,o.username)})).exitCode()}};og.paths=[[\"npm\",\"whoami\"]],og.usage=ve.Usage({category:\"Npm-related commands\",description:\"display the name of the authenticated user\",details:\"\\n      Print the username associated with the current authentication settings to the standard output.\\n\\n      When using `-s,--scope`, the username printed will be the one that matches the authentication settings of the registry associated with the given scope (those settings can be overriden using the `npmRegistries` map, and the registry associated with the scope is configured via the `npmScopes` map).\\n\\n      When using `--publish`, the registry we'll select will by default be the one used when publishing packages (`publishConfig.registry` or `npmPublishRegistry` if available, otherwise we'll fallback to the regular `npmRegistryServer`).\\n    \",examples:[[\"Print username for the default registry\",\"yarn npm whoami\"],[\"Print username for the registry on a given scope\",\"yarn npm whoami --scope company\"]]});var o9e={configuration:{npmPublishAccess:{description:\"Default access of the published packages\",type:\"STRING\",default:null},npmAuditExcludePackages:{description:\"Array of glob patterns of packages to exclude from npm audit\",type:\"STRING\",default:[],isArray:!0},npmAuditIgnoreAdvisories:{description:\"Array of glob patterns of advisory IDs to exclude from npm audit\",type:\"STRING\",default:[],isArray:!0}},commands:[_u,$u,eg,tg,rg,ng,ig,sg,og]},a9e=o9e;var Q1={};ut(Q1,{default:()=>B9e,patchUtils:()=>ag});var ag={};ut(ag,{applyPatchFile:()=>Gb,diffFolders:()=>w1,ensureUnpatchedDescriptor:()=>C1,extractPackageToDisk:()=>y1,extractPatchFlags:()=>nge,isParentRequired:()=>I1,loadPatchFiles:()=>LE,makeDescriptor:()=>m1,makeLocator:()=>E1,makePatchHash:()=>B1,parseDescriptor:()=>NE,parseLocator:()=>TE,parsePatchFile:()=>FE});var A9e=/^@@ -(\\d+)(,(\\d+))? \\+(\\d+)(,(\\d+))? @@.*/;function Ep(r){return x.relative(Oe.root,x.resolve(Oe.root,K.toPortablePath(r)))}function l9e(r){let e=r.trim().match(A9e);if(!e)throw new Error(`Bad header line: '${r}'`);return{original:{start:Math.max(Number(e[1]),1),length:Number(e[3]||1)},patched:{start:Math.max(Number(e[4]),1),length:Number(e[6]||1)}}}var c9e=420,u9e=493;var _ue=()=>({semverExclusivity:null,diffLineFromPath:null,diffLineToPath:null,oldMode:null,newMode:null,deletedFileMode:null,newFileMode:null,renameFrom:null,renameTo:null,beforeHash:null,afterHash:null,fromPath:null,toPath:null,hunks:null}),g9e=r=>({header:l9e(r),parts:[]}),f9e={[\"@\"]:\"header\",[\"-\"]:\"deletion\",[\"+\"]:\"insertion\",[\" \"]:\"context\",[\"\\\\\"]:\"pragma\",undefined:\"context\"};function h9e(r){let e=[],t=_ue(),i=\"parsing header\",n=null,s=null;function o(){n&&(s&&(n.parts.push(s),s=null),t.hunks.push(n),n=null)}function a(){o(),e.push(t),t=_ue()}for(let l=0;l<r.length;l++){let c=r[l];if(i===\"parsing header\")if(c.startsWith(\"@@\"))i=\"parsing hunks\",t.hunks=[],l-=1;else if(c.startsWith(\"diff --git \")){t&&t.diffLineFromPath&&a();let u=c.match(/^diff --git a\\/(.*?) b\\/(.*?)\\s*$/);if(!u)throw new Error(`Bad diff line: ${c}`);t.diffLineFromPath=u[1],t.diffLineToPath=u[2]}else if(c.startsWith(\"old mode \"))t.oldMode=c.slice(9).trim();else if(c.startsWith(\"new mode \"))t.newMode=c.slice(9).trim();else if(c.startsWith(\"deleted file mode \"))t.deletedFileMode=c.slice(18).trim();else if(c.startsWith(\"new file mode \"))t.newFileMode=c.slice(14).trim();else if(c.startsWith(\"rename from \"))t.renameFrom=c.slice(12).trim();else if(c.startsWith(\"rename to \"))t.renameTo=c.slice(10).trim();else if(c.startsWith(\"index \")){let u=c.match(/(\\w+)\\.\\.(\\w+)/);if(!u)continue;t.beforeHash=u[1],t.afterHash=u[2]}else c.startsWith(\"semver exclusivity \")?t.semverExclusivity=c.slice(19).trim():c.startsWith(\"--- \")?t.fromPath=c.slice(6).trim():c.startsWith(\"+++ \")&&(t.toPath=c.slice(6).trim());else{let u=f9e[c[0]]||null;switch(u){case\"header\":o(),n=g9e(c);break;case null:i=\"parsing header\",a(),l-=1;break;case\"pragma\":{if(!c.startsWith(\"\\\\ No newline at end of file\"))throw new Error(`Unrecognized pragma in patch file: ${c}`);if(!s)throw new Error(\"Bad parser state: No newline at EOF pragma encountered without context\");s.noNewlineAtEndOfFile=!0}break;case\"context\":case\"deletion\":case\"insertion\":{if(!n)throw new Error(\"Bad parser state: Hunk lines encountered before hunk header\");s&&s.type!==u&&(n.parts.push(s),s=null),s||(s={type:u,lines:[],noNewlineAtEndOfFile:!1}),s.lines.push(c.slice(1))}break;default:Ie.assertNever(u);break}}}a();for(let{hunks:l}of e)if(l)for(let c of l)d9e(c);return e}function p9e(r){let e=[];for(let t of r){let{semverExclusivity:i,diffLineFromPath:n,diffLineToPath:s,oldMode:o,newMode:a,deletedFileMode:l,newFileMode:c,renameFrom:u,renameTo:g,beforeHash:f,afterHash:h,fromPath:p,toPath:C,hunks:y}=t,B=u?\"rename\":l?\"file deletion\":c?\"file creation\":y&&y.length>0?\"patch\":\"mode change\",v=null;switch(B){case\"rename\":{if(!u||!g)throw new Error(\"Bad parser state: rename from & to not given\");e.push({type:\"rename\",semverExclusivity:i,fromPath:Ep(u),toPath:Ep(g)}),v=g}break;case\"file deletion\":{let D=n||p;if(!D)throw new Error(\"Bad parse state: no path given for file deletion\");e.push({type:\"file deletion\",semverExclusivity:i,hunk:y&&y[0]||null,path:Ep(D),mode:Hb(l),hash:f})}break;case\"file creation\":{let D=s||C;if(!D)throw new Error(\"Bad parse state: no path given for file creation\");e.push({type:\"file creation\",semverExclusivity:i,hunk:y&&y[0]||null,path:Ep(D),mode:Hb(c),hash:h})}break;case\"patch\":case\"mode change\":v=C||s;break;default:Ie.assertNever(B);break}v&&o&&a&&o!==a&&e.push({type:\"mode change\",semverExclusivity:i,path:Ep(v),oldMode:Hb(o),newMode:Hb(a)}),v&&y&&y.length&&e.push({type:\"patch\",semverExclusivity:i,path:Ep(v),hunks:y,beforeHash:f,afterHash:h})}if(e.length===0)throw new Error(\"Unable to parse patch file: No changes found. Make sure the patch is a valid UTF8 encoded string\");return e}function Hb(r){let e=parseInt(r,8)&511;if(e!==c9e&&e!==u9e)throw new Error(`Unexpected file mode string: ${r}`);return e}function FE(r){let e=r.split(/\\n/g);return e[e.length-1]===\"\"&&e.pop(),p9e(h9e(e))}function d9e(r){let e=0,t=0;for(let{type:i,lines:n}of r.parts)switch(i){case\"context\":t+=n.length,e+=n.length;break;case\"deletion\":e+=n.length;break;case\"insertion\":t+=n.length;break;default:Ie.assertNever(i);break}if(e!==r.header.original.length||t!==r.header.patched.length){let i=n=>n<0?n:`+${n}`;throw new Error(`hunk header integrity check failed (expected @@ ${i(r.header.original.length)} ${i(r.header.patched.length)} @@, got @@ ${i(e)} ${i(t)} @@)`)}}var Ip=class extends Error{constructor(t,i){super(`Cannot apply hunk #${t+1}`);this.hunk=i}};async function yp(r,e,t){let i=await r.lstatPromise(e),n=await t();if(typeof n<\"u\"&&(e=n),r.lutimesPromise)await r.lutimesPromise(e,i.atime,i.mtime);else if(!i.isSymbolicLink())await r.utimesPromise(e,i.atime,i.mtime);else throw new Error(\"Cannot preserve the time values of a symlink\")}async function Gb(r,{baseFs:e=new $t,dryRun:t=!1,version:i=null}={}){for(let n of r)if(!(n.semverExclusivity!==null&&i!==null&&!vt.satisfiesWithPrereleases(i,n.semverExclusivity)))switch(n.type){case\"file deletion\":if(t){if(!e.existsSync(n.path))throw new Error(`Trying to delete a file that doesn't exist: ${n.path}`)}else await yp(e,x.dirname(n.path),async()=>{await e.unlinkPromise(n.path)});break;case\"rename\":if(t){if(!e.existsSync(n.fromPath))throw new Error(`Trying to move a file that doesn't exist: ${n.fromPath}`)}else await yp(e,x.dirname(n.fromPath),async()=>{await yp(e,x.dirname(n.toPath),async()=>{await yp(e,n.fromPath,async()=>(await e.movePromise(n.fromPath,n.toPath),n.toPath))})});break;case\"file creation\":if(t){if(e.existsSync(n.path))throw new Error(`Trying to create a file that already exists: ${n.path}`)}else{let s=n.hunk?n.hunk.parts[0].lines.join(`\n`)+(n.hunk.parts[0].noNewlineAtEndOfFile?\"\":`\n`):\"\";await e.mkdirpPromise(x.dirname(n.path),{chmod:493,utimes:[xr.SAFE_TIME,xr.SAFE_TIME]}),await e.writeFilePromise(n.path,s,{mode:n.mode}),await e.utimesPromise(n.path,xr.SAFE_TIME,xr.SAFE_TIME)}break;case\"patch\":await yp(e,n.path,async()=>{await E9e(n,{baseFs:e,dryRun:t})});break;case\"mode change\":{let o=(await e.statPromise(n.path)).mode;if($ue(n.newMode)!==$ue(o))continue;await yp(e,n.path,async()=>{await e.chmodPromise(n.path,n.newMode)})}break;default:Ie.assertNever(n);break}}function $ue(r){return(r&64)>0}function ege(r){return r.replace(/\\s+$/,\"\")}function m9e(r,e){return ege(r)===ege(e)}async function E9e({hunks:r,path:e},{baseFs:t,dryRun:i=!1}){let n=await t.statSync(e).mode,o=(await t.readFileSync(e,\"utf8\")).split(/\\n/),a=[],l=0,c=0;for(let g of r){let f=Math.max(c,g.header.patched.start+l),h=Math.max(0,f-c),p=Math.max(0,o.length-f-g.header.original.length),C=Math.max(h,p),y=0,B=0,v=null;for(;y<=C;){if(y<=h&&(B=f-y,v=tge(g,o,B),v!==null)){y=-y;break}if(y<=p&&(B=f+y,v=tge(g,o,B),v!==null))break;y+=1}if(v===null)throw new Ip(r.indexOf(g),g);a.push(v),l+=y,c=B+g.header.original.length}if(i)return;let u=0;for(let g of a)for(let f of g)switch(f.type){case\"splice\":{let h=f.index+u;o.splice(h,f.numToDelete,...f.linesToInsert),u+=f.linesToInsert.length-f.numToDelete}break;case\"pop\":o.pop();break;case\"push\":o.push(f.line);break;default:Ie.assertNever(f);break}await t.writeFilePromise(e,o.join(`\n`),{mode:n})}function tge(r,e,t){let i=[];for(let n of r.parts)switch(n.type){case\"context\":case\"deletion\":{for(let s of n.lines){let o=e[t];if(o==null||!m9e(o,s))return null;t+=1}n.type===\"deletion\"&&(i.push({type:\"splice\",index:t-n.lines.length,numToDelete:n.lines.length,linesToInsert:[]}),n.noNewlineAtEndOfFile&&i.push({type:\"push\",line:\"\"}))}break;case\"insertion\":i.push({type:\"splice\",index:t,numToDelete:0,linesToInsert:n.lines}),n.noNewlineAtEndOfFile&&i.push({type:\"pop\"});break;default:Ie.assertNever(n.type);break}return i}var y9e=/^builtin<([^>]+)>$/;function d1(r,e){let{source:t,selector:i,params:n}=P.parseRange(r);if(t===null)throw new Error(\"Patch locators must explicitly define their source\");let s=i?i.split(/&/).map(c=>K.toPortablePath(c)):[],o=n&&typeof n.locator==\"string\"?P.parseLocator(n.locator):null,a=n&&typeof n.version==\"string\"?n.version:null,l=e(t);return{parentLocator:o,sourceItem:l,patchPaths:s,sourceVersion:a}}function NE(r){let{sourceItem:e,...t}=d1(r.range,P.parseDescriptor);return{...t,sourceDescriptor:e}}function TE(r){let{sourceItem:e,...t}=d1(r.reference,P.parseLocator);return{...t,sourceLocator:e}}function C1(r){if(!r.range.startsWith(\"patch:\"))return r;let{sourceItem:e}=d1(r.range,P.parseDescriptor);return e}function rge({parentLocator:r,sourceItem:e,patchPaths:t,sourceVersion:i,patchHash:n},s){let o=r!==null?{locator:P.stringifyLocator(r)}:{},a=typeof i<\"u\"?{version:i}:{},l=typeof n<\"u\"?{hash:n}:{};return P.makeRange({protocol:\"patch:\",source:s(e),selector:t.join(\"&\"),params:{...a,...l,...o}})}function m1(r,{parentLocator:e,sourceDescriptor:t,patchPaths:i}){return P.makeDescriptor(r,rge({parentLocator:e,sourceItem:t,patchPaths:i},P.stringifyDescriptor))}function E1(r,{parentLocator:e,sourcePackage:t,patchPaths:i,patchHash:n}){return P.makeLocator(r,rge({parentLocator:e,sourceItem:t,sourceVersion:t.version,patchPaths:i,patchHash:n},P.stringifyLocator))}function ige({onAbsolute:r,onRelative:e,onBuiltin:t},i){i.startsWith(\"~\")&&(i=i.slice(1));let s=i.match(y9e);return s!==null?t(s[1]):x.isAbsolute(i)?r(i):e(i)}function nge(r){let e=r.startsWith(\"~\");return e&&(r=r.slice(1)),{optional:e}}function I1(r){return ige({onAbsolute:()=>!1,onRelative:()=>!0,onBuiltin:()=>!1},r)}async function LE(r,e,t){let i=r!==null?await t.fetcher.fetch(r,t):null,n=i&&i.localPath?{packageFs:new qt(Oe.root),prefixPath:x.relative(Oe.root,i.localPath)}:i;i&&i!==n&&i.releaseFs&&i.releaseFs();let s=await Ie.releaseAfterUseAsync(async()=>await Promise.all(e.map(async o=>{let a=nge(o),l=await ige({onAbsolute:async()=>await M.readFilePromise(o,\"utf8\"),onRelative:async()=>{if(n===null)throw new Error(\"Assertion failed: The parent locator should have been fetched\");return await n.packageFs.readFilePromise(x.join(n.prefixPath,o),\"utf8\")},onBuiltin:async c=>await t.project.configuration.firstHook(u=>u.getBuiltinPatch,t.project,c)},o);return{...a,source:l}})));for(let o of s)typeof o.source==\"string\"&&(o.source=o.source.replace(/\\r\\n?/g,`\n`));return s}async function y1(r,{cache:e,project:t}){let i=t.storedPackages.get(r.locatorHash);if(typeof i>\"u\")throw new Error(\"Assertion failed: Expected the package to be registered\");let n=t.storedChecksums,s=new ti,o=t.configuration.makeFetcher(),a=await o.fetch(r,{cache:e,project:t,fetcher:o,checksums:n,report:s}),l=await M.mktempPromise(),c=x.join(l,\"source\"),u=x.join(l,\"user\"),g=x.join(l,\".yarn-patch.json\");return await Promise.all([M.copyPromise(c,a.prefixPath,{baseFs:a.packageFs}),M.copyPromise(u,a.prefixPath,{baseFs:a.packageFs}),M.writeJsonPromise(g,{locator:P.stringifyLocator(r),version:i.version})]),M.detachTemp(l),u}async function w1(r,e){let t=K.fromPortablePath(r).replace(/\\\\/g,\"/\"),i=K.fromPortablePath(e).replace(/\\\\/g,\"/\"),{stdout:n,stderr:s}=await Cr.execvp(\"git\",[\"-c\",\"core.safecrlf=false\",\"diff\",\"--src-prefix=a/\",\"--dst-prefix=b/\",\"--ignore-cr-at-eol\",\"--full-index\",\"--no-index\",\"--no-renames\",\"--text\",t,i],{cwd:K.toPortablePath(process.cwd()),env:{...process.env,GIT_CONFIG_NOSYSTEM:\"1\",HOME:\"\",XDG_CONFIG_HOME:\"\",USERPROFILE:\"\"}});if(s.length>0)throw new Error(`Unable to diff directories. Make sure you have a recent version of 'git' available in PATH.\nThe following error was reported by 'git':\n${s}`);let o=t.startsWith(\"/\")?a=>a.slice(1):a=>a;return n.replace(new RegExp(`(a|b)(${Ie.escapeRegExp(`/${o(t)}/`)})`,\"g\"),\"$1/\").replace(new RegExp(`(a|b)${Ie.escapeRegExp(`/${o(i)}/`)}`,\"g\"),\"$1/\").replace(new RegExp(Ie.escapeRegExp(`${t}/`),\"g\"),\"\").replace(new RegExp(Ie.escapeRegExp(`${i}/`),\"g\"),\"\")}function B1(r,e){let t=[];for(let{source:i}of r){if(i===null)continue;let n=FE(i);for(let s of n){let{semverExclusivity:o,...a}=s;o!==null&&e!==null&&!vt.satisfiesWithPrereleases(e,o)||t.push(JSON.stringify(a))}}return li.makeHash(`${3}`,...t).slice(0,6)}function sge(r,{configuration:e,report:t}){for(let i of r.parts)for(let n of i.lines)switch(i.type){case\"context\":t.reportInfo(null,`  ${ee.pretty(e,n,\"grey\")}`);break;case\"deletion\":t.reportError(28,`- ${ee.pretty(e,n,ee.Type.REMOVED)}`);break;case\"insertion\":t.reportError(28,`+ ${ee.pretty(e,n,ee.Type.ADDED)}`);break;default:Ie.assertNever(i.type)}}var Yb=class{supports(e,t){return!!e.reference.startsWith(\"patch:\")}getLocalPath(e,t){return null}async fetch(e,t){let i=t.checksums.get(e.locatorHash)||null,[n,s,o]=await t.cache.fetchPackageFromCache(e,i,{onHit:()=>t.report.reportCacheHit(e),onMiss:()=>t.report.reportCacheMiss(e,`${P.prettyLocator(t.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.patchPackage(e,t),skipIntegrityCheck:t.skipIntegrityCheck,...t.cacheOptions});return{packageFs:n,releaseFs:s,prefixPath:P.getIdentVendorPath(e),localPath:this.getLocalPath(e,t),checksum:o}}async patchPackage(e,t){let{parentLocator:i,sourceLocator:n,sourceVersion:s,patchPaths:o}=TE(e),a=await LE(i,o,t),l=await M.mktempPromise(),c=x.join(l,\"current.zip\"),u=await t.fetcher.fetch(n,t),g=P.getIdentVendorPath(e),f=await an(),h=new Wr(c,{libzip:f,create:!0,level:t.project.configuration.get(\"compressionLevel\")});await Ie.releaseAfterUseAsync(async()=>{await h.copyPromise(g,u.prefixPath,{baseFs:u.packageFs,stableSort:!0})},u.releaseFs),h.saveAndClose();for(let{source:p,optional:C}of a){if(p===null)continue;let y=new Wr(c,{libzip:f,level:t.project.configuration.get(\"compressionLevel\")}),B=new qt(x.resolve(Oe.root,g),{baseFs:y});try{await Gb(FE(p),{baseFs:B,version:s})}catch(v){if(!(v instanceof Ip))throw v;let D=t.project.configuration.get(\"enableInlineHunks\"),T=!D&&!C?\" (set enableInlineHunks for details)\":\"\",H=`${P.prettyLocator(t.project.configuration,e)}: ${v.message}${T}`,j=$=>{!D||sge(v.hunk,{configuration:t.project.configuration,report:$})};if(y.discardAndClose(),C){t.report.reportWarningOnce(66,H,{reportExtra:j});continue}else throw new at(66,H,j)}y.saveAndClose()}return new Wr(c,{libzip:f,level:t.project.configuration.get(\"compressionLevel\")})}};var jb=class{supportsDescriptor(e,t){return!!e.range.startsWith(\"patch:\")}supportsLocator(e,t){return!!e.reference.startsWith(\"patch:\")}shouldPersistResolution(e,t){return!1}bindDescriptor(e,t,i){let{patchPaths:n}=NE(e);return n.every(s=>!I1(s))?e:P.bindDescriptor(e,{locator:P.stringifyLocator(t)})}getResolutionDependencies(e,t){let{sourceDescriptor:i}=NE(e);return[i]}async getCandidates(e,t,i){if(!i.fetchOptions)throw new Error(\"Assertion failed: This resolver cannot be used unless a fetcher is configured\");let{parentLocator:n,sourceDescriptor:s,patchPaths:o}=NE(e),a=await LE(n,o,i.fetchOptions),l=t.get(s.descriptorHash);if(typeof l>\"u\")throw new Error(\"Assertion failed: The dependency should have been resolved\");let c=B1(a,l.version);return[E1(e,{parentLocator:n,sourcePackage:l,patchPaths:o,patchHash:c})]}async getSatisfying(e,t,i){return null}async resolve(e,t){let{sourceLocator:i}=TE(e);return{...await t.resolver.resolve(i,t),...e}}};var Ag=class extends De{constructor(){super(...arguments);this.save=z.Boolean(\"-s,--save\",!1,{description:\"Add the patch to your resolution entries\"});this.patchFolder=z.String()}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,workspace:n}=await je.find(t,this.context.cwd);if(!n)throw new ct(i.cwd,this.context.cwd);await i.restoreInstallState();let s=x.resolve(this.context.cwd,K.toPortablePath(this.patchFolder)),o=x.join(s,\"../source\"),a=x.join(s,\"../.yarn-patch.json\");if(!M.existsSync(o))throw new be(\"The argument folder didn't get created by 'yarn patch'\");let l=await w1(o,s),c=await M.readJsonPromise(a),u=P.parseLocator(c.locator,!0);if(!i.storedPackages.has(u.locatorHash))throw new be(\"No package found in the project for the given locator\");if(!this.save){this.context.stdout.write(l);return}let g=t.get(\"patchFolder\"),f=x.join(g,`${P.slugifyLocator(u)}.patch`);await M.mkdirPromise(g,{recursive:!0}),await M.writeFilePromise(f,l);let h=new Map;for(let p of i.storedPackages.values()){if(P.isVirtualLocator(p))continue;let C=p.dependencies.get(u.identHash);if(!C)continue;let y=P.isVirtualDescriptor(C)?P.devirtualizeDescriptor(C):C,B=C1(y),v=i.storedResolutions.get(B.descriptorHash);if(!v)throw new Error(\"Assertion failed: Expected the resolution to have been registered\");if(!i.storedPackages.get(v))throw new Error(\"Assertion failed: Expected the package to have been registered\");let T=i.originalPackages.get(p.locatorHash);if(!T)throw new Error(\"Assertion failed: Expected the original package to have been registered\");let H=T.dependencies.get(C.identHash);if(!H)throw new Error(\"Assertion failed: Expected the original dependency to have been registered\");h.set(H.descriptorHash,H)}for(let p of h.values()){let C=m1(p,{parentLocator:null,sourceDescriptor:P.convertLocatorToDescriptor(u),sourceVersion:null,patchPaths:[`./${x.relative(i.cwd,f)}`]});i.topLevelWorkspace.manifest.resolutions.push({pattern:{descriptor:{fullName:P.stringifyIdent(C),description:p.range}},reference:C.range})}await i.persist()}};Ag.paths=[[\"patch-commit\"]],Ag.usage=ve.Usage({description:\"generate a patch out of a directory\",details:\"\\n      By default, this will print a patchfile on stdout based on the diff between the folder passed in and the original version of the package. Such file is suitable for consumption with the `patch:` protocol.\\n\\n      With the `-s,--save` option set, the patchfile won't be printed on stdout anymore and will instead be stored within a local file (by default kept within `.yarn/patches`, but configurable via the `patchFolder` setting). A `resolutions` entry will also be added to your top-level manifest, referencing the patched package via the `patch:` protocol.\\n\\n      Note that only folders generated by `yarn patch` are accepted as valid input for `yarn patch-commit`.\\n    \"});var lg=class extends De{constructor(){super(...arguments);this.json=z.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.package=z.String()}async execute(){let t=await ye.find(this.context.cwd,this.context.plugins),{project:i,workspace:n}=await je.find(t,this.context.cwd),s=await Rt.find(t);if(!n)throw new ct(i.cwd,this.context.cwd);await i.restoreInstallState();let o=P.parseLocator(this.package);if(o.reference===\"unknown\"){let a=Ie.mapAndFilter([...i.storedPackages.values()],l=>l.identHash!==o.identHash?Ie.mapAndFilter.skip:P.isVirtualLocator(l)?Ie.mapAndFilter.skip:l);if(a.length===0)throw new be(\"No package found in the project for the given locator\");if(a.length>1)throw new be(`Multiple candidate packages found; explicitly choose one of them (use \\`yarn why <package>\\` to get more information as to who depends on them):\n${a.map(l=>`\n- ${P.prettyLocator(t,l)}`).join(\"\")}`);o=a[0]}if(!i.storedPackages.has(o.locatorHash))throw new be(\"No package found in the project for the given locator\");await Ge.start({configuration:t,json:this.json,stdout:this.context.stdout},async a=>{let l=await y1(o,{cache:s,project:i});a.reportJson({locator:P.stringifyLocator(o),path:K.fromPortablePath(l)}),a.reportInfo(0,`Package ${P.prettyLocator(t,o)} got extracted with success!`),a.reportInfo(0,`You can now edit the following folder: ${ee.pretty(t,K.fromPortablePath(l),\"magenta\")}`),a.reportInfo(0,`Once you are done run ${ee.pretty(t,`yarn patch-commit -s ${process.platform===\"win32\"?'\"':\"\"}${K.fromPortablePath(l)}${process.platform===\"win32\"?'\"':\"\"}`,\"cyan\")} and Yarn will store a patchfile based on your changes.`)})}};lg.paths=[[\"patch\"]],lg.usage=ve.Usage({description:\"prepare a package for patching\",details:\"\\n      This command will cause a package to be extracted in a temporary directory intended to be editable at will.\\n      \\n      Once you're done with your changes, run `yarn patch-commit -s <path>` (with `<path>` being the temporary directory you received) to generate a patchfile and register it into your top-level manifest via the `patch:` protocol. Run `yarn patch-commit -h` for more details.\\n    \"});var w9e={configuration:{enableInlineHunks:{description:\"If true, the installs will print unmatched patch hunks\",type:\"BOOLEAN\",default:!1},patchFolder:{description:\"Folder where the patch files must be written\",type:\"ABSOLUTE_PATH\",default:\"./.yarn/patches\"}},commands:[Ag,lg],fetchers:[Yb],resolvers:[jb]},B9e=w9e;var x1={};ut(x1,{default:()=>S9e});var qb=class{supportsPackage(e,t){return this.isEnabled(t)}async findPackageLocation(e,t){if(!this.isEnabled(t))throw new Error(\"Assertion failed: Expected the pnpm linker to be enabled\");let i=S1(),n=t.project.installersCustomData.get(i);if(!n)throw new be(`The project in ${ee.pretty(t.project.configuration,`${t.project.cwd}/package.json`,ee.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let s=n.pathByLocator.get(e.locatorHash);if(typeof s>\"u\")throw new be(`Couldn't find ${P.prettyLocator(t.project.configuration,e)} in the currently installed pnpm map - running an install might help`);return s}async findPackageLocator(e,t){if(!this.isEnabled(t))return null;let i=S1(),n=t.project.installersCustomData.get(i);if(!n)throw new be(`The project in ${ee.pretty(t.project.configuration,`${t.project.cwd}/package.json`,ee.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let s=e.match(/(^.*\\/node_modules\\/(@[^/]*\\/)?[^/]+)(\\/.*$)/);if(s){let l=n.locatorByPath.get(s[1]);if(l)return l}let o=e,a=e;do{a=o,o=x.dirname(a);let l=n.locatorByPath.get(a);if(l)return l}while(o!==a);return null}makeInstaller(e){return new b1(e)}isEnabled(e){return e.project.configuration.get(\"nodeLinker\")===\"pnpm\"}},b1=class{constructor(e){this.opts=e;this.asyncActions=new Ie.AsyncActions(10);this.customData={pathByLocator:new Map,locatorByPath:new Map}}getCustomDataKey(){return S1()}attachCustomData(e){}async installPackage(e,t,i){switch(e.linkType){case\"SOFT\":return this.installPackageSoft(e,t,i);case\"HARD\":return this.installPackageHard(e,t,i)}throw new Error(\"Assertion failed: Unsupported package link type\")}async installPackageSoft(e,t,i){let n=x.resolve(t.packageFs.getRealPath(),t.prefixPath);return this.customData.pathByLocator.set(e.locatorHash,n),{packageLocation:n,buildDirective:null}}async installPackageHard(e,t,i){var u;let n=Q9e(e,{project:this.opts.project});this.customData.locatorByPath.set(n,P.stringifyLocator(e)),this.customData.pathByLocator.set(e.locatorHash,n),i.holdFetchResult(this.asyncActions.set(e.locatorHash,async()=>{await M.mkdirPromise(n,{recursive:!0}),await M.copyPromise(n,t.prefixPath,{baseFs:t.packageFs,overwrite:!1})}));let o=P.isVirtualLocator(e)?P.devirtualizeLocator(e):e,a={manifest:(u=await ot.tryFind(t.prefixPath,{baseFs:t.packageFs}))!=null?u:new ot,misc:{hasBindingGyp:po.hasBindingGyp(t)}},l=this.opts.project.getDependencyMeta(o,e.version),c=po.extractBuildScripts(e,a,l,{configuration:this.opts.project.configuration,report:this.opts.report});return{packageLocation:n,buildDirective:c}}async attachInternalDependencies(e,t){this.opts.project.configuration.get(\"nodeLinker\")===\"pnpm\"&&(!oge(e,{project:this.opts.project})||this.asyncActions.reduce(e.locatorHash,async i=>{await i;let n=this.customData.pathByLocator.get(e.locatorHash);if(typeof n>\"u\")throw new Error(`Assertion failed: Expected the package to have been registered (${P.stringifyLocator(e)})`);let s=x.join(n,xt.nodeModules),o=[],a=await age(s);for(let[l,c]of t){let u=c;oge(c,{project:this.opts.project})||(this.opts.report.reportWarningOnce(0,\"The pnpm linker doesn't support providing different versions to workspaces' peer dependencies\"),u=P.devirtualizeLocator(c));let g=this.customData.pathByLocator.get(u.locatorHash);if(typeof g>\"u\")throw new Error(`Assertion failed: Expected the package to have been registered (${P.stringifyLocator(c)})`);let f=P.stringifyIdent(l),h=x.join(s,f),p=x.relative(x.dirname(h),g),C=a.get(f);a.delete(f),o.push(Promise.resolve().then(async()=>{if(C){if(C.isSymbolicLink()&&await M.readlinkPromise(h)===p)return;await M.removePromise(h)}await M.mkdirpPromise(x.dirname(h)),process.platform==\"win32\"?await M.symlinkPromise(g,h,\"junction\"):await M.symlinkPromise(p,h)}))}o.push(Age(s,a)),await Promise.all(o)}))}async attachExternalDependents(e,t){throw new Error(\"External dependencies haven't been implemented for the pnpm linker\")}async finalizeInstall(){let e=cge(this.opts.project);if(this.opts.project.configuration.get(\"nodeLinker\")!==\"pnpm\")await M.removePromise(e);else{let t=[],i=new Set;for(let s of this.customData.pathByLocator.values()){let o=x.contains(e,s);if(o!==null){let[a,,...l]=o.split(x.sep);i.add(a);let c=x.join(e,a);t.push(M.readdirPromise(c).then(u=>Promise.all(u.map(async g=>{let f=x.join(c,g);if(g===xt.nodeModules){let h=await age(f);return h.delete(l.join(x.sep)),Age(f,h)}else return M.removePromise(f)}))).catch(u=>{if(u.code!==\"ENOENT\")throw u}))}}let n;try{n=await M.readdirPromise(e)}catch{n=[]}for(let s of n)i.has(s)||t.push(M.removePromise(x.join(e,s)));await Promise.all(t)}return await this.asyncActions.wait(),await v1(e),this.opts.project.configuration.get(\"nodeLinker\")!==\"node-modules\"&&await v1(lge(this.opts.project)),{customData:this.customData}}};function S1(){return JSON.stringify({name:\"PnpmInstaller\",version:2})}function lge(r){return x.join(r.cwd,xt.nodeModules)}function cge(r){return x.join(lge(r),\".store\")}function Q9e(r,{project:e}){let t=P.slugifyLocator(r),i=P.getIdentVendorPath(r);return x.join(cge(e),t,i)}function oge(r,{project:e}){return!P.isVirtualLocator(r)||!e.tryWorkspaceByLocator(r)}async function age(r){let e=new Map,t=[];try{t=await M.readdirPromise(r,{withFileTypes:!0})}catch(i){if(i.code!==\"ENOENT\")throw i}try{for(let i of t)if(!i.name.startsWith(\".\"))if(i.name.startsWith(\"@\")){let n=await M.readdirPromise(x.join(r,i.name),{withFileTypes:!0});if(n.length===0)e.set(i.name,i);else for(let s of n)e.set(`${i.name}/${s.name}`,s)}else e.set(i.name,i)}catch(i){if(i.code!==\"ENOENT\")throw i}return e}async function Age(r,e){var n;let t=[],i=new Set;for(let s of e.keys()){t.push(M.removePromise(x.join(r,s)));let o=(n=P.tryParseIdent(s))==null?void 0:n.scope;o&&i.add(`@${o}`)}return Promise.all(t).then(()=>Promise.all([...i].map(s=>v1(x.join(r,s)))))}async function v1(r){try{await M.rmdirPromise(r)}catch(e){if(e.code!==\"ENOENT\"&&e.code!==\"ENOTEMPTY\")throw e}}var b9e={linkers:[qb]},S9e=b9e;var BQ=()=>({modules:new Map([[\"@yarnpkg/cli\",Nm],[\"@yarnpkg/core\",sm],[\"@yarnpkg/fslib\",Wp],[\"@yarnpkg/libzip\",xC],[\"@yarnpkg/parsers\",td],[\"@yarnpkg/shell\",RC],[\"clipanion\",F$(ud)],[\"semver\",v9e],[\"typanion\",hn],[\"yup\",x9e],[\"@yarnpkg/plugin-essentials\",pO],[\"@yarnpkg/plugin-compat\",IO],[\"@yarnpkg/plugin-dlx\",yO],[\"@yarnpkg/plugin-file\",bO],[\"@yarnpkg/plugin-git\",hO],[\"@yarnpkg/plugin-github\",SO],[\"@yarnpkg/plugin-http\",vO],[\"@yarnpkg/plugin-init\",kO],[\"@yarnpkg/plugin-link\",RO],[\"@yarnpkg/plugin-nm\",hM],[\"@yarnpkg/plugin-npm\",u1],[\"@yarnpkg/plugin-npm-cli\",p1],[\"@yarnpkg/plugin-pack\",o1],[\"@yarnpkg/plugin-patch\",Q1],[\"@yarnpkg/plugin-pnp\",iM],[\"@yarnpkg/plugin-pnpm\",x1]]),plugins:new Set([\"@yarnpkg/plugin-essentials\",\"@yarnpkg/plugin-compat\",\"@yarnpkg/plugin-dlx\",\"@yarnpkg/plugin-file\",\"@yarnpkg/plugin-git\",\"@yarnpkg/plugin-github\",\"@yarnpkg/plugin-http\",\"@yarnpkg/plugin-init\",\"@yarnpkg/plugin-link\",\"@yarnpkg/plugin-nm\",\"@yarnpkg/plugin-npm\",\"@yarnpkg/plugin-npm-cli\",\"@yarnpkg/plugin-pack\",\"@yarnpkg/plugin-patch\",\"@yarnpkg/plugin-pnp\",\"@yarnpkg/plugin-pnpm\"])});$0({binaryVersion:Tr||\"<unknown>\",pluginConfiguration:BQ()});})();\n/*!\n * buildToken\n * Builds OAuth token prefix (helper function)\n *\n * @name buildToken\n * @function\n * @param {GitUrl} obj The parsed Git url object.\n * @return {String} token prefix\n */\n/*!\n * fill-range <https://github.com/jonschlinkert/fill-range>\n *\n * Copyright (c) 2014-present, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n/*!\n * is-extglob <https://github.com/jonschlinkert/is-extglob>\n *\n * Copyright (c) 2014-2016, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n/*!\n * is-glob <https://github.com/jonschlinkert/is-glob>\n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n/*!\n * is-number <https://github.com/jonschlinkert/is-number>\n *\n * Copyright (c) 2014-present, Jon Schlinkert.\n * Released under the MIT License.\n */\n/*!\n * is-windows <https://github.com/jonschlinkert/is-windows>\n *\n * Copyright © 2015-2018, Jon Schlinkert.\n * Released under the MIT License.\n */\n/*!\n * to-regex-range <https://github.com/micromatch/to-regex-range>\n *\n * Copyright (c) 2015-present, Jon Schlinkert.\n * Released under the MIT License.\n */\n/**\n  @license\n  Copyright (c) 2015, Rebecca Turner\n\n  Permission to use, copy, modify, and/or distribute this software for any\n  purpose with or without fee is hereby granted, provided that the above\n  copyright notice and this permission notice appear in all copies.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\n  REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND\n  FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n  INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\n  LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\n  OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n  PERFORMANCE OF THIS SOFTWARE.\n */\n/**\n  @license\n  Copyright Joyent, Inc. and other Node contributors.\n\n  Permission is hereby granted, free of charge, to any person obtaining a\n  copy of this software and associated documentation files (the\n  \"Software\"), to deal in the Software without restriction, including\n  without limitation the rights to use, copy, modify, merge, publish,\n  distribute, sublicense, and/or sell copies of the Software, and to permit\n  persons to whom the Software is furnished to do so, subject to the\n  following conditions:\n\n  The above copyright notice and this permission notice shall be included\n  in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n  NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n  DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n  USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n/**\n  @license\n  Copyright Node.js contributors. All rights reserved.\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  @license\n  The MIT License (MIT)\n\n  Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com)\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 deal\n  in the Software without restriction, including without limitation the rights\n  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  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 FROM,\n  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  THE SOFTWARE.\n*/\n"
  },
  {
    "path": ".yarnrc.yml",
    "content": "nodeLinker: node-modules\n\nyarnPath: .yarn/releases/yarn-3.6.0.cjs\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participation in our\ncommunity a harassment-free experience for everyone, regardless of age, body\nsize, visible or invisible disability, ethnicity, sex characteristics, gender\nidentity and expression, level of experience, education, socio-economic status,\nnationality, personal appearance, race, religion, or sexual identity\nand orientation.\n\nWe pledge to act and interact in ways that contribute to an open, welcoming,\ndiverse, inclusive, and healthy community.\n\n## Our Standards\n\nExamples of behavior that contributes to a positive environment for our\ncommunity include:\n\n* Demonstrating empathy and kindness toward other people\n* Being respectful of differing opinions, viewpoints, and experiences\n* Giving and gracefully accepting constructive feedback\n* Accepting responsibility and apologizing to those affected by our mistakes,\n  and learning from the experience\n* Focusing on what is best not just for us as individuals, but for the\n  overall community\n\nExamples of unacceptable behavior include:\n\n* The use of sexualized language or imagery, and sexual attention or\n  advances of any kind\n* Trolling, insulting or derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or email\n  address, without their explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n  professional setting\n\n## Enforcement Responsibilities\n\nCommunity leaders are responsible for clarifying and enforcing our standards of\nacceptable behavior and will take appropriate and fair corrective action in\nresponse to any behavior that they deem inappropriate, threatening, offensive,\nor harmful.\n\nCommunity leaders have the right and responsibility to remove, edit, or reject\ncomments, commits, code, wiki edits, issues, and other contributions that are\nnot aligned to this Code of Conduct, and will communicate reasons for moderation\ndecisions when appropriate.\n\n## Scope\n\nThis Code of Conduct applies within all community spaces, and also applies when\nan individual is officially representing the community in public spaces.\nExamples of representing our community include using an official e-mail address,\nposting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported to the community leaders responsible for enforcement at\najnart@pm.me.\nAll complaints will be reviewed and investigated promptly and fairly.\n\nAll community leaders are obligated to respect the privacy and security of the\nreporter of any incident.\n\n## Enforcement Guidelines\n\nCommunity leaders will follow these Community Impact Guidelines in determining\nthe consequences for any action they deem in violation of this Code of Conduct:\n\n### 1. Correction\n\n**Community Impact**: Use of inappropriate language or other behavior deemed\nunprofessional or unwelcome in the community.\n\n**Consequence**: A private, written warning from community leaders, providing\nclarity around the nature of the violation and an explanation of why the\nbehavior was inappropriate. A public apology may be requested.\n\n### 2. Warning\n\n**Community Impact**: A violation through a single incident or series\nof actions.\n\n**Consequence**: A warning with consequences for continued behavior. No\ninteraction with the people involved, including unsolicited interaction with\nthose enforcing the Code of Conduct, for a specified period of time. This\nincludes avoiding interactions in community spaces as well as external channels\nlike social media. Violating these terms may lead to a temporary or\npermanent ban.\n\n### 3. Temporary Ban\n\n**Community Impact**: A serious violation of community standards, including\nsustained inappropriate behavior.\n\n**Consequence**: A temporary ban from any sort of interaction or public\ncommunication with the community for a specified period of time. No public or\nprivate interaction with the people involved, including unsolicited interaction\nwith those enforcing the Code of Conduct, is allowed during this period.\nViolating these terms may lead to a permanent ban.\n\n### 4. Permanent Ban\n\n**Community Impact**: Demonstrating a pattern of violation of community\nstandards, including sustained inappropriate behavior,  harassment of an\nindividual, or aggression toward or disparagement of classes of individuals.\n\n**Consequence**: A permanent ban from any sort of public interaction within\nthe community.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage],\nversion 2.0, available at\nhttps://www.contributor-covenant.org/version/2/0/code_of_conduct.html.\n\nCommunity Impact Guidelines were inspired by [Mozilla's code of conduct\nenforcement ladder](https://github.com/mozilla/diversity).\n\n[homepage]: https://www.contributor-covenant.org\n\nFor answers to common questions about this code of conduct, see the FAQ at\nhttps://www.contributor-covenant.org/faq. Translations are available at\nhttps://www.contributor-covenant.org/translations.\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing to Homarr\n\nFirst off, thanks for taking the time to contribute! ❤️\n\nAll types of contributions are encouraged and valued. See the [Table of Contents](#table-of-contents) for different ways to help and details about how this project handles them. Please make sure to read the relevant section before making your contribution. It will make it a lot easier for us maintainers and smooth out the experience for all involved. The community looks forward to your contributions. 🎉\n\n> And if you like the project, but just don't have time to contribute, that's fine. There are other easy ways to support the project and show your appreciation, which we would also be very happy about:\n> - Star the project\n> - Tweet about it\n> - Refer this project in your project's readme\n> - Mention the project at local meetups and tell your friends/colleagues\n\n## Table of Contents\n\n- [Code of Conduct](#code-of-conduct)\n- [I Have a Question](#i-have-a-question)\n- [I Want To Contribute](#i-want-to-contribute)\n  - [Reporting Bugs](#reporting-bugs)\n  - [Suggesting Enhancements](#suggesting-enhancements)\n- [Styleguides](#styleguides)\n  - [Commit Messages](#commit-messages)\n\n\n## Code of Conduct\n\nThis project and everyone participating in it is governed by the\n[Homarr Code of Conduct](https://github.com/ajnart/homarr/blob/master/CODE_OF_CONDUCT.md).\nBy participating, you are expected to uphold this code. Please report unacceptable behavior\nto [@ajnart](https://github.com/ajnart).\n\n\n## I Have a Question\n\n> If you want to ask a question, we assume that you have read the available [Documentation](https://github.com/ajnart/homarr/#readme).\n\nBefore you ask a question, it is best to search for existing [Issues](https://github.com/ajnart/homarr/issues) that might help you. In case you have found a suitable issue and still need clarification, you can write your question in this issue. It is also advisable to search the internet for answers first.\n\nIf you then still feel the need to ask a question and need clarification, we recommend the following:\n\n- Open an [Issue](https://github.com/ajnart/homarr/issues/new).\n- Provide as much context as you can about what you're running into.\n- Provide project and platform versions (nodejs, docker, etc), depending on what seems relevant.\n\nWe will then take care of the issue as soon as possible.\n\n## I Want To Contribute\n\n> ### Legal Notice\n> When contributing to this project, you must agree that you have authored 100% of the content, that you have the necessary rights to the content and that the content you contribute may be provided under the project license.\n\n### Reporting Bugs\n\n#### Before Submitting a Bug Report\n\nA good bug report shouldn't leave others needing to chase you up for more information. Therefore, we ask you to investigate carefully, collect information and describe the issue in detail in your report. Please complete the following steps in advance to help us fix any potential bug as fast as possible.\n\n- Make sure that you are using the latest version.\n- Determine if your bug is really a bug and not an error on your side e.g. using incompatible environment components/versions (Make sure that you have read the [documentation](https://github.com/ajnart/homarr/#readme). If you are looking for support, you might want to check [this section](#i-have-a-question)).\n- To see if other users have experienced (and potentially already solved) the same issue you are having, check if there is not already a bug report existing for your bug or error in the [bug tracker](https://github.com/ajnart/homarr/issues?q=is%3Aopen+is%3Aissue+label%3A%22%F0%9F%90%9B+Bug%22).\n- Also make sure to search the internet (including Stack Overflow) to see if users outside of the GitHub community have discussed the issue.\n- Collect information about the bug:\n  - Stack trace (Traceback)\n  - OS, Platform and Version (Windows, Linux, macOS, x86, ARM)\n  - Version of yarn, nodejs, docker, npm, next, depending on what seems relevant.\n  - Possibly your input and the output\n  - Can you reliably reproduce the issue? And can you also reproduce it with older versions?\n\n#### How Do I Submit a Good Bug Report?\n\n> You must never report security related issues, vulnerabilities or bugs including sensitive information to the issue tracker, or elsewhere in public. Instead sensitive bugs must be sent by email to ajnart@pm.me.\n\nWe use GitHub issues to track bugs and errors. If you run into an issue with the project:\n\n- Open an [Issue](https://github.com/ajnart/homarr/issues/new).\n- Explain the behavior you would expect and the actual behavior.\n- Please provide as much context as possible and describe the *reproduction steps* that someone else can follow to recreate the issue on their own. This usually includes your code. For good bug reports you should isolate the problem and create a reduced test case.\n- Provide the information you collected in the previous section.\n\n\n### Suggesting Enhancements\n\nThis section guides you through submitting an enhancement suggestion for Homarr, **including completely new features and minor improvements to existing functionality**. Following these guidelines will help maintainers and the community to understand your suggestion and find related suggestions.\n\n#### Before Submitting an Enhancement\n\n- Make sure that you are using the latest version.\n- Read the [documentation](https://github.com/ajnart/homarr/#readme) carefully and find out if the functionality is already covered, maybe by an individual configuration.\n- Perform a [search](https://github.com/ajnart/homarr/issues) to see if the enhancement has already been suggested. If it has, add a comment to the existing issue instead of opening a new one.\n- Find out whether your idea fits with the scope and aims of the project. It's up to you to make a strong case to convince the project's developers of the merits of this feature. Keep in mind that we want features that will be useful to the majority of our users and not just a small subset. If you're just targeting a minority of users, consider writing an add-on/plugin library.\n\n#### How Do I Submit a Good Enhancement Suggestion?\n\nEnhancement suggestions are tracked as [GitHub issues](https://github.com/ajnart/homarr//issues).\n\n- Use a **clear and descriptive title** for the issue to identify the suggestion.\n- Provide a **step-by-step description of the suggested enhancement** in as many details as possible.\n- **Describe the current behavior** and **explain which behavior you expected to see instead** and why. At this point you can also tell which alternatives do not work for you.\n- You may want to **include screenshots and animated GIFs** which help you demonstrate the steps or point out the part which the suggestion is related to. You can use [this tool](https://www.cockos.com/licecap/) to record GIFs on macOS and Windows, and [this tool](https://github.com/colinkeenan/silentcast) or [this tool](https://github.com/GNOME/byzanz) on Linux. <!-- this should only be included if the project has a GUI -->\n- **Explain why this enhancement would be useful** to most Homarr users. You may also want to point out the other projects that solved it better and which could serve as inspiration.\n\n## Styleguides\n### Commit Messages\n\nHomarr uses [GitMoji](https://gitmoji.dev/).\nWe would appreciate it if everyone keeps their commit messages withing these rulings.\n\n### Tests\n\n> Components should be tested using unit tests. A unit is the smallest isolated part of the component. Unit tests must not have any dependencies and must be isolated.\n\n- Place testfiles directly at the root of the unit\n- Only test a single unit of work inside a unit test\n- You may test multiple units inside one test file\n- Testnames do not begin with ``should`` or the unit name"
  },
  {
    "path": "Dockerfile",
    "content": "FROM node:20.2.0-slim\nWORKDIR /app\n\n# Define node.js environment variables\nARG PORT=7575\n\nENV NEXT_TELEMETRY_DISABLED 1\nENV NODE_ENV production\nENV NODE_OPTIONS '--no-experimental-fetch'\n\nCOPY next.config.js ./\nCOPY public ./public\nCOPY package.json ./temp_package.json\nCOPY yarn.lock ./temp_yarn.lock\n# Automatically leverage output traces to reduce image size\n# https://nextjs.org/docs/advanced-features/output-file-tracing\nCOPY .next/standalone ./\nCOPY .next/static ./.next/static\nCOPY ./scripts/run.sh ./scripts/run.sh\nRUN chmod +x ./scripts/run.sh\nCOPY ./drizzle ./drizzle\n\nCOPY ./drizzle/migrate ./migrate\nCOPY ./tsconfig.json ./migrate/tsconfig.json\nCOPY ./cli ./cli\n\nRUN mkdir /data\n\n# Install dependencies\nRUN apt update && apt install -y openssl wget\n\n# Move node_modules to temp location to avoid overwriting\nRUN mv node_modules _node_modules\nRUN rm package.json\n# Install dependencies for migration\nRUN cp ./migrate/package.json ./package.json\nRUN yarn\n# Copy better_sqlite3 build for current platform\nRUN cp /app/node_modules/better-sqlite3/build/Release/better_sqlite3.node /app/_node_modules/better-sqlite3/build/Release/better_sqlite3.node\n# Copy node_modules for migration to migrate folder for migration script\nRUN mv node_modules ./migrate/node_modules\n\n# Copy temp node_modules of app to app folder\nRUN mv _node_modules node_modules\n\nRUN echo '#!/bin/bash\\nnode /app/cli/cli.js \"$@\"' > /usr/bin/homarr\nRUN chmod +x /usr/bin/homarr\nRUN cd /app/cli && yarn --immutable\n\n# Expose the default application port\nEXPOSE $PORT\nENV PORT=${PORT}\n\nENV DATABASE_URL \"file:/data/db.sqlite\"\nENV AUTH_TRUST_HOST=\"true\"\nENV PORT 7575\nENV NEXTAUTH_SECRET NOT_IN_USE_BECAUSE_JWTS_ARE_UNUSED\n\nHEALTHCHECK --interval=10s --timeout=5s --start-period=5s --retries=3 \\\n    CMD wget --no-verbose --tries=1 --spider http://localhost:${PORT} || exit 1\n\nVOLUME [ \"/app/data/configs\" ]\nVOLUME [ \"/data\" ]\nENTRYPOINT [\"sh\", \"./scripts/run.sh\"]"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2022 Thomas \"ajnart\" Camlong\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": "# 🦀 Homarr\n\nThis repository has been archived and the project was moved to [homarr-labs/homarr](https://github.com/homarr-labs/homarr) with v1+.\nThere will be no updates to this old version, but you can enjoy regular updates with v1+.\n\nUsage of this old project is not recommended, however possible.\n\nTo migrate please follow the [Migration Guide](https://homarr.dev/blog/2025/01/19/migration-guide-1.0) and read the [Breaking Changes](https://homarr.dev/blog/2024/09/23/version-1.0#breaking-changes)\n\n<br />\n<br />\n<br />\n<br />\n<br />\n<br />\n<br />\n<br />\n<br />\n<br />\n<br />\n<br />\n\n<!-- Project Title -->\n[![Banner](docs/banner.png)](https://homarr.dev/)\n\n<!-- Badges -->\n<p align=\"center\">\n<img src=\"https://img.shields.io/github/stars/ajnart/homarr?label=%E2%AD%90%20Stars&style=flat-square?branch=master&kill_cache=1%22\">\n<a href=\"https://github.com/ajnart/homarr/releases/latest\">\n  <img alt=\"Latest Release (Semver)\" src=\"https://img.shields.io/github/v/release/ajnart/homarr?label=%F0%9F%9A%80%20Release\">\n</a>\n<a href=\"https://github.com/ajnart/homarr/actions/workflows/docker.yml\">\n  <img title=\"Docker CI Status\" src=\"https://github.com/ajnart/homarr/actions/workflows/docker.yml/badge.svg\" alt=\"CI Status\">\n</a>\n<a href=https://translate.homarr.dev/>\n<img title=\"Translations\" src=\"https://badges.crowdin.net/homarr/localized.svg\" />\n</a>\n<a href=\"https://discord.gg/aCsmEV5RgA\">\n  <img title=\"Discord\" src=\"https://discordapp.com/api/guilds/972958686051962910/widget.png?style=shield\">\n</a>\n</p>\n\n<!-- Links -->\n<p align=\"center\">\n  <a href=\"https://demo.homarr.dev/\">\n    <strong>Demo ✨</strong>\n  </a>\n  •\n  <a href=\"https://homarr.dev/docs/getting-started/\">\n    <strong>Install 💻</strong>\n  </a> •\n  <a href=\"https://translate.homarr.dev/\">\n    <strong>Translations 🈺</strong>\n  </a> •\n  <a href=\"https://discord.com/invite/aCsmEV5RgA\">\n    <strong>Discord 👋</strong>\n  </a>\n</p>\n\nSimplify the management of your server with Homarr - a sleek, modern dashboard that puts all of your apps and services at your fingertips. With Homarr, you can access and control everything in one convenient location. Homarr seamlessly integrates with the apps you've added, providing you with valuable information and giving you complete control. Installation is a breeze, and Homarr supports a wide range of deployment methods.\n\n<br/>\n<br/>\n\n\n[![Features Section](docs/section-features.png)](https://homarr.dev/)\n\n- 🖌️ Highly customizable with an extensive drag and drop grid system\n- ✨ Integrates seamlessly with your favorite self-hosted applications\n- 📌 Easy and fast app management - no YAML involved\n- 🙊 Advanced secrets' management system for enhanced security\n- 📄 Detailed documentation and active community\n- 🔍 Search through the web or supported integrations in an instant\n- 🏴󠁧󠁢󠁮󠁩󠁲󠁿 Monitor your application with a built-in status system\n- 🦞 Comprehensive built-in icon picker with over 7000 icons\n- 🐳 Easy deployment with Docker, unRAID, and Synology\n- 🚀 Compatible with any major consumer hardware (x86, Raspberry Pi, old laptops, ...)\n\n<br/>\n<br/>\n\n[![Widgets & Integrations Section](docs/section-widgets-and-integrations.png)](https://homarr.dev/docs/category/widgets)\n\nHomarr has a [built-in collection of widgets and integrations](https://homarr.dev/docs/category/integrations), that connect to your applications and enable you to control them directly from the dashboard.\nEach widget and integration has a comprehensive documentation\nHomarr will integrate with the following applications:\n\n📥 Torrent clients\n- [Deluge](https://homarr.dev/docs/integrations/torrent#deluge)\n- [Transmission](https://homarr.dev/docs/integrations/torrent#transmission)\n- [qBittorent](https://homarr.dev/docs/integrations/torrent#qbittorrent-integration)\n\n📥 Usenet clients\n- [SABnzbd](https://homarr.dev/docs/integrations/usenet#sabnzbd)\n- [NZBGet](https://homarr.dev/docs/integrations/usenet#nzbget)\n\n📺 Media servers\n- [Plex](https://homarr.dev/docs/integrations/media-server/#plex)\n- [Jellyfin](https://homarr.dev/docs/integrations/media-server#jellyfin-and-emby)\n\n📚 Media collection managers\n- [Sonarr](https://homarr.dev/docs/integrations/servarr#sonarr)\n- [Radarr](https://homarr.dev/docs/integrations/servarr#radarr)\n- [Lidarr](https://homarr.dev/docs/integrations/servarr#lidarr)\n- [Readarr](https://homarr.dev/docs/integrations/servarr#readarr)\n \n🎞️ Media request managers\n- [Overseerr](https://homarr.dev/docs/integrations/media-requester)\n- [Jellyseerr](https://homarr.dev/docs/integrations/media-requester)\n\n🚫 DNS ad-blockers\n- [Pihole](https://homarr.dev/docs/integrations/dns#pihole)\n- [AdGuard Home](https://homarr.dev/docs/integrations/dns#adguard-home)\n\nOther integrations\n- [🔌 Dash.](https://homarr.dev/docs/integrations/hardware)\n- [🐳 Docker](https://homarr.dev/docs/integrations/containers)  \n\nWe're constantly adding new integrations and widgets, which will enhance your experience even further.\n\n<br/>\n<br/>\n\n[![Preview Section](docs/section-preview.png)](https://demo.homarr.dev/)\n\nhttps://user-images.githubusercontent.com/30572287/217098893-5880e7de-13d0-42c5-b505-f7921593396f.mp4\n\n<br/>\n<br/>\n\n[![Installation Section](docs/section-installation.png)](https://homarr.dev/docs/category/installation-1)\n\nSince we are updating Homarr very frequently, we recommend reading our official installation guides:\n\n<a href=\"https://homarr.dev/docs/category/installation-1\">\n  <img src=\"docs/installation-button.png\" width=\"200\" />\n</a>\n\n<br/>\n<br/>\n\n[![Contribute Section](docs/section-contribute.png)](https://github.com/ajnart/homarr/blob/dev/CONTRIBUTING.md)\nHomarr is maintained by motivated developers in their free-time.\nWe work for fun and learning on this project.\n\nHence, we're glad for all the help and support we can get.\nAlthough a donation is appreciated, there are other ways you can support us.\n\n<a href=\"https://ko-fi.com/ajnart\">\n  <img src=\"https://cdn.ko-fi.com/cdn/kofi3.png?v=3\" width=\"200\" />\n</a>\n\nYou can also support us by helping with [translating the entire project](https://homarr.dev/docs/community/translations) to as many language as possible or contributing directly to the code or documentation.\n\n**Please read our [Contribution Guidelines](/CONTRIBUTING.md)**\n\nAll contributions, regardless of their size or scope, are welcome and highly appreciated! Thank you ❤️\n\n![Alt](https://repobeats.axiom.co/api/embed/60a6f68f193faf831f64221bdf90782adec51c93.svg \"Repobeats analytics image\")\n[![Covered by Argos Visual Testing](https://argos-ci.com/badge-large.svg)](https://argos-ci.com?utm_source=%5Bhomarr%5D&utm_campaign=oss)\n"
  },
  {
    "path": "SECURITY.md",
    "content": "# Security Policy\n\n## Supported Versions\nOnly the following versions will receive updates, that include improvements to the security:\n\n| Version | Supported          |\n| ------- | ------------------ |\n| 0.13   | :white_check_mark: |\n| <=0.12   | :x:                |\n\n## Reporting a Vulnerability\nWe take security issues very seriously.\nWhen you found a security issue, please ask yourself the following question:\n\n**Would this be publicly disclosed, could it cause any problems or harm to any Homarr instances or individuals?**\n\nIf the answer to that question is yes, please contact us immideatly using [this link](https://homarr.dev/docs/community/get-in-touch). E-Mail is preferred, but you can write ``manicraft1001`` or ``ajnart`` on Discord as well.\nIf the answer is no, please create a public visible issue: [Vulnerability](https://github.com/ajnart/homarr/issues/new?assignees=&labels=%F0%9F%90%9B+Bug&projects=&template=bug.yml&title=)\n"
  },
  {
    "path": "cli/cli.js",
    "content": "import yargs from 'yargs';\n\nimport { resetPasswordForOwner } from './commands/reset-owner-password.js';\nimport { resetPasswordForUsername } from './commands/reset-password.js';\n\nyargs(process.argv.slice(2))\n  .scriptName('homarr')\n  .usage('$0 <cmd> [args]')\n  .command('reset-owner-password', 'Resets the current owner password without UI access', async () => {\n    await resetPasswordForOwner();\n  })\n  .command(\n    'reset-password',\n    'Reset the password of a specific user without UI access',\n    (yargs) => {\n      yargs.option('username', {\n        type: 'string',\n        describe: 'Username of user',\n        demandOption: true\n      });\n    },\n    async (argv) => {\n      await resetPasswordForUsername(argv.username);\n    }\n  )\n  .version(false)\n  .showHelpOnFail(true)\n  .alias('h', 'help')\n  .demandCommand()\n  .help().argv;"
  },
  {
    "path": "cli/commands/reset-owner-password.js",
    "content": "import bcrypt from 'bcryptjs';\n\nimport Database from 'better-sqlite3';\n\nimport boxen from 'boxen';\n\nimport chalk from 'chalk';\n\nimport Consola from 'consola';\n\nimport crypto from 'crypto';\n\nimport { sql } from 'drizzle-orm';\nimport { drizzle } from 'drizzle-orm/better-sqlite3';\n\nexport async function resetPasswordForOwner() {\n  if (!process.env.DATABASE_URL) {\n    Consola.error('Unable to connect to database due to missing database URL environment variable');\n    return;\n  }\n\n  Consola.info('Connecting to the database...');\n  const sqlite = new Database(process.env.DATABASE_URL.replace('file:', ''));\n  const db = drizzle(sqlite);\n\n  Consola.info('Connected to the database ' + chalk.green('✓'));\n  Consola.info('Generating new random password...');\n\n  const newPassword = crypto.randomUUID();\n  const salt = bcrypt.genSaltSync(10);\n  const hashedPassword = bcrypt.hashSync(newPassword, salt);\n\n  try {\n    await db.transaction((tx) => {\n      tx.run(\n        sql`DELETE FROM session WHERE userId = (SELECT id FROM user WHERE is_owner = 1 LIMIT 1)`\n      );\n      tx.run(sql`UPDATE user SET password = ${hashedPassword} WHERE is_owner = 1 LIMIT 1;`);\n    });\n    console.log(\n      boxen(`New owner password is '${chalk.red(newPassword)}'. You can now log in with this password.\\nExising sessions have been destroyed and need to login again with the new passowrd.`, {\n        dimBorder: true,\n        borderStyle: 'round',\n        padding: {\n          left: 1,\n          right: 1\n        }\n      })\n    );\n  } catch (err) {\n    Consola.error('Failed to update password', err);\n  } finally {\n    Consola.info('Command has completed');\n  }\n}\n"
  },
  {
    "path": "cli/commands/reset-password.js",
    "content": "import bcrypt from 'bcryptjs';\n\nimport Database from 'better-sqlite3';\n\nimport Consola from 'consola';\n\nimport crypto from 'crypto';\n\nimport boxen from 'boxen';\n\nimport chalk from 'chalk';\n\nimport { sql } from 'drizzle-orm';\nimport { drizzle } from 'drizzle-orm/better-sqlite3';\n\nexport async function resetPasswordForUsername(username) {\n  if (!process.env.DATABASE_URL) {\n    Consola.error('Unable to connect to database due to missing database URL environment variable');\n    return;\n  }\n\n  Consola.info('Connecting to the database...');\n  const sqlite = new Database(process.env.DATABASE_URL.replace('file:', ''));\n  const db = drizzle(sqlite);\n\n  Consola.info('Generating new random password...');\n\n  const newPassword = crypto.randomUUID();\n  const salt = bcrypt.genSaltSync(10);\n  const hashedPassword = bcrypt.hashSync(newPassword, salt);\n\n  Consola.info(`Updating password for user '${username}'`);\n\n  try {\n    await db.transaction((tx) => {\n      tx.run(\n        sql`DELETE FROM session WHERE userId = (SELECT id FROM user WHERE name = ${username} LIMIT 1)`\n      );\n      tx.run(sql`UPDATE user SET password = ${hashedPassword} WHERE id = (SELECT id FROM user WHERE name = ${username} LIMIT 1) LIMIT 1`);\n    });\n    console.log(\n      boxen(`New password for '${username}' is '${chalk.red(newPassword)}'. You can now log in with this password.\\nExising sessions have been destroyed and need to login again with the new passowrd.`, {\n        dimBorder: true,\n        borderStyle: 'round',\n        padding: {\n          left: 1,\n          right: 1\n        }\n      })\n    );\n  } catch (err) {\n    Consola.error('Failed to update password', err);\n  } finally {\n    Consola.info('Command has completed');\n  }\n}\n"
  },
  {
    "path": "cli/package.json",
    "content": "{\n  \"dependencies\": {\n    \"bcryptjs\": \"^2.4.3\",\n    \"better-sqlite3\": \"^8.6.0\",\n    \"boxen\": \"^7.1.1\",\n    \"chalk\": \"^5.3.0\",\n    \"consola\": \"^3.0.0\",\n    \"drizzle-orm\": \"^0.28.6\",\n    \"yargs\": \"^17.7.2\"\n  },\n  \"type\": \"module\"\n}\n"
  },
  {
    "path": "crowdin.yml",
    "content": "project_id: \"534422\"\napi_token_env: \"CROWDIN_PERSONAL_TOKEN\"\nfiles:\n  - source: /public/locales/en/**/*.json\n    translation: /public/locales/%two_letters_code%/**/%original_file_name%\n"
  },
  {
    "path": "data/constants.ts",
    "content": "export const REPO_URL = 'ajnart/homarr';\nexport const ICON_PICKER_SLICE_LIMIT = 36;\nexport const COOKIE_LOCALE_KEY = 'config-locale';\nexport const COOKIE_COLOR_SCHEME_KEY = 'color-scheme';\n"
  },
  {
    "path": "data/crowdin-report.json",
    "content": "{\n    \"name\": \"homarr Top Members Report\",\n    \"url\": \"https://translate.homarr.dev/project/homarr\",\n    \"unit\": \"words\",\n    \"dateRange\": {\n        \"from\": \"2022-08-25\",\n        \"to\": \"2024-01-01\"\n    },\n    \"language\": \"All\",\n    \"data\": [\n        {\n            \"user\": {\n                \"id\": \"15491798\",\n                \"username\": \"lupineDK\",\n                \"fullName\": \"Anders Ecklon (lupineDK)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15491798/medium/461bd501e8371c062bf29ea171aedd36_default.png\",\n                \"joined\": \"2022-10-15 01:14:33\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"da\",\n                    \"name\": \"Danish\"\n                }\n            ],\n            \"translated\": 5893,\n            \"target\": 5686,\n            \"approved\": 5911,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 5893\n        },\n        {\n            \"user\": {\n                \"id\": \"15492732\",\n                \"username\": \"hillaliy\",\n                \"fullName\": \"Yossi Hillali (hillaliy)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15492732/medium/0bae17b421604892d888e3fc70cf0587.jpeg\",\n                \"joined\": \"2022-10-15 15:18:50\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"he\",\n                    \"name\": \"Hebrew\"\n                }\n            ],\n            \"translated\": 5815,\n            \"target\": 5068,\n            \"approved\": 5848,\n            \"voted\": 0,\n            \"positiveVotes\": 12,\n            \"negativeVotes\": 0,\n            \"winning\": 5806\n        },\n        {\n            \"user\": {\n                \"id\": \"15554645\",\n                \"username\": \"crendasien\",\n                \"fullName\": \"Nicole (crendasien)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15554645/medium/598ab1d4aaf6b8dccd5ba16be92da7b9.jpeg\",\n                \"joined\": \"2022-11-28 14:18:44\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"it\",\n                    \"name\": \"Italian\"\n                }\n            ],\n            \"translated\": 5288,\n            \"target\": 5378,\n            \"approved\": 5613,\n            \"voted\": 0,\n            \"positiveVotes\": 11,\n            \"negativeVotes\": 0,\n            \"winning\": 5285\n        },\n        {\n            \"user\": {\n                \"id\": \"15202182\",\n                \"username\": \"Walkx\",\n                \"fullName\": \"Walkx\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15202182/medium/5c37361ae45aeed487b34582c1f7ca37.png\",\n                \"joined\": \"2022-08-25 07:28:51\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"nl\",\n                    \"name\": \"Dutch\"\n                },\n                {\n                    \"id\": \"en\",\n                    \"name\": \"English\"\n                },\n                {\n                    \"id\": \"de\",\n                    \"name\": \"German\"\n                },\n                {\n                    \"id\": \"lol\",\n                    \"name\": \"LOLCAT\"\n                },\n                {\n                    \"id\": \"en-PT\",\n                    \"name\": \"Pirate English\"\n                }\n            ],\n            \"translated\": 5065,\n            \"target\": 5027,\n            \"approved\": 5618,\n            \"voted\": 0,\n            \"positiveVotes\": 2,\n            \"negativeVotes\": 1,\n            \"winning\": 5074\n        },\n        {\n            \"user\": {\n                \"id\": \"12701640\",\n                \"username\": \"SmartPhoneLover\",\n                \"fullName\": \"Sergio (SmartPhoneLover)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/12701640/medium/ec95486662ec875cda080e778c3ff702.jpg\",\n                \"joined\": \"2022-09-04 10:29:30\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"en\",\n                    \"name\": \"English\"\n                },\n                {\n                    \"id\": \"es-ES\",\n                    \"name\": \"Spanish\"\n                }\n            ],\n            \"translated\": 4822,\n            \"target\": 5078,\n            \"approved\": 0,\n            \"voted\": 166,\n            \"positiveVotes\": 30,\n            \"negativeVotes\": 0,\n            \"winning\": 1017\n        },\n        {\n            \"user\": {\n                \"id\": \"15445560\",\n                \"username\": \"Bims0n\",\n                \"fullName\": \"Bims0n\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15445560/medium/603220b603eeb3367e0f0d3fa675247c.jpg\",\n                \"joined\": \"2022-09-13 05:55:32\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"de\",\n                    \"name\": \"German\"\n                }\n            ],\n            \"translated\": 4652,\n            \"target\": 4751,\n            \"approved\": 4371,\n            \"voted\": 0,\n            \"positiveVotes\": 25,\n            \"negativeVotes\": 0,\n            \"winning\": 4092\n        },\n        {\n            \"user\": {\n                \"id\": \"15428516\",\n                \"username\": \"Steken\",\n                \"fullName\": \"Steken\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15428516/medium/d5aea5653c769c3a523182bdb60d1664.png\",\n                \"joined\": \"2022-08-31 10:52:11\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"sv-SE\",\n                    \"name\": \"Swedish\"\n                }\n            ],\n            \"translated\": 4557,\n            \"target\": 4273,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15722911\",\n                \"username\": \"GkhnG\",\n                \"fullName\": \"GkhnG\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15722911/medium/71a027caec489ef6ce82bcf1888329d0_default.png\",\n                \"joined\": \"2023-04-28 22:50:37\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"tr\",\n                    \"name\": \"Turkish\"\n                }\n            ],\n            \"translated\": 4384,\n            \"target\": 3701,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15674593\",\n                \"username\": \"Marty88\",\n                \"fullName\": \"Marty (Marty88)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15674593/medium/492b1509d52bd2809dea768121217125.jpeg\",\n                \"joined\": \"2023-02-08 16:28:53\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"sk\",\n                    \"name\": \"Slovak\"\n                }\n            ],\n            \"translated\": 4347,\n            \"target\": 3995,\n            \"approved\": 3777,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 3771\n        },\n        {\n            \"user\": {\n                \"id\": \"15709853\",\n                \"username\": \"RJSkudra\",\n                \"fullName\": \"RJS (RJSkudra)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15709853/medium/c3abf2774913dc4e81fb261d36d7668c.png\",\n                \"joined\": \"2023-04-08 13:07:46\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"lv\",\n                    \"name\": \"Latvian\"\n                }\n            ],\n            \"translated\": 4280,\n            \"target\": 3758,\n            \"approved\": 4195,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 4184\n        },\n        {\n            \"user\": {\n                \"id\": \"16077170\",\n                \"username\": \"Topbcy\",\n                \"fullName\": \"Turbo (Topbcy)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/16077170/medium/d3aed33ea56330338756cfcd89477cfe.jpeg\",\n                \"joined\": \"2023-10-29 07:14:20\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"zh-TW\",\n                    \"name\": \"Chinese Traditional\"\n                }\n            ],\n            \"translated\": 4171,\n            \"target\": 6555,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15951759\",\n                \"username\": \"Sandor-dev\",\n                \"fullName\": \"Sandor-dev\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15951759/medium/0216c2da4eb028164ebbecf1c72f6271_default.png\",\n                \"joined\": \"2023-08-05 03:35:17\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"hu\",\n                    \"name\": \"Hungarian\"\n                }\n            ],\n            \"translated\": 4135,\n            \"target\": 3788,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15617065\",\n                \"username\": \"somerlev\",\n                \"fullName\": \"somerlev\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15617065/medium/f4b13513e311ec902d90b2f718412c55.jpg\",\n                \"joined\": \"2023-01-01 15:03:01\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"ru\",\n                    \"name\": \"Russian\"\n                }\n            ],\n            \"translated\": 3866,\n            \"target\": 3432,\n            \"approved\": 4640,\n            \"voted\": 160,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 3655\n        },\n        {\n            \"user\": {\n                \"id\": \"15644717\",\n                \"username\": \"suming\",\n                \"fullName\": \"宿命 (suming)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15644717/medium/244159dfe10fa03436205506f80c9e25.png\",\n                \"joined\": \"2023-01-19 12:37:25\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"zh-CN\",\n                    \"name\": \"Chinese Simplified\"\n                }\n            ],\n            \"translated\": 3836,\n            \"target\": 5983,\n            \"approved\": 4206,\n            \"voted\": 1,\n            \"positiveVotes\": 1,\n            \"negativeVotes\": 2,\n            \"winning\": 3413\n        },\n        {\n            \"user\": {\n                \"id\": \"15677023\",\n                \"username\": \"Spillebulle\",\n                \"fullName\": \"Spillebulle\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15677023/medium/096cf68fccf4b666954a0a57a974af64_default.png\",\n                \"joined\": \"2023-02-08 02:51:18\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"no\",\n                    \"name\": \"Norwegian\"\n                }\n            ],\n            \"translated\": 3234,\n            \"target\": 3063,\n            \"approved\": 4451,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 3225\n        },\n        {\n            \"user\": {\n                \"id\": \"14799754\",\n                \"username\": \"cretzen\",\n                \"fullName\": \"Cretzen (cretzen)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/14799754/medium/038eeb7de2d7869a17e402864bfeab24.png\",\n                \"joined\": \"2022-10-18 23:39:24\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"vi\",\n                    \"name\": \"Vietnamese\"\n                }\n            ],\n            \"translated\": 3001,\n            \"target\": 4174,\n            \"approved\": 23,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 4\n        },\n        {\n            \"user\": {\n                \"id\": \"15875457\",\n                \"username\": \"raelyan\",\n                \"fullName\": \"Raelyan (raelyan)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15875457/medium/2f4fda1d1aaa5dcc79b328baf3f03151.jpeg\",\n                \"joined\": \"2023-06-14 12:51:04\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"gl\",\n                    \"name\": \"Galician\"\n                },\n                {\n                    \"id\": \"es-ES\",\n                    \"name\": \"Spanish\"\n                }\n            ],\n            \"translated\": 2924,\n            \"target\": 3268,\n            \"approved\": 3791,\n            \"voted\": 5,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 2901\n        },\n        {\n            \"user\": {\n                \"id\": \"15428592\",\n                \"username\": \"flar.anton\",\n                \"fullName\": \"Anton Chernyshev (flar.anton)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15428592/medium/b01fdb365d892e9f811f77fcb50a80a2.jpeg\",\n                \"joined\": \"2022-08-31 11:31:25\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"uk\",\n                    \"name\": \"Ukrainian\"\n                }\n            ],\n            \"translated\": 2883,\n            \"target\": 2551,\n            \"approved\": 2748,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 2681\n        },\n        {\n            \"user\": {\n                \"id\": \"15419914\",\n                \"username\": \"benniblot\",\n                \"fullName\": \"Benjamin Engler (benniblot)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15419914/medium/7d0ba7a7c4b62dab3e5f570d858759d4.png\",\n                \"joined\": \"2022-08-25 07:49:07\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"en\",\n                    \"name\": \"English\"\n                },\n                {\n                    \"id\": \"de\",\n                    \"name\": \"German\"\n                }\n            ],\n            \"translated\": 2607,\n            \"target\": 2595,\n            \"approved\": 0,\n            \"voted\": 27,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 2101\n        },\n        {\n            \"user\": {\n                \"id\": \"15865139\",\n                \"username\": \"Beardy\",\n                \"fullName\": \"Beardy\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15865139/medium/fca6b9d2b3f52e286d1568f52b83b6a0_default.png\",\n                \"joined\": \"2023-06-07 06:24:20\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"el\",\n                    \"name\": \"Greek\"\n                }\n            ],\n            \"translated\": 2386,\n            \"target\": 2567,\n            \"approved\": 0,\n            \"voted\": 3,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15118857\",\n                \"username\": \"tomislav.kraljevic\",\n                \"fullName\": \"Tomislav Kraljević (tomislav.kraljevic)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15118857/medium/e133f1061cc92850b854d05d8faaeafd.png\",\n                \"joined\": \"2023-07-04 11:04:04\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"hr\",\n                    \"name\": \"Croatian\"\n                }\n            ],\n            \"translated\": 2109,\n            \"target\": 2031,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15647517\",\n                \"username\": \"nick.gher\",\n                \"fullName\": \"nick.gher\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15647517/medium/5374a2c6fef60a3fbf0edf86b997c351_default.png\",\n                \"joined\": \"2023-01-22 09:16:52\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"el\",\n                    \"name\": \"Greek\"\n                }\n            ],\n            \"translated\": 2064,\n            \"target\": 2219,\n            \"approved\": 2064,\n            \"voted\": 0,\n            \"positiveVotes\": 3,\n            \"negativeVotes\": 0,\n            \"winning\": 2055\n        },\n        {\n            \"user\": {\n                \"id\": \"16045554\",\n                \"username\": \"rpieja\",\n                \"fullName\": \"rpieja\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/16045554/medium/bd55baca2ef8b92502a760cc9ee7c505_default.png\",\n                \"joined\": \"2023-10-09 07:56:18\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"pl\",\n                    \"name\": \"Polish\"\n                }\n            ],\n            \"translated\": 1987,\n            \"target\": 1808,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 5,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15149958\",\n                \"username\": \"DimitriDR\",\n                \"fullName\": \"Dimitri (DimitriDR)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15149958/medium/a7b4224bce318334510b708a5ccda604.png\",\n                \"joined\": \"2023-01-06 18:49:19\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"fr\",\n                    \"name\": \"French\"\n                }\n            ],\n            \"translated\": 1753,\n            \"target\": 1978,\n            \"approved\": 1103,\n            \"voted\": 20,\n            \"positiveVotes\": 16,\n            \"negativeVotes\": 0,\n            \"winning\": 774\n        },\n        {\n            \"user\": {\n                \"id\": \"12572682\",\n                \"username\": \"THJ\",\n                \"fullName\": \"Andrej Kralj (THJ)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/12572682/medium/57fda59b7c2b9d100064e6c02953ebbe_default.png\",\n                \"joined\": \"2022-08-25 07:50:35\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"sl\",\n                    \"name\": \"Slovenian\"\n                }\n            ],\n            \"translated\": 1707,\n            \"target\": 1602,\n            \"approved\": 2614,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 1610\n        },\n        {\n            \"user\": {\n                \"id\": \"15981895\",\n                \"username\": \"azurite928\",\n                \"fullName\": \"Azurite (azurite928)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15981895/medium/547ccc459ee123e78b5401c499f1022d.png\",\n                \"joined\": \"2023-08-25 08:00:31\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"ja\",\n                    \"name\": \"Japanese\"\n                }\n            ],\n            \"translated\": 1685,\n            \"target\": 4598,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15270132\",\n                \"username\": \"ajnart\",\n                \"fullName\": \"Thomas Camlong (ajnart)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15270132/medium/a0f107a463c8910ee96bc2fa843a17e3.jpeg\",\n                \"joined\": \"2022-08-25 06:01:00\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"zh-CN\",\n                    \"name\": \"Chinese Simplified\"\n                },\n                {\n                    \"id\": \"hr\",\n                    \"name\": \"Croatian\"\n                },\n                {\n                    \"id\": \"da\",\n                    \"name\": \"Danish\"\n                },\n                {\n                    \"id\": \"nl\",\n                    \"name\": \"Dutch\"\n                },\n                {\n                    \"id\": \"en\",\n                    \"name\": \"English\"\n                },\n                {\n                    \"id\": \"fr\",\n                    \"name\": \"French\"\n                },\n                {\n                    \"id\": \"de\",\n                    \"name\": \"German\"\n                },\n                {\n                    \"id\": \"it\",\n                    \"name\": \"Italian\"\n                },\n                {\n                    \"id\": \"ja\",\n                    \"name\": \"Japanese\"\n                },\n                {\n                    \"id\": \"ko\",\n                    \"name\": \"Korean\"\n                },\n                {\n                    \"id\": \"lol\",\n                    \"name\": \"LOLCAT\"\n                },\n                {\n                    \"id\": \"lv\",\n                    \"name\": \"Latvian\"\n                },\n                {\n                    \"id\": \"no\",\n                    \"name\": \"Norwegian\"\n                },\n                {\n                    \"id\": \"pl\",\n                    \"name\": \"Polish\"\n                },\n                {\n                    \"id\": \"pt-BR\",\n                    \"name\": \"Portuguese, Brazilian\"\n                },\n                {\n                    \"id\": \"ru\",\n                    \"name\": \"Russian\"\n                },\n                {\n                    \"id\": \"sk\",\n                    \"name\": \"Slovak\"\n                },\n                {\n                    \"id\": \"sl\",\n                    \"name\": \"Slovenian\"\n                },\n                {\n                    \"id\": \"es-ES\",\n                    \"name\": \"Spanish\"\n                },\n                {\n                    \"id\": \"sv-SE\",\n                    \"name\": \"Swedish\"\n                },\n                {\n                    \"id\": \"tr\",\n                    \"name\": \"Turkish\"\n                },\n                {\n                    \"id\": \"uk\",\n                    \"name\": \"Ukrainian\"\n                },\n                {\n                    \"id\": \"vi\",\n                    \"name\": \"Vietnamese\"\n                }\n            ],\n            \"translated\": 1576,\n            \"target\": 1691,\n            \"approved\": 1463,\n            \"voted\": 0,\n            \"positiveVotes\": 189,\n            \"negativeVotes\": 21,\n            \"winning\": 1215\n        },\n        {\n            \"user\": {\n                \"id\": \"16021342\",\n                \"username\": \"Ronner231\",\n                \"fullName\": \"Ronner (Ronner231)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/16021342/medium/7734d550df2de5a2fec2ffff33e7024c.jpeg\",\n                \"joined\": \"2023-09-24 16:06:42\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"ru\",\n                    \"name\": \"Russian\"\n                }\n            ],\n            \"translated\": 901,\n            \"target\": 807,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 351\n        },\n        {\n            \"user\": {\n                \"id\": \"15420178\",\n                \"username\": \"Manicraft1001\",\n                \"fullName\": \"Manicraft1001\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15420178/medium/50ec94563a06a9f74f33bd09f01eed4d.jpg\",\n                \"joined\": \"2022-08-25 11:13:34\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"zh-CN\",\n                    \"name\": \"Chinese Simplified\"\n                },\n                {\n                    \"id\": \"en\",\n                    \"name\": \"English\"\n                },\n                {\n                    \"id\": \"fr\",\n                    \"name\": \"French\"\n                },\n                {\n                    \"id\": \"de\",\n                    \"name\": \"German\"\n                }\n            ],\n            \"translated\": 830,\n            \"target\": 838,\n            \"approved\": 3075,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 753\n        },\n        {\n            \"user\": {\n                \"id\": \"15818233\",\n                \"username\": \"MoeToo\",\n                \"fullName\": \"MoeToo\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15818233/medium/d35cd6953717706eaf20f6c143c62947.png\",\n                \"joined\": \"2023-07-27 03:50:11\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"zh-CN\",\n                    \"name\": \"Chinese Simplified\"\n                }\n            ],\n            \"translated\": 676,\n            \"target\": 1029,\n            \"approved\": 0,\n            \"voted\": 26,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 224\n        },\n        {\n            \"user\": {\n                \"id\": \"15419916\",\n                \"username\": \"pacjo\",\n                \"fullName\": \"pacjo\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15419916/medium/3cbeddbd7bc01faafb5a3bf47bba915b_default.png\",\n                \"joined\": \"2022-08-25 07:49:08\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"pl\",\n                    \"name\": \"Polish\"\n                }\n            ],\n            \"translated\": 651,\n            \"target\": 603,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 2,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15434162\",\n                \"username\": \"bfkadan\",\n                \"fullName\": \"이병주 (bfkadan)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15434162/medium/4f9a0b43cfe3acaea60124c14ba7f44a.png\",\n                \"joined\": \"2022-09-05 01:53:23\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"ko\",\n                    \"name\": \"Korean\"\n                }\n            ],\n            \"translated\": 627,\n            \"target\": 527,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 7,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"13185230\",\n                \"username\": \"BeersTeddy\",\n                \"fullName\": \"BeersTeddy\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/13185230/medium/2f1f4e1effe74a23422b195cbefb2a95_default.png\",\n                \"joined\": \"2023-03-09 09:40:50\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"pl\",\n                    \"name\": \"Polish\"\n                }\n            ],\n            \"translated\": 624,\n            \"target\": 570,\n            \"approved\": 0,\n            \"voted\": 12,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 1,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15977271\",\n                \"username\": \"tagaishi\",\n                \"fullName\": \"tagaishi\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15977271/medium/eade504c83a5a1ff831c80a538fbdb44_default.png\",\n                \"joined\": \"2023-08-22 07:09:16\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"zh-CN\",\n                    \"name\": \"Chinese Simplified\"\n                },\n                {\n                    \"id\": \"fr\",\n                    \"name\": \"French\"\n                }\n            ],\n            \"translated\": 588,\n            \"target\": 693,\n            \"approved\": 0,\n            \"voted\": 2,\n            \"positiveVotes\": 2,\n            \"negativeVotes\": 0,\n            \"winning\": 95\n        },\n        {\n            \"user\": {\n                \"id\": \"15925879\",\n                \"username\": \"kennit\",\n                \"fullName\": \"kennit\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15925879/medium/6b0733ad3c5949b91c55e4d8b03db8a5_default.png\",\n                \"joined\": \"2023-07-19 04:46:11\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"fr\",\n                    \"name\": \"French\"\n                }\n            ],\n            \"translated\": 577,\n            \"target\": 711,\n            \"approved\": 0,\n            \"voted\": 1,\n            \"positiveVotes\": 16,\n            \"negativeVotes\": 0,\n            \"winning\": 153\n        },\n        {\n            \"user\": {\n                \"id\": \"15426890\",\n                \"username\": \"JokeOfDead\",\n                \"fullName\": \"Alejandro Grande (JokeOfDead)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15426890/medium/a383eac9365e9de64fd4ab1d6fd0cb95.jpeg\",\n                \"joined\": \"2022-08-30 09:37:25\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"es-ES\",\n                    \"name\": \"Spanish\"\n                }\n            ],\n            \"translated\": 552,\n            \"target\": 649,\n            \"approved\": 658,\n            \"voted\": 19,\n            \"positiveVotes\": 87,\n            \"negativeVotes\": 0,\n            \"winning\": 355\n        },\n        {\n            \"user\": {\n                \"id\": \"15057621\",\n                \"username\": \"jeffersonraimon\",\n                \"fullName\": \"Jefferson J. Raimon (jeffersonraimon)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15057621/medium/4fbff4945fa3b7c2ab219a726b23778b.jpeg\",\n                \"joined\": \"2023-02-21 13:25:50\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"pt-BR\",\n                    \"name\": \"Portuguese, Brazilian\"\n                }\n            ],\n            \"translated\": 544,\n            \"target\": 606,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"14722148\",\n                \"username\": \"antoine2tt\",\n                \"fullName\": \"antoine2tt\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/14722148/medium/f88d926900862dd59007ea4b3419cb9d.png\",\n                \"joined\": \"2023-01-17 10:18:16\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"fr\",\n                    \"name\": \"French\"\n                }\n            ],\n            \"translated\": 507,\n            \"target\": 594,\n            \"approved\": 0,\n            \"voted\": 2,\n            \"positiveVotes\": 1,\n            \"negativeVotes\": 0,\n            \"winning\": 480\n        },\n        {\n            \"user\": {\n                \"id\": \"15690777\",\n                \"username\": \"y.gybson\",\n                \"fullName\": \"Константин Золотарев (y.gybson)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15690777/medium/b5cb5d2d5768904ff6586c727e3a6c77.jpeg\",\n                \"joined\": \"2023-02-15 07:43:18\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"ru\",\n                    \"name\": \"Russian\"\n                }\n            ],\n            \"translated\": 435,\n            \"target\": 382,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 250\n        },\n        {\n            \"user\": {\n                \"id\": \"15713937\",\n                \"username\": \"binge203\",\n                \"fullName\": \"Binge Noah (binge203)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15713937/medium/77c1cfa4314673db80e6881fd9f64668.gif\",\n                \"joined\": \"2023-02-27 15:57:17\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"uk\",\n                    \"name\": \"Ukrainian\"\n                }\n            ],\n            \"translated\": 411,\n            \"target\": 368,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 2,\n            \"negativeVotes\": 0,\n            \"winning\": 44\n        },\n        {\n            \"user\": {\n                \"id\": \"15425808\",\n                \"username\": \"fabricionaweb\",\n                \"fullName\": \"Fabricio Silva (fabricionaweb)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15425808/medium/a9354142e7ae5152c144409d55fda551_default.png\",\n                \"joined\": \"2022-08-29 14:45:47\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"pt-BR\",\n                    \"name\": \"Portuguese, Brazilian\"\n                }\n            ],\n            \"translated\": 408,\n            \"target\": 444,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15454038\",\n                \"username\": \"sebekmartin\",\n                \"fullName\": \"Martin Sebek (sebekmartin)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15454038/medium/bcfb44598cdfd1d7cd4eb35812538962.jpeg\",\n                \"joined\": \"2023-10-08 09:26:03\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"cs\",\n                    \"name\": \"Czech\"\n                }\n            ],\n            \"translated\": 393,\n            \"target\": 355,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"13330448\",\n                \"username\": \"vannCN\",\n                \"fullName\": \"vannCN\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/13330448/medium/9b8a9ee3611e51e951e22d5fd4eb7d8d.jpg\",\n                \"joined\": \"2023-01-16 01:38:13\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"zh-CN\",\n                    \"name\": \"Chinese Simplified\"\n                }\n            ],\n            \"translated\": 365,\n            \"target\": 566,\n            \"approved\": 0,\n            \"voted\": 5,\n            \"positiveVotes\": 6,\n            \"negativeVotes\": 0,\n            \"winning\": 79\n        },\n        {\n            \"user\": {\n                \"id\": \"15405614\",\n                \"username\": \"irithys\",\n                \"fullName\": \"irithys\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15405614/medium/3086461c47cce0a0c031925e5f943412.png\",\n                \"joined\": \"2022-09-18 21:10:51\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"zh-CN\",\n                    \"name\": \"Chinese Simplified\"\n                }\n            ],\n            \"translated\": 344,\n            \"target\": 599,\n            \"approved\": 0,\n            \"voted\": 3,\n            \"positiveVotes\": 15,\n            \"negativeVotes\": 3,\n            \"winning\": 119\n        },\n        {\n            \"user\": {\n                \"id\": \"15685239\",\n                \"username\": \"petitmewen\",\n                \"fullName\": \"mobby45 (petitmewen)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15685239/medium/15de9b62d2e0bc25013435f1784bbcc1.jpeg\",\n                \"joined\": \"2023-08-21 13:42:29\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"fr\",\n                    \"name\": \"French\"\n                }\n            ],\n            \"translated\": 320,\n            \"target\": 379,\n            \"approved\": 0,\n            \"voted\": 5,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 1,\n            \"winning\": 106\n        },\n        {\n            \"user\": {\n                \"id\": \"15427174\",\n                \"username\": \"hkz\",\n                \"fullName\": \"hkz\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15427174/medium/c88acefb0d7306e1f7470e872029fb39_default.png\",\n                \"joined\": \"2022-08-30 13:15:07\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"fr\",\n                    \"name\": \"French\"\n                }\n            ],\n            \"translated\": 318,\n            \"target\": 355,\n            \"approved\": 964,\n            \"voted\": 2,\n            \"positiveVotes\": 1,\n            \"negativeVotes\": 0,\n            \"winning\": 316\n        },\n        {\n            \"user\": {\n                \"id\": \"15687709\",\n                \"username\": \"NoProsNoNoobs\",\n                \"fullName\": \"NoProsNoNoobs\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15687709/medium/ae8f65fafeb8bcf74dcb8871bbe46461.png\",\n                \"joined\": \"2023-02-13 14:58:17\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"nl\",\n                    \"name\": \"Dutch\"\n                }\n            ],\n            \"translated\": 267,\n            \"target\": 259,\n            \"approved\": 0,\n            \"voted\": 8,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 63\n        },\n        {\n            \"user\": {\n                \"id\": \"7795\",\n                \"username\": \"zielmann\",\n                \"fullName\": \"Luke (zielmann)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/7795/medium/ad22b8b8d5eb33e4154d53a454c862fd_default.png\",\n                \"joined\": \"2023-10-12 09:50:59\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"pl\",\n                    \"name\": \"Polish\"\n                }\n            ],\n            \"translated\": 266,\n            \"target\": 258,\n            \"approved\": 0,\n            \"voted\": 7,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"6697\",\n                \"username\": \"carlchina\",\n                \"fullName\": \"carl wong (carlchina)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/6697/medium/d22bbe7797bbeb30dbdc73a5648d329a_default.png\",\n                \"joined\": \"2023-06-30 11:23:45\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"zh-CN\",\n                    \"name\": \"Chinese Simplified\"\n                }\n            ],\n            \"translated\": 264,\n            \"target\": 429,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 4,\n            \"negativeVotes\": 0,\n            \"winning\": 126\n        },\n        {\n            \"user\": {\n                \"id\": \"16084674\",\n                \"username\": \"ai5d02sb\",\n                \"fullName\": \"ai5d02sb\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/16084674/medium/7c8119fe2a5ca71bb15f636916a42b95_default.png\",\n                \"joined\": \"2023-11-02 15:47:09\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"fr\",\n                    \"name\": \"French\"\n                }\n            ],\n            \"translated\": 264,\n            \"target\": 275,\n            \"approved\": 0,\n            \"voted\": 12,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"14949159\",\n                \"username\": \"f1refa11\",\n                \"fullName\": \"FireFall (f1refa11)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/14949159/medium/fd2ae63b8eb4462200ba96abf943c1b9.png\",\n                \"joined\": \"2023-09-06 14:55:13\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"ru\",\n                    \"name\": \"Russian\"\n                }\n            ],\n            \"translated\": 228,\n            \"target\": 203,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 134\n        },\n        {\n            \"user\": {\n                \"id\": \"13641407\",\n                \"username\": \"wolong98\",\n                \"fullName\": \"QI wolong (wolong98)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/13641407/medium/f4634edc58c7857a357e5293543c15cf.jpg\",\n                \"joined\": \"2023-02-17 22:03:21\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"zh-CN\",\n                    \"name\": \"Chinese Simplified\"\n                }\n            ],\n            \"translated\": 185,\n            \"target\": 289,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 43\n        },\n        {\n            \"user\": {\n                \"id\": \"15420118\",\n                \"username\": \"WowMurdock\",\n                \"fullName\": \"Liok haah (WowMurdock)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15420118/medium/de19576fccb495b6dfe4c4c04a56b834.png\",\n                \"joined\": \"2022-08-25 10:34:26\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"ru\",\n                    \"name\": \"Russian\"\n                }\n            ],\n            \"translated\": 183,\n            \"target\": 161,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 54,\n            \"negativeVotes\": 3,\n            \"winning\": 17\n        },\n        {\n            \"user\": {\n                \"id\": \"15304568\",\n                \"username\": \"Bulgus\",\n                \"fullName\": \"Pour Les Tests (Bulgus)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15304568/medium/0e8787e5ceb02ed5c96a514d0068ae87.jpg\",\n                \"joined\": \"2023-02-05 11:48:40\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"fr\",\n                    \"name\": \"French\"\n                }\n            ],\n            \"translated\": 168,\n            \"target\": 209,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 18,\n            \"negativeVotes\": 3,\n            \"winning\": 75\n        },\n        {\n            \"user\": {\n                \"id\": \"14934947\",\n                \"username\": \"djismgaming\",\n                \"fullName\": \"Ismael (djismgaming)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/14934947/medium/f5a8570713c34ab0f7d5405d105e2a9a.jpeg\",\n                \"joined\": \"2023-11-12 08:36:15\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"es-ES\",\n                    \"name\": \"Spanish\"\n                }\n            ],\n            \"translated\": 164,\n            \"target\": 181,\n            \"approved\": 0,\n            \"voted\": 6,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"12580457\",\n                \"username\": \"almontegil\",\n                \"fullName\": \"Gil Almonte (almontegil)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/12580457/medium/f4136cacbdfdb4c28ae7f85dc5f840db_default.png\",\n                \"joined\": \"2022-08-28 20:04:49\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"es-ES\",\n                    \"name\": \"Spanish\"\n                }\n            ],\n            \"translated\": 162,\n            \"target\": 179,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 99,\n            \"negativeVotes\": 1,\n            \"winning\": 142\n        },\n        {\n            \"user\": {\n                \"id\": \"15057987\",\n                \"username\": \"giop98\",\n                \"fullName\": \"Giovanni Pollo (giop98)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15057987/medium/b8a4825d3fc39fc662f35ee258db4b2d.jpeg\",\n                \"joined\": \"2022-09-07 15:54:27\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"it\",\n                    \"name\": \"Italian\"\n                }\n            ],\n            \"translated\": 134,\n            \"target\": 141,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 3,\n            \"negativeVotes\": 0,\n            \"winning\": 86\n        },\n        {\n            \"user\": {\n                \"id\": \"15419912\",\n                \"username\": \"JannesV\",\n                \"fullName\": \"Jannes Vandepitte (JannesV)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15419912/medium/a7809eb4b817d7c49b62cf10ae86b950.png\",\n                \"joined\": \"2022-08-25 07:47:26\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"nl\",\n                    \"name\": \"Dutch\"\n                }\n            ],\n            \"translated\": 133,\n            \"target\": 130,\n            \"approved\": 0,\n            \"voted\": 2,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 114\n        },\n        {\n            \"user\": {\n                \"id\": \"15547289\",\n                \"username\": \"_vytdv\",\n                \"fullName\": \"_vytdv\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15547289/medium/60d8644cc8ad6f11a92ccea4a14cd098_default.png\",\n                \"joined\": \"2022-11-23 06:10:51\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"fr\",\n                    \"name\": \"French\"\n                }\n            ],\n            \"translated\": 96,\n            \"target\": 123,\n            \"approved\": 0,\n            \"voted\": 1,\n            \"positiveVotes\": 4,\n            \"negativeVotes\": 2,\n            \"winning\": 85\n        },\n        {\n            \"user\": {\n                \"id\": \"15573823\",\n                \"username\": \"edxo\",\n                \"fullName\": \"phui-chen (edxo)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15573823/medium/8a565b732a75a77f840dd123cdb30bf4.png\",\n                \"joined\": \"2023-04-17 10:47:03\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"zh-CN\",\n                    \"name\": \"Chinese Simplified\"\n                }\n            ],\n            \"translated\": 96,\n            \"target\": 172,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 7,\n            \"negativeVotes\": 0,\n            \"winning\": 28\n        },\n        {\n            \"user\": {\n                \"id\": \"15792897\",\n                \"username\": \"HooinKyoma\",\n                \"fullName\": \"Hooin Kyoma (HooinKyoma)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15792897/medium/9489f0a9b368e0e827ae758b740a2eed.jpeg\",\n                \"joined\": \"2023-04-19 06:15:34\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"zh-CN\",\n                    \"name\": \"Chinese Simplified\"\n                }\n            ],\n            \"translated\": 93,\n            \"target\": 135,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 14\n        },\n        {\n            \"user\": {\n                \"id\": \"15422606\",\n                \"username\": \"R4cc\",\n                \"fullName\": \"R4cc\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15422606/medium/a390979662b84694f59de30bdb732141.jpeg\",\n                \"joined\": \"2022-08-27 08:48:59\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"de\",\n                    \"name\": \"German\"\n                }\n            ],\n            \"translated\": 92,\n            \"target\": 87,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 69\n        },\n        {\n            \"user\": {\n                \"id\": \"15674577\",\n                \"username\": \"tee_noodle\",\n                \"fullName\": \"tee_noodle\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15674577/medium/804d9cf06f5196026acb6436b809d0da_default.png\",\n                \"joined\": \"2023-02-06 15:57:25\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"fr\",\n                    \"name\": \"French\"\n                }\n            ],\n            \"translated\": 91,\n            \"target\": 111,\n            \"approved\": 0,\n            \"voted\": 33,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 9\n        },\n        {\n            \"user\": {\n                \"id\": \"13343482\",\n                \"username\": \"binswm\",\n                \"fullName\": \"binswm\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/13343482/medium/45dde0e6097b9b72705d2eba9dbbc276_default.png\",\n                \"joined\": \"2023-03-06 03:58:56\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"zh-CN\",\n                    \"name\": \"Chinese Simplified\"\n                }\n            ],\n            \"translated\": 85,\n            \"target\": 136,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15836233\",\n                \"username\": \"itodouble\",\n                \"fullName\": \"还有一天就放假了 (itodouble)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15836233/medium/e984caea18fb0673bf319fcf28cef649.png\",\n                \"joined\": \"2023-05-18 04:20:01\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"zh-CN\",\n                    \"name\": \"Chinese Simplified\"\n                }\n            ],\n            \"translated\": 79,\n            \"target\": 127,\n            \"approved\": 0,\n            \"voted\": 19,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 31\n        },\n        {\n            \"user\": {\n                \"id\": \"14444264\",\n                \"username\": \"droidenko\",\n                \"fullName\": \"Сергій Богданов (droidenko)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/14444264/medium/4aa3a8e824f72bc9e5ec0d8de307095e.jpeg\",\n                \"joined\": \"2023-04-13 16:17:25\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"uk\",\n                    \"name\": \"Ukrainian\"\n                }\n            ],\n            \"translated\": 67,\n            \"target\": 64,\n            \"approved\": 0,\n            \"voted\": 2,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15436168\",\n                \"username\": \"HRKings\",\n                \"fullName\": \"Helton Reis (HRKings)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15436168/medium/69a31e461d38549f01864e7ef10d642e.png\",\n                \"joined\": \"2022-09-06 08:46:32\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"pt-BR\",\n                    \"name\": \"Portuguese, Brazilian\"\n                }\n            ],\n            \"translated\": 59,\n            \"target\": 64,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15620663\",\n                \"username\": \"realitymolder\",\n                \"fullName\": \"Daniel Toubul (realitymolder)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15620663/medium/567349e86d1b57a006a347142f7e11ee.jpeg\",\n                \"joined\": \"2023-01-18 07:20:56\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"zh-CN\",\n                    \"name\": \"Chinese Simplified\"\n                },\n                {\n                    \"id\": \"he\",\n                    \"name\": \"Hebrew\"\n                }\n            ],\n            \"translated\": 51,\n            \"target\": 51,\n            \"approved\": 0,\n            \"voted\": 12,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 33\n        },\n        {\n            \"user\": {\n                \"id\": \"15440860\",\n                \"username\": \"qaz0911\",\n                \"fullName\": \"qaz0911\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15440860/medium/3d3e50ee388c72dc4bf7a771761f2d89_default.png\",\n                \"joined\": \"2022-09-09 16:01:15\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"zh-CN\",\n                    \"name\": \"Chinese Simplified\"\n                }\n            ],\n            \"translated\": 44,\n            \"target\": 83,\n            \"approved\": 0,\n            \"voted\": 26,\n            \"positiveVotes\": 5,\n            \"negativeVotes\": 0,\n            \"winning\": 7\n        },\n        {\n            \"user\": {\n                \"id\": \"15518710\",\n                \"username\": \"HeroSizy\",\n                \"fullName\": \"SiZY (HeroSizy)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15518710/medium/4e79c0e98cbeb536dd961e656331b509.png\",\n                \"joined\": \"2022-11-03 03:34:17\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"zh-CN\",\n                    \"name\": \"Chinese Simplified\"\n                }\n            ],\n            \"translated\": 39,\n            \"target\": 63,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 13\n        },\n        {\n            \"user\": {\n                \"id\": \"15470768\",\n                \"username\": \"DooYoo\",\n                \"fullName\": \"DooYoo\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15470768/medium/2a18cf4be67094724b508c9e1e698a21_default.png\",\n                \"joined\": \"2022-09-30 06:15:13\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"fr\",\n                    \"name\": \"French\"\n                }\n            ],\n            \"translated\": 31,\n            \"target\": 31,\n            \"approved\": 0,\n            \"voted\": 12,\n            \"positiveVotes\": 1,\n            \"negativeVotes\": 0,\n            \"winning\": 5\n        },\n        {\n            \"user\": {\n                \"id\": \"14670666\",\n                \"username\": \"gm.cinalli\",\n                \"fullName\": \"Gian Marco Cinalli (gm.cinalli)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/14670666/medium/2d466a0fdbda40764526be86c97c0ab4.jpeg\",\n                \"joined\": \"2022-11-08 12:01:21\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"it\",\n                    \"name\": \"Italian\"\n                }\n            ],\n            \"translated\": 31,\n            \"target\": 40,\n            \"approved\": 0,\n            \"voted\": 11,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 23\n        },\n        {\n            \"user\": {\n                \"id\": \"13547726\",\n                \"username\": \"raphcatarino\",\n                \"fullName\": \"Zareix (raphcatarino)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/13547726/medium/b003511e67df13a4b4b5689488fa8099.jpg\",\n                \"joined\": \"2022-09-09 03:30:43\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"fr\",\n                    \"name\": \"French\"\n                }\n            ],\n            \"translated\": 26,\n            \"target\": 39,\n            \"approved\": 0,\n            \"voted\": 2,\n            \"positiveVotes\": 7,\n            \"negativeVotes\": 0,\n            \"winning\": 26\n        },\n        {\n            \"user\": {\n                \"id\": \"15459882\",\n                \"username\": \"RagnarGraves\",\n                \"fullName\": \"NONE NAME (RagnarGraves)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15459882/medium/143d5af850c1154070a218bea124e9cb_default.png\",\n                \"joined\": \"2023-03-15 09:57:36\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"es-ES\",\n                    \"name\": \"Spanish\"\n                }\n            ],\n            \"translated\": 24,\n            \"target\": 23,\n            \"approved\": 0,\n            \"voted\": 3,\n            \"positiveVotes\": 1,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15419934\",\n                \"username\": \"Payou6994\",\n                \"fullName\": \"Payou (Payou6994)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15419934/medium/37c9b9b17dfb578404c1c1ddb73ba7a8.png\",\n                \"joined\": \"2022-08-25 10:30:56\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"fr\",\n                    \"name\": \"French\"\n                }\n            ],\n            \"translated\": 22,\n            \"target\": 24,\n            \"approved\": 0,\n            \"voted\": 7,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 17\n        },\n        {\n            \"user\": {\n                \"id\": \"15588979\",\n                \"username\": \"Chengnan\",\n                \"fullName\": \"Chengnan\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15588979/medium/a3c6f4db39ae6c966190e1a2b3aea3d7.png\",\n                \"joined\": \"2023-06-27 01:48:52\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"zh-CN\",\n                    \"name\": \"Chinese Simplified\"\n                }\n            ],\n            \"translated\": 21,\n            \"target\": 49,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 12\n        },\n        {\n            \"user\": {\n                \"id\": \"15439078\",\n                \"username\": \"wiston81\",\n                \"fullName\": \"Riky Bahia (wiston81)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15439078/medium/10f292c8d12a7c21a44b54495fa4a3d8.jpeg\",\n                \"joined\": \"2022-09-08 10:28:34\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"it\",\n                    \"name\": \"Italian\"\n                }\n            ],\n            \"translated\": 16,\n            \"target\": 14,\n            \"approved\": 0,\n            \"voted\": 4,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 3\n        },\n        {\n            \"user\": {\n                \"id\": \"15486922\",\n                \"username\": \"frisco82\",\n                \"fullName\": \"Ramiro Aparicio (frisco82)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15486922/medium/4e1c5d4189b42508e660daa3c1c25b2a.jpeg\",\n                \"joined\": \"2022-10-11 13:43:27\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"en\",\n                    \"name\": \"English\"\n                },\n                {\n                    \"id\": \"es-ES\",\n                    \"name\": \"Spanish\"\n                }\n            ],\n            \"translated\": 14,\n            \"target\": 14,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 7\n        },\n        {\n            \"user\": {\n                \"id\": \"15501072\",\n                \"username\": \"MarcOrfilaCarreras\",\n                \"fullName\": \"Marc Orfila Carreras (MarcOrfilaCarreras)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15501072/medium/ea52b26c3c6f21e4931e38e3ce3f3d6e.png\",\n                \"joined\": \"2022-10-21 03:59:58\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"es-ES\",\n                    \"name\": \"Spanish\"\n                }\n            ],\n            \"translated\": 14,\n            \"target\": 19,\n            \"approved\": 0,\n            \"voted\": 1,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 6\n        },\n        {\n            \"user\": {\n                \"id\": \"15520022\",\n                \"username\": \"dwt136\",\n                \"fullName\": \"dwt136\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15520022/medium/554422503f2baea43ace85facb4546fb_default.png\",\n                \"joined\": \"2022-11-04 01:35:50\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"zh-CN\",\n                    \"name\": \"Chinese Simplified\"\n                }\n            ],\n            \"translated\": 14,\n            \"target\": 18,\n            \"approved\": 0,\n            \"voted\": 5,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 6\n        },\n        {\n            \"user\": {\n                \"id\": \"14012333\",\n                \"username\": \"spair0039\",\n                \"fullName\": \"spair0039\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/14012333/medium/72430e96027c09c19141cac38eae4617.png\",\n                \"joined\": \"2022-10-14 03:19:17\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"ko\",\n                    \"name\": \"Korean\"\n                }\n            ],\n            \"translated\": 13,\n            \"target\": 14,\n            \"approved\": 0,\n            \"voted\": 7,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15953187\",\n                \"username\": \"Meierschlumpf\",\n                \"fullName\": \"Meier Lukas (Meierschlumpf)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15953187/medium/23c744faef1ab84fbdc9351a7850aab6.jpeg\",\n                \"joined\": \"2023-08-06 04:07:46\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"de\",\n                    \"name\": \"German\"\n                }\n            ],\n            \"translated\": 9,\n            \"target\": 10,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 9\n        },\n        {\n            \"user\": {\n                \"id\": \"12664938\",\n                \"username\": \"andibing\",\n                \"fullName\": \"Andi Chandler (andibing)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/12664938/medium/b8be63e4dcb2e791ced1ffc9e3a049a5.jpg\",\n                \"joined\": \"2023-08-18 18:10:00\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"zh-CN\",\n                    \"name\": \"Chinese Simplified\"\n                }\n            ],\n            \"translated\": 7,\n            \"target\": 7,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15507822\",\n                \"username\": \"robertbridda\",\n                \"fullName\": \"Robert Bridda (robertbridda)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15507822/medium/a368c2e30411bb2da9b49290084191f3.png\",\n                \"joined\": \"2022-10-26 04:38:00\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"it\",\n                    \"name\": \"Italian\"\n                }\n            ],\n            \"translated\": 6,\n            \"target\": 8,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15434662\",\n                \"username\": \"BunnySweety\",\n                \"fullName\": \"BunnySweety\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15434662/medium/f0ef200a6a0dcf0e1d0e9ecd4148f560_default.png\",\n                \"joined\": \"2022-09-05 07:51:46\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"fr\",\n                    \"name\": \"French\"\n                }\n            ],\n            \"translated\": 5,\n            \"target\": 6,\n            \"approved\": 0,\n            \"voted\": 1,\n            \"positiveVotes\": 1,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15462414\",\n                \"username\": \"PrtmPhlp\",\n                \"fullName\": \"PrtmPhlp\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15462414/medium/b80db55e9de301432dcd1f8c8b24fd49_default.png\",\n                \"joined\": \"2022-09-24 09:01:16\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"de\",\n                    \"name\": \"German\"\n                }\n            ],\n            \"translated\": 4,\n            \"target\": 4,\n            \"approved\": 0,\n            \"voted\": 1,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15643771\",\n                \"username\": \"kid1412621\",\n                \"fullName\": \"kid1412621\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15643771/medium/dd455e32de652fa88e6fd97598bdffa7.png\",\n                \"joined\": \"2023-08-08 11:09:51\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"zh-CN\",\n                    \"name\": \"Chinese Simplified\"\n                }\n            ],\n            \"translated\": 3,\n            \"target\": 7,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 3\n        },\n        {\n            \"user\": {\n                \"id\": \"15545537\",\n                \"username\": \"eiloogs\",\n                \"fullName\": \"沐川 (eiloogs)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15545537/medium/f290a2f1190983530a9b76b2e858a609.gif\",\n                \"joined\": \"2022-11-22 01:52:53\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"zh-CN\",\n                    \"name\": \"Chinese Simplified\"\n                }\n            ],\n            \"translated\": 2,\n            \"target\": 6,\n            \"approved\": 0,\n            \"voted\": 1,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15650315\",\n                \"username\": \"DataCat\",\n                \"fullName\": \"DataCat\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15650315/medium/ce7c1365adf35c5d490d77500a4607fb_default.png\",\n                \"joined\": \"2023-01-23 06:55:50\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"zh-CN\",\n                    \"name\": \"Chinese Simplified\"\n                }\n            ],\n            \"translated\": 2,\n            \"target\": 5,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15658375\",\n                \"username\": \"dizo89\",\n                \"fullName\": \"jbr1989 (dizo89)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15658375/medium/0ca745e5017d491fe1b22b0239904de8.jpeg\",\n                \"joined\": \"2023-01-28 06:54:20\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"es-ES\",\n                    \"name\": \"Spanish\"\n                }\n            ],\n            \"translated\": 2,\n            \"target\": 3,\n            \"approved\": 0,\n            \"voted\": 3,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15847901\",\n                \"username\": \"loslocitos\",\n                \"fullName\": \"Daren Austin (loslocitos)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15847901/medium/fe30d12fd2cf38212f929e13b169f9ec.jpeg\",\n                \"joined\": \"2023-05-26 02:06:40\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"es-ES\",\n                    \"name\": \"Spanish\"\n                }\n            ],\n            \"translated\": 2,\n            \"target\": 2,\n            \"approved\": 0,\n            \"voted\": 28,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 2\n        },\n        {\n            \"user\": {\n                \"id\": \"15950309\",\n                \"username\": \"kuunpire\",\n                \"fullName\": \"kuunpi re (kuunpire)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15950309/medium/8192a4f08f07086828ac9f74ed29a169.jpeg\",\n                \"joined\": \"2023-08-04 13:43:57\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"uk\",\n                    \"name\": \"Ukrainian\"\n                }\n            ],\n            \"translated\": 2,\n            \"target\": 2,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15677311\",\n                \"username\": \"REMOVED_USER\",\n                \"fullName\": \"REMOVED_USER\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15677311/medium/8ffed0dd4eb21b71ee0be60fa7c80720_default.png\",\n                \"joined\": \"2023-02-20 07:28:13\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"no\",\n                    \"name\": \"Norwegian\"\n                }\n            ],\n            \"translated\": 1,\n            \"target\": 1,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15419976\",\n                \"username\": \"fzibi21\",\n                \"fullName\": \"Fred Zibulski (fzibi21)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15419976/medium/0da688450358e0290a7b7359cc1f7328.png\",\n                \"joined\": \"2022-08-25 08:37:20\"\n            },\n            \"languages\": [],\n            \"translated\": 0,\n            \"target\": 0,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15420120\",\n                \"username\": \"hbooo\",\n                \"fullName\": \"hbo (hbooo)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15420120/medium/6c7c7f8db785061356ebb03d044d3329.jpeg\",\n                \"joined\": \"2022-08-25 10:34:01\"\n            },\n            \"languages\": [],\n            \"translated\": 0,\n            \"target\": 0,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15420354\",\n                \"username\": \"Void123\",\n                \"fullName\": \"Void123\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15420354/medium/86929d44df92a00f9fe900a985c196df_default.png\",\n                \"joined\": \"2022-08-25 13:50:08\"\n            },\n            \"languages\": [],\n            \"translated\": 0,\n            \"target\": 0,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"13496556\",\n                \"username\": \"SkewRam\",\n                \"fullName\": \"Noan (SkewRam)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/13496556/medium/188f5c2deb7938eda51eb786cc4539ca.jpeg\",\n                \"joined\": \"2022-08-26 19:12:25\"\n            },\n            \"languages\": [],\n            \"translated\": 0,\n            \"target\": 0,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15246318\",\n                \"username\": \"andrea.rosso\",\n                \"fullName\": \"Andrea Rosso (andrea.rosso)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15246318/medium/11f3f5ef44ec7f55b6f143090e208704_default.png\",\n                \"joined\": \"2022-08-31 08:29:06\"\n            },\n            \"languages\": [],\n            \"translated\": 0,\n            \"target\": 0,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15429052\",\n                \"username\": \"BerkeleyBlue\",\n                \"fullName\": \"BerkeleyBlue\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15429052/medium/734cacdf45b7cedf4d56072cb0bce210_default.png\",\n                \"joined\": \"2022-08-31 19:48:48\"\n            },\n            \"languages\": [],\n            \"translated\": 0,\n            \"target\": 0,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15433542\",\n                \"username\": \"Bon\",\n                \"fullName\": \"Bon\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15433542/medium/5397da4dfc821f20b6ac14fe0c514e9a.jpeg\",\n                \"joined\": \"2022-09-04 11:30:12\"\n            },\n            \"languages\": [],\n            \"translated\": 0,\n            \"target\": 0,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"13245578\",\n                \"username\": \"jamesmcmahon0\",\n                \"fullName\": \"James McMahon (jamesmcmahon0)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/13245578/medium/586aa873b4abddbd9abc6f3de99ab70e.jpeg\",\n                \"joined\": \"2022-09-06 17:40:30\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"fr\",\n                    \"name\": \"French\"\n                }\n            ],\n            \"translated\": 0,\n            \"target\": 0,\n            \"approved\": 0,\n            \"voted\": 8,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15441462\",\n                \"username\": \"qqyule\",\n                \"fullName\": \"qqyule\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15441462/medium/7a3cdf82710ffb5d8f388bc0bd010665.png\",\n                \"joined\": \"2022-09-10 04:34:50\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"zh-CN\",\n                    \"name\": \"Chinese Simplified\"\n                }\n            ],\n            \"translated\": 0,\n            \"target\": 0,\n            \"approved\": 0,\n            \"voted\": 6,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15446228\",\n                \"username\": \"TariqDaCoder\",\n                \"fullName\": \"TariqDaCoder\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15446228/medium/50b0f4040112bbd67690b769477398e5_default.png\",\n                \"joined\": \"2022-09-13 13:28:16\"\n            },\n            \"languages\": [],\n            \"translated\": 0,\n            \"target\": 0,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15449644\",\n                \"username\": \"Anarchon\",\n                \"fullName\": \"Chri S. (Anarchon) (Anarchon)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15449644/medium/e925e1f3e3ffbf0f982391ce263a1a28.jpeg\",\n                \"joined\": \"2022-09-15 11:23:00\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"de\",\n                    \"name\": \"German\"\n                }\n            ],\n            \"translated\": 0,\n            \"target\": 0,\n            \"approved\": 0,\n            \"voted\": 1,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15453020\",\n                \"username\": \"Ashun\",\n                \"fullName\": \"Ashun\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15453020/medium/ccdcf51c73d6aae40751bb30beee1915_default.png\",\n                \"joined\": \"2022-09-17 21:03:53\"\n            },\n            \"languages\": [],\n            \"translated\": 0,\n            \"target\": 0,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"14118689\",\n                \"username\": \"Soochaehwa\",\n                \"fullName\": \"Soochaehwa\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/14118689/medium/496a1ce63111547bf455a1e0a7ac75f1_default.png\",\n                \"joined\": \"2022-09-22 09:30:24\"\n            },\n            \"languages\": [],\n            \"translated\": 0,\n            \"target\": 0,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15486092\",\n                \"username\": \"espentruls\",\n                \"fullName\": \"Espen Skarsten (espentruls)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15486092/medium/8e38afc3a4ff669226a0cfd3e420ff3a.jpeg\",\n                \"joined\": \"2022-10-11 02:43:38\"\n            },\n            \"languages\": [],\n            \"translated\": 0,\n            \"target\": 0,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15518090\",\n                \"username\": \"MKoniuszko\",\n                \"fullName\": \"Przemek (MKoniuszko)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15518090/medium/87605434fcc839f6763ab07c50f6d232.jpeg\",\n                \"joined\": \"2022-11-02 14:48:04\"\n            },\n            \"languages\": [],\n            \"translated\": 0,\n            \"target\": 0,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15526719\",\n                \"username\": \"asifthewebguy\",\n                \"fullName\": \"asifthewebguy\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15526719/medium/b18931dd0c800d725048bd440646198b_default.png\",\n                \"joined\": \"2022-11-08 17:35:53\"\n            },\n            \"languages\": [],\n            \"translated\": 0,\n            \"target\": 0,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15662563\",\n                \"username\": \"bowlr-support\",\n                \"fullName\": \"bowlr-support\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15662563/medium/6d242a9fc7dcf98fd4f528fbad02e767_default.png\",\n                \"joined\": \"2023-02-01 20:05:36\"\n            },\n            \"languages\": [],\n            \"translated\": 0,\n            \"target\": 0,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15704947\",\n                \"username\": \"inside90\",\n                \"fullName\": \"inside90\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15704947/medium/c1355fcb30dd76f8e39d98d1d49f1c52.png\",\n                \"joined\": \"2023-02-23 05:18:04\"\n            },\n            \"languages\": [],\n            \"translated\": 0,\n            \"target\": 0,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15719805\",\n                \"username\": \"tim-wiegers\",\n                \"fullName\": \"tim-wiegers\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15719805/medium/08a96f064813350661cd6b20bf3d7d99.png\",\n                \"joined\": \"2023-03-02 15:53:50\"\n            },\n            \"languages\": [],\n            \"translated\": 0,\n            \"target\": 0,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15359236\",\n                \"username\": \"jonathan.berglin.work\",\n                \"fullName\": \"Jonathan Berglin (jonathan.berglin.work)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15359236/medium/95930b2093db13b76179782f7322c5d5.png\",\n                \"joined\": \"2023-03-22 14:28:48\"\n            },\n            \"languages\": [],\n            \"translated\": 0,\n            \"target\": 0,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15714337\",\n                \"username\": \"Mailootje\",\n                \"fullName\": \"Mailootje\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15714337/medium/743c3bc4ab1989966a375eeeec83d8b8.jpeg\",\n                \"joined\": \"2023-04-24 03:34:25\"\n            },\n            \"languages\": [],\n            \"translated\": 0,\n            \"target\": 0,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15292058\",\n                \"username\": \"guineuu\",\n                \"fullName\": \"guineu (guineuu)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15292058/medium/22fbb758bda3b7805d50bf21d38f2c20.jpeg\",\n                \"joined\": \"2023-04-27 13:51:15\"\n            },\n            \"languages\": [],\n            \"translated\": 0,\n            \"target\": 0,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15849065\",\n                \"username\": \"Oversleep\",\n                \"fullName\": \"Oversleep\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15849065/medium/06141f13a6d541d753f3c2f2947b8068_default.png\",\n                \"joined\": \"2023-05-26 16:51:56\"\n            },\n            \"languages\": [],\n            \"translated\": 0,\n            \"target\": 0,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15315986\",\n                \"username\": \"BySempron\",\n                \"fullName\": \"Sergio (BySempron)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15315986/medium/e3d22d7b1423c6823a9f36d595ed4bdb.png\",\n                \"joined\": \"2023-05-27 11:09:06\"\n            },\n            \"languages\": [],\n            \"translated\": 0,\n            \"target\": 0,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15250690\",\n                \"username\": \"M1n-4d316e\",\n                \"fullName\": \"David (M1n-4d316e)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15250690/medium/f719940f4843d092ae8370cb014e4a04.png\",\n                \"joined\": \"2023-06-29 09:53:46\"\n            },\n            \"languages\": [],\n            \"translated\": 0,\n            \"target\": 0,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15913763\",\n                \"username\": \"dolphin738\",\n                \"fullName\": \"行素 (dolphin738)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15913763/medium/ee6fede7b8528ca642329ada80d1cc18.png\",\n                \"joined\": \"2023-07-11 08:18:20\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"zh-CN\",\n                    \"name\": \"Chinese Simplified\"\n                }\n            ],\n            \"translated\": 0,\n            \"target\": 0,\n            \"approved\": 0,\n            \"voted\": 1,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15916719\",\n                \"username\": \"brunotco\",\n                \"fullName\": \"brunotco\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15916719/medium/09db45880fc05abc18adb8d932a5ecf9_default.png\",\n                \"joined\": \"2023-07-13 02:34:44\"\n            },\n            \"languages\": [],\n            \"translated\": 0,\n            \"target\": 0,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"14817246\",\n                \"username\": \"ktKongTong\",\n                \"fullName\": \"ktKongTong\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/14817246/medium/97cfc3c028dbdaf85ebd1102da71e58c.jpeg\",\n                \"joined\": \"2023-07-13 21:49:21\"\n            },\n            \"languages\": [],\n            \"translated\": 0,\n            \"target\": 0,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"14861042\",\n                \"username\": \"marinkaberg\",\n                \"fullName\": \"marinkaberg\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/14861042/medium/2d5c4e62613f03082f3e645fa92efd59.jpeg\",\n                \"joined\": \"2023-07-28 00:44:23\"\n            },\n            \"languages\": [],\n            \"translated\": 0,\n            \"target\": 0,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15970733\",\n                \"username\": \"harmlesscat\",\n                \"fullName\": \"harmlesscat\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15970733/medium/dd8d0214a0250c932bb518b1b55e45a2_default.png\",\n                \"joined\": \"2023-08-17 11:14:25\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"zh-CN\",\n                    \"name\": \"Chinese Simplified\"\n                }\n            ],\n            \"translated\": 0,\n            \"target\": 0,\n            \"approved\": 0,\n            \"voted\": 2,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15976121\",\n                \"username\": \"OrzWTF\",\n                \"fullName\": \"__Gio__ (OrzWTF)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15976121/medium/4c4557cbff7ff7b0503455bc59c020e0.jpeg\",\n                \"joined\": \"2023-08-21 12:05:12\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"zh-CN\",\n                    \"name\": \"Chinese Simplified\"\n                }\n            ],\n            \"translated\": 0,\n            \"target\": 0,\n            \"approved\": 0,\n            \"voted\": 1,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"16034148\",\n                \"username\": \"ugyes\",\n                \"fullName\": \"ugyes\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/16034148/medium/ed001e3f470a2dea9a8ce955b18e7bd5.png\",\n                \"joined\": \"2023-10-01 13:41:09\"\n            },\n            \"languages\": [],\n            \"translated\": 0,\n            \"target\": 0,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"16051620\",\n                \"username\": \"flambyisyou\",\n                \"fullName\": \"Flamby Isyou (flambyisyou)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/16051620/medium/3a3bc0c90f6b95ab4ef74396a0a17beb.png\",\n                \"joined\": \"2023-10-13 05:07:02\"\n            },\n            \"languages\": [\n                {\n                    \"id\": \"fr\",\n                    \"name\": \"French\"\n                }\n            ],\n            \"translated\": 0,\n            \"target\": 0,\n            \"approved\": 0,\n            \"voted\": 18,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"15760967\",\n                \"username\": \"Zoen-Millo\",\n                \"fullName\": \"Zoen Millo (Zoen-Millo)\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/15760967/medium/9e956f11adc5b34f5636268b5c485dbf.jpg\",\n                \"joined\": \"2023-10-16 23:29:05\"\n            },\n            \"languages\": [],\n            \"translated\": 0,\n            \"target\": 0,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        },\n        {\n            \"user\": {\n                \"id\": \"16097722\",\n                \"username\": \"explosiveparrot\",\n                \"fullName\": \"explosiveparrot\",\n                \"avatarUrl\": \"https://crowdin-static.downloads.crowdin.com/avatar/16097722/medium/7762f80fc1da63f5b2eb87de9d640324_default.png\",\n                \"joined\": \"2023-11-10 21:23:11\"\n            },\n            \"languages\": [],\n            \"translated\": 0,\n            \"target\": 0,\n            \"approved\": 0,\n            \"voted\": 0,\n            \"positiveVotes\": 0,\n            \"negativeVotes\": 0,\n            \"winning\": 0\n        }\n    ]\n}"
  },
  {
    "path": "data/default.json",
    "content": "{\n  \"schemaVersion\": 2,\n  \"configProperties\": {\n    \"name\": \"default\"\n  },\n  \"categories\": [],\n  \"wrappers\": [\n    {\n      \"id\": \"default\",\n      \"position\": 0\n    }\n  ],\n  \"apps\": [\n    {\n      \"id\": \"5df743d9-5cb1-457c-85d2-64ff86855652\",\n      \"name\": \"Documentation\",\n      \"url\": \"https://homarr.dev\",\n      \"behaviour\": {\n        \"onClickUrl\": \"https://homarr.dev\",\n        \"externalUrl\": \"https://homarr.dev\",\n        \"isOpeningNewTab\": true\n      },\n      \"network\": {\n        \"enabledStatusChecker\": false,\n        \"statusCodes\": [\n          \"200\"\n        ]\n      },\n      \"appearance\": {\n        \"iconUrl\": \"/imgs/logo/logo.png\",\n        \"appNameStatus\": \"normal\",\n        \"positionAppName\": \"column\",\n        \"lineClampAppName\": 1\n      },\n      \"integration\": {\n        \"type\": null,\n        \"properties\": []\n      },\n      \"area\": {\n        \"type\": \"wrapper\",\n        \"properties\": {\n          \"id\": \"default\"\n        }\n      },\n      \"shape\": {\n        \"md\": {\n          \"location\": {\n            \"x\": 5,\n            \"y\": 1\n          },\n          \"size\": {\n            \"width\": 1,\n            \"height\": 1\n          }\n        },\n        \"sm\": {\n          \"location\": {\n            \"x\": 0,\n            \"y\": 1\n          },\n          \"size\": {\n            \"width\": 1,\n            \"height\": 2\n          }\n        },\n        \"lg\": {\n          \"location\": {\n            \"x\": 6,\n            \"y\": 1\n          },\n          \"size\": {\n            \"width\": 2,\n            \"height\": 2\n          }\n        }\n      }\n    },\n    {\n      \"id\": \"47af36c0-47c1-4e5b-bfc7-ad645ee6a337\",\n      \"name\": \"Discord\",\n      \"url\": \"https://discord.com/invite/aCsmEV5RgA\",\n      \"behaviour\": {\n        \"onClickUrl\": \"https://discord.com/invite/aCsmEV5RgA\",\n        \"isOpeningNewTab\": true,\n        \"externalUrl\": \"https://discord.com/invite/aCsmEV5RgA\",\n        \"tooltipDescription\": \"Join our Discord server! We're waiting for your ideas and feedback. \"\n      },\n      \"network\": {\n        \"enabledStatusChecker\": false,\n        \"statusCodes\": [\n          \"200\"\n        ]\n      },\n      \"appearance\": {\n        \"iconUrl\": \"https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/discord.png\",\n        \"appNameStatus\": \"normal\",\n        \"positionAppName\": \"row-reverse\",\n        \"lineClampAppName\": 1\n      },\n      \"integration\": {\n        \"type\": null,\n        \"properties\": []\n      },\n      \"area\": {\n        \"type\": \"wrapper\",\n        \"properties\": {\n          \"id\": \"default\"\n        }\n      },\n      \"shape\": {\n        \"md\": {\n          \"location\": {\n            \"x\": 3,\n            \"y\": 1\n          },\n          \"size\": {\n            \"width\": 1,\n            \"height\": 1\n          }\n        },\n        \"sm\": {\n          \"location\": {\n            \"x\": 1,\n            \"y\": 4\n          },\n          \"size\": {\n            \"width\": 1,\n            \"height\": 1\n          }\n        },\n        \"lg\": {\n          \"location\": {\n            \"x\": 4,\n            \"y\": 0\n          },\n          \"size\": {\n            \"width\": 2,\n            \"height\": 1\n          }\n        }\n      }\n    },\n    {\n      \"id\": \"47af36c0-47c1-4e5b-bfc7-ad645ee6a330\",\n      \"name\": \"Contribute\",\n      \"url\": \"https://github.com/ajnart/homarr\",\n      \"behaviour\": {\n        \"onClickUrl\": \"https://github.com/ajnart/homarr\",\n        \"externalUrl\": \"https://github.com/ajnart/homarr\",\n        \"isOpeningNewTab\": true,\n        \"tooltipDescription\": \"\"\n      },\n      \"network\": {\n        \"enabledStatusChecker\": false,\n        \"statusCodes\": []\n      },\n      \"appearance\": {\n        \"iconUrl\": \"https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/github.png\",\n        \"appNameStatus\": \"normal\",\n        \"positionAppName\": \"row-reverse\",\n        \"lineClampAppName\": 2\n      },\n      \"integration\": {\n        \"type\": null,\n        \"properties\": []\n      },\n      \"area\": {\n        \"type\": \"wrapper\",\n        \"properties\": {\n          \"id\": \"default\"\n        }\n      },\n      \"shape\": {\n        \"md\": {\n          \"location\": {\n            \"x\": 3,\n            \"y\": 2\n          },\n          \"size\": {\n            \"width\": 2,\n            \"height\": 1\n          }\n        },\n        \"sm\": {\n          \"location\": {\n            \"x\": 1,\n            \"y\": 3\n          },\n          \"size\": {\n            \"width\": 2,\n            \"height\": 1\n          }\n        },\n        \"lg\": {\n          \"location\": {\n            \"x\": 2,\n            \"y\": 0\n          },\n          \"size\": {\n            \"width\": 2,\n            \"height\": 1\n          }\n        }\n      }\n    },\n    {\n      \"id\": \"47af36c0-47c1-4e5b-bfc7-ad645ee6a990\",\n      \"name\": \"Donate\",\n      \"url\": \"https://ko-fi.com/ajnart\",\n      \"behaviour\": {\n        \"onClickUrl\": \"https://ko-fi.com/ajnart\",\n        \"externalUrl\": \"https://ko-fi.com/ajnart\",\n        \"isOpeningNewTab\": true,\n        \"tooltipDescription\": \"Please consider making a donation\"\n      },\n      \"network\": {\n        \"enabledStatusChecker\": false,\n        \"statusCodes\": [\n          \"200\"\n        ]\n      },\n      \"appearance\": {\n        \"iconUrl\": \"https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/ko-fi.png\",\n        \"appNameStatus\": \"normal\",\n        \"positionAppName\": \"row-reverse\",\n        \"lineClampAppName\": 1\n      },\n      \"integration\": {\n        \"type\": null,\n        \"properties\": []\n      },\n      \"area\": {\n        \"type\": \"wrapper\",\n        \"properties\": {\n          \"id\": \"default\"\n        }\n      },\n      \"shape\": {\n        \"md\": {\n          \"location\": {\n            \"x\": 4,\n            \"y\": 1\n          },\n          \"size\": {\n            \"width\": 1,\n            \"height\": 1\n          }\n        },\n        \"sm\": {\n          \"location\": {\n            \"x\": 2,\n            \"y\": 4\n          },\n          \"size\": {\n            \"width\": 1,\n            \"height\": 1\n          }\n        },\n        \"lg\": {\n          \"location\": {\n            \"x\": 6,\n            \"y\": 0\n          },\n          \"size\": {\n            \"width\": 2,\n            \"height\": 1\n          }\n        }\n      }\n    }\n  ],\n  \"widgets\": [\n    {\n      \"id\": \"e3004052-6b83-480e-b458-56e8ccdca5f0\",\n      \"type\": \"weather\",\n      \"properties\": {\n        \"displayInFahrenheit\": false,\n        \"location\": {\n          \"name\": \"Paris\",\n          \"latitude\": 48.85341,\n          \"longitude\": 2.3488\n        },\n        \"displayCityName\": true\n      },\n      \"area\": {\n        \"type\": \"wrapper\",\n        \"properties\": {\n          \"id\": \"default\"\n        }\n      },\n      \"shape\": {\n        \"md\": {\n          \"location\": {\n            \"x\": 5,\n            \"y\": 0\n          },\n          \"size\": {\n            \"width\": 1,\n            \"height\": 1\n          }\n        },\n        \"sm\": {\n          \"location\": {\n            \"x\": 2,\n            \"y\": 0\n          },\n          \"size\": {\n            \"width\": 1,\n            \"height\": 1\n          }\n        },\n        \"lg\": {\n          \"location\": {\n            \"x\": 0,\n            \"y\": 0\n          },\n          \"size\": {\n            \"width\": 2,\n            \"height\": 1\n          }\n        }\n      }\n    },\n    {\n      \"id\": \"971aa859-8570-49a1-8d34-dd5c7b3638d1\",\n      \"type\": \"date\",\n      \"properties\": {\n        \"display24HourFormat\": true,\n        \"dateFormat\": \"hide\",\n        \"enableTimezone\": false,\n        \"timezoneLocation\": {\n          \"name\": \"Paris\",\n          \"latitude\": 48.85341,\n          \"longitude\": 2.3488\n        },\n        \"titleState\": \"city\"\n      },\n      \"area\": {\n        \"type\": \"wrapper\",\n        \"properties\": {\n          \"id\": \"default\"\n        }\n      },\n      \"shape\": {\n        \"sm\": {\n          \"location\": {\n            \"x\": 1,\n            \"y\": 0\n          },\n          \"size\": {\n            \"width\": 1,\n            \"height\": 1\n          }\n        },\n        \"md\": {\n          \"location\": {\n            \"x\": 4,\n            \"y\": 0\n          },\n          \"size\": {\n            \"width\": 1,\n            \"height\": 1\n          }\n        },\n        \"lg\": {\n          \"location\": {\n            \"x\": 8,\n            \"y\": 0\n          },\n          \"size\": {\n            \"width\": 2,\n            \"height\": 1\n          }\n        }\n      }\n    },\n    {\n      \"id\": \"f252768d-9e69-491b-b6b4-8cad04fa30e8\",\n      \"type\": \"date\",\n      \"properties\": {\n        \"display24HourFormat\": true,\n        \"dateFormat\": \"hide\",\n        \"enableTimezone\": true,\n        \"timezoneLocation\": {\n          \"name\": \"Tokyo\",\n          \"latitude\": 35.6895,\n          \"longitude\": 139.69171\n        },\n        \"titleState\": \"city\"\n      },\n      \"area\": {\n        \"type\": \"wrapper\",\n        \"properties\": {\n          \"id\": \"default\"\n        }\n      },\n      \"shape\": {\n        \"sm\": {\n          \"location\": {\n            \"x\": 0,\n            \"y\": 0\n          },\n          \"size\": {\n            \"width\": 1,\n            \"height\": 1\n          }\n        },\n        \"md\": {\n          \"location\": {\n            \"x\": 3,\n            \"y\": 0\n          },\n          \"size\": {\n            \"width\": 1,\n            \"height\": 1\n          }\n        },\n        \"lg\": {\n          \"location\": {\n            \"x\": 8,\n            \"y\": 1\n          },\n          \"size\": {\n            \"width\": 2,\n            \"height\": 1\n          }\n        }\n      }\n    },\n    {\n      \"id\": \"86b1921f-efa7-410f-92dd-79553bf3264d\",\n      \"type\": \"notebook\",\n      \"properties\": {\n        \"showToolbar\": true,\n        \"content\": \"<h2><strong>Welcome to Homarr 🚀👋</strong></h2><p>We're glad that you're here! Homarr is a <em>modern </em>and <em>easy to use</em> dashboard that helps you to <strong>organize and manage</strong> your home network from one place. Control is <strong>at your fingertips</strong>.</p><p>We recommend you to read the <a target=\\\"_blank\\\" rel=\\\"noopener noreferrer nofollow\\\" href=\\\"https://homarr.dev/docs/getting-started/after-the-installation\\\">getting started guide</a> first. To edit this board you must enter the edit mode - only administrators can do this. Adding an app is the first step you should take. You can do this by clicking the <code>Add tile</code> button at the top right and select <code>App</code>. After you provided an internal URL, external URL and selected an icon you can drag it around when holding down the left mouse button. Make it bigger or smaller using the drag icon at the bottom right. When you're happy with it's position, you <strong>must exit edit mode to save your board</strong>. Adding widgets works the same way but may require additional configuration - read the documentation for more information.</p><p>To remove this widget, you must log in to your administrator account and click on the menu to delete it.</p><p><strong><u>Your TODO list:</u></strong></p><ul data-type=\\\"taskList\\\"><li data-checked=\\\"false\\\" data-type=\\\"taskItem\\\"><label><input type=\\\"checkbox\\\"><span></span></label><div><p>Read the <a target=\\\"_blank\\\" rel=\\\"noopener noreferrer nofollow\\\" href=\\\"https://homarr.dev\\\">documentation</a></p></div></li><li data-checked=\\\"false\\\" data-type=\\\"taskItem\\\"><label><input type=\\\"checkbox\\\"><span></span></label><div><p>Add your <em>first app</em></p></div></li><li data-checked=\\\"false\\\" data-type=\\\"taskItem\\\"><label><input type=\\\"checkbox\\\"><span></span></label><div><p><em>Resize </em>and <em>drag</em> your app to a different position</p></div></li><li data-checked=\\\"false\\\" data-type=\\\"taskItem\\\"><label><input type=\\\"checkbox\\\"><span></span></label><div><p>Add the <em>clock widget</em> to your dashboard</p></div></li><li data-checked=\\\"false\\\" data-type=\\\"taskItem\\\"><label><input type=\\\"checkbox\\\"><span></span></label><div><p>Create a <em>new user</em></p></div></li></ul>\"\n      },\n      \"area\": {\n        \"type\": \"wrapper\",\n        \"properties\": {\n          \"id\": \"default\"\n        }\n      },\n      \"shape\": {\n        \"sm\": {\n          \"location\": {\n            \"x\": 0,\n            \"y\": 0\n          },\n          \"size\": {\n            \"width\": 3,\n            \"height\": 2\n          }\n        },\n        \"md\": {\n          \"location\": {\n            \"x\": 0,\n            \"y\": 0\n          },\n          \"size\": {\n            \"width\": 3,\n            \"height\": 4\n          }\n        },\n        \"lg\": {\n          \"location\": {\n            \"x\": 0,\n            \"y\": 1\n          },\n          \"size\": {\n            \"width\": 6,\n            \"height\": 3\n          }\n        }\n      }\n    }\n  ],\n  \"settings\": {\n    \"common\": {\n      \"searchEngine\": {\n        \"type\": \"google\",\n        \"properties\": {}\n      }\n    },\n    \"customization\": {\n      \"layout\": {\n        \"enabledLeftSidebar\": false,\n        \"enabledRightSidebar\": false,\n        \"enabledDocker\": false,\n        \"enabledPing\": false,\n        \"enabledSearchbar\": true\n      },\n      \"pageTitle\": \"Homarr ⭐️\",\n      \"logoImageUrl\": \"/imgs/logo/logo.png\",\n      \"faviconUrl\": \"/imgs/favicon/favicon-squared.png\",\n      \"backgroundImageUrl\": \"\",\n      \"customCss\": \"\",\n      \"colors\": {\n        \"primary\": \"red\",\n        \"secondary\": \"yellow\",\n        \"shade\": 7\n      },\n      \"appOpacity\": 100,\n      \"gridstack\": {\n        \"columnCountSmall\": 3,\n        \"columnCountMedium\": 6,\n        \"columnCountLarge\": 10\n      }\n    },\n    \"access\": {\n      \"allowGuests\": false\n    }\n  }\n}"
  },
  {
    "path": "database/.gitkeep",
    "content": ""
  },
  {
    "path": "drizzle/0000_supreme_the_captain.sql",
    "content": "CREATE TABLE `account` (\n\t`userId` text NOT NULL,\n\t`type` text NOT NULL,\n\t`provider` text NOT NULL,\n\t`providerAccountId` text NOT NULL,\n\t`refresh_token` text,\n\t`access_token` text,\n\t`expires_at` integer,\n\t`token_type` text,\n\t`scope` text,\n\t`id_token` text,\n\t`session_state` text,\n\tPRIMARY KEY(`provider`, `providerAccountId`),\n\tFOREIGN KEY (`userId`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade\n);\n--> statement-breakpoint\nCREATE TABLE `invite` (\n\t`id` text PRIMARY KEY NOT NULL,\n\t`token` text NOT NULL,\n\t`expires` integer NOT NULL,\n\t`created_by_id` text NOT NULL,\n\tFOREIGN KEY (`created_by_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade\n);\n--> statement-breakpoint\nCREATE TABLE `session` (\n\t`sessionToken` text PRIMARY KEY NOT NULL,\n\t`userId` text NOT NULL,\n\t`expires` integer NOT NULL,\n\tFOREIGN KEY (`userId`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade\n);\n--> statement-breakpoint\nCREATE TABLE `user_setting` (\n\t`id` text PRIMARY KEY NOT NULL,\n\t`user_id` text NOT NULL,\n\t`color_scheme` text DEFAULT 'environment' NOT NULL,\n\t`language` text DEFAULT 'en' NOT NULL,\n\t`default_board` text DEFAULT 'default' NOT NULL,\n\t`first_day_of_week` text DEFAULT 'monday' NOT NULL,\n\t`search_template` text DEFAULT 'https://google.com/search?q=%s' NOT NULL,\n\t`open_search_in_new_tab` integer DEFAULT true NOT NULL,\n\t`disable_ping_pulse` integer DEFAULT false NOT NULL,\n\t`replace_ping_with_icons` integer DEFAULT false NOT NULL,\n\t`use_debug_language` integer DEFAULT false NOT NULL,\n\t`auto_focus_search` integer DEFAULT false NOT NULL,\n\tFOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade\n);\n--> statement-breakpoint\nCREATE TABLE `user` (\n\t`id` text PRIMARY KEY NOT NULL,\n\t`name` text,\n\t`email` text,\n\t`emailVerified` integer,\n\t`image` text,\n\t`password` text,\n\t`salt` text,\n\t`is_admin` integer DEFAULT false NOT NULL,\n\t`is_owner` integer DEFAULT false NOT NULL\n);\n--> statement-breakpoint\nCREATE TABLE `verificationToken` (\n\t`identifier` text NOT NULL,\n\t`token` text NOT NULL,\n\t`expires` integer NOT NULL,\n\tPRIMARY KEY(`identifier`, `token`)\n);\n--> statement-breakpoint\nCREATE INDEX `userId_idx` ON `account` (`userId`);--> statement-breakpoint\nCREATE UNIQUE INDEX `invite_token_unique` ON `invite` (`token`);--> statement-breakpoint\nCREATE INDEX `user_id_idx` ON `session` (`userId`);"
  },
  {
    "path": "drizzle/0001_brave_mimic.sql",
    "content": "CREATE TABLE `migrate_token` (\n\t`id` text PRIMARY KEY NOT NULL,\n\t`token` text NOT NULL,\n\t`boards` integer NOT NULL,\n\t`users` integer NOT NULL,\n\t`integrations` integer NOT NULL,\n\t`expires` integer NOT NULL\n);\n--> statement-breakpoint\nCREATE UNIQUE INDEX `migrate_token_token_unique` ON `migrate_token` (`token`);"
  },
  {
    "path": "drizzle/meta/0000_snapshot.json",
    "content": "{\n  \"version\": \"5\",\n  \"dialect\": \"sqlite\",\n  \"id\": \"32c1bc91-e69f-4e1d-b53c-9c43f2e6c9d3\",\n  \"prevId\": \"00000000-0000-0000-0000-000000000000\",\n  \"tables\": {\n    \"account\": {\n      \"name\": \"account\",\n      \"columns\": {\n        \"userId\": {\n          \"name\": \"userId\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"type\": {\n          \"name\": \"type\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"provider\": {\n          \"name\": \"provider\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"providerAccountId\": {\n          \"name\": \"providerAccountId\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"refresh_token\": {\n          \"name\": \"refresh_token\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"access_token\": {\n          \"name\": \"access_token\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"expires_at\": {\n          \"name\": \"expires_at\",\n          \"type\": \"integer\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"token_type\": {\n          \"name\": \"token_type\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"scope\": {\n          \"name\": \"scope\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"id_token\": {\n          \"name\": \"id_token\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"session_state\": {\n          \"name\": \"session_state\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        }\n      },\n      \"indexes\": {\n        \"userId_idx\": {\n          \"name\": \"userId_idx\",\n          \"columns\": [\n            \"userId\"\n          ],\n          \"isUnique\": false\n        }\n      },\n      \"foreignKeys\": {\n        \"account_userId_user_id_fk\": {\n          \"name\": \"account_userId_user_id_fk\",\n          \"tableFrom\": \"account\",\n          \"tableTo\": \"user\",\n          \"columnsFrom\": [\n            \"userId\"\n          ],\n          \"columnsTo\": [\n            \"id\"\n          ],\n          \"onDelete\": \"cascade\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {\n        \"account_provider_providerAccountId_pk\": {\n          \"columns\": [\n            \"provider\",\n            \"providerAccountId\"\n          ]\n        }\n      },\n      \"uniqueConstraints\": {}\n    },\n    \"invite\": {\n      \"name\": \"invite\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"text\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"token\": {\n          \"name\": \"token\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"expires\": {\n          \"name\": \"expires\",\n          \"type\": \"integer\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"created_by_id\": {\n          \"name\": \"created_by_id\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        }\n      },\n      \"indexes\": {\n        \"invite_token_unique\": {\n          \"name\": \"invite_token_unique\",\n          \"columns\": [\n            \"token\"\n          ],\n          \"isUnique\": true\n        }\n      },\n      \"foreignKeys\": {\n        \"invite_created_by_id_user_id_fk\": {\n          \"name\": \"invite_created_by_id_user_id_fk\",\n          \"tableFrom\": \"invite\",\n          \"tableTo\": \"user\",\n          \"columnsFrom\": [\n            \"created_by_id\"\n          ],\n          \"columnsTo\": [\n            \"id\"\n          ],\n          \"onDelete\": \"cascade\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {},\n      \"uniqueConstraints\": {}\n    },\n    \"session\": {\n      \"name\": \"session\",\n      \"columns\": {\n        \"sessionToken\": {\n          \"name\": \"sessionToken\",\n          \"type\": \"text\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"userId\": {\n          \"name\": \"userId\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"expires\": {\n          \"name\": \"expires\",\n          \"type\": \"integer\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        }\n      },\n      \"indexes\": {\n        \"user_id_idx\": {\n          \"name\": \"user_id_idx\",\n          \"columns\": [\n            \"userId\"\n          ],\n          \"isUnique\": false\n        }\n      },\n      \"foreignKeys\": {\n        \"session_userId_user_id_fk\": {\n          \"name\": \"session_userId_user_id_fk\",\n          \"tableFrom\": \"session\",\n          \"tableTo\": \"user\",\n          \"columnsFrom\": [\n            \"userId\"\n          ],\n          \"columnsTo\": [\n            \"id\"\n          ],\n          \"onDelete\": \"cascade\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {},\n      \"uniqueConstraints\": {}\n    },\n    \"user_setting\": {\n      \"name\": \"user_setting\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"text\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"user_id\": {\n          \"name\": \"user_id\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"color_scheme\": {\n          \"name\": \"color_scheme\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false,\n          \"default\": \"'environment'\"\n        },\n        \"language\": {\n          \"name\": \"language\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false,\n          \"default\": \"'en'\"\n        },\n        \"default_board\": {\n          \"name\": \"default_board\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false,\n          \"default\": \"'default'\"\n        },\n        \"first_day_of_week\": {\n          \"name\": \"first_day_of_week\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false,\n          \"default\": \"'monday'\"\n        },\n        \"search_template\": {\n          \"name\": \"search_template\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false,\n          \"default\": \"'https://google.com/search?q=%s'\"\n        },\n        \"open_search_in_new_tab\": {\n          \"name\": \"open_search_in_new_tab\",\n          \"type\": \"integer\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false,\n          \"default\": true\n        },\n        \"disable_ping_pulse\": {\n          \"name\": \"disable_ping_pulse\",\n          \"type\": \"integer\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false,\n          \"default\": false\n        },\n        \"replace_ping_with_icons\": {\n          \"name\": \"replace_ping_with_icons\",\n          \"type\": \"integer\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false,\n          \"default\": false\n        },\n        \"use_debug_language\": {\n          \"name\": \"use_debug_language\",\n          \"type\": \"integer\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false,\n          \"default\": false\n        },\n        \"auto_focus_search\": {\n          \"name\": \"auto_focus_search\",\n          \"type\": \"integer\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false,\n          \"default\": false\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"user_setting_user_id_user_id_fk\": {\n          \"name\": \"user_setting_user_id_user_id_fk\",\n          \"tableFrom\": \"user_setting\",\n          \"tableTo\": \"user\",\n          \"columnsFrom\": [\n            \"user_id\"\n          ],\n          \"columnsTo\": [\n            \"id\"\n          ],\n          \"onDelete\": \"cascade\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {},\n      \"uniqueConstraints\": {}\n    },\n    \"user\": {\n      \"name\": \"user\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"text\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"name\": {\n          \"name\": \"name\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"email\": {\n          \"name\": \"email\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"emailVerified\": {\n          \"name\": \"emailVerified\",\n          \"type\": \"integer\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"image\": {\n          \"name\": \"image\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"password\": {\n          \"name\": \"password\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"salt\": {\n          \"name\": \"salt\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"is_admin\": {\n          \"name\": \"is_admin\",\n          \"type\": \"integer\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false,\n          \"default\": false\n        },\n        \"is_owner\": {\n          \"name\": \"is_owner\",\n          \"type\": \"integer\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false,\n          \"default\": false\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {},\n      \"compositePrimaryKeys\": {},\n      \"uniqueConstraints\": {}\n    },\n    \"verificationToken\": {\n      \"name\": \"verificationToken\",\n      \"columns\": {\n        \"identifier\": {\n          \"name\": \"identifier\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"token\": {\n          \"name\": \"token\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"expires\": {\n          \"name\": \"expires\",\n          \"type\": \"integer\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {},\n      \"compositePrimaryKeys\": {\n        \"verificationToken_identifier_token_pk\": {\n          \"columns\": [\n            \"identifier\",\n            \"token\"\n          ]\n        }\n      },\n      \"uniqueConstraints\": {}\n    }\n  },\n  \"enums\": {},\n  \"_meta\": {\n    \"schemas\": {},\n    \"tables\": {},\n    \"columns\": {}\n  }\n}"
  },
  {
    "path": "drizzle/meta/0001_snapshot.json",
    "content": "{\n  \"version\": \"5\",\n  \"dialect\": \"sqlite\",\n  \"id\": \"9c8971c9-6d33-4d14-b318-b19ff9fbb88f\",\n  \"prevId\": \"32c1bc91-e69f-4e1d-b53c-9c43f2e6c9d3\",\n  \"tables\": {\n    \"account\": {\n      \"name\": \"account\",\n      \"columns\": {\n        \"userId\": {\n          \"name\": \"userId\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"type\": {\n          \"name\": \"type\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"provider\": {\n          \"name\": \"provider\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"providerAccountId\": {\n          \"name\": \"providerAccountId\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"refresh_token\": {\n          \"name\": \"refresh_token\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"access_token\": {\n          \"name\": \"access_token\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"expires_at\": {\n          \"name\": \"expires_at\",\n          \"type\": \"integer\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"token_type\": {\n          \"name\": \"token_type\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"scope\": {\n          \"name\": \"scope\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"id_token\": {\n          \"name\": \"id_token\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"session_state\": {\n          \"name\": \"session_state\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        }\n      },\n      \"indexes\": {\n        \"userId_idx\": {\n          \"name\": \"userId_idx\",\n          \"columns\": [\n            \"userId\"\n          ],\n          \"isUnique\": false\n        }\n      },\n      \"foreignKeys\": {\n        \"account_userId_user_id_fk\": {\n          \"name\": \"account_userId_user_id_fk\",\n          \"tableFrom\": \"account\",\n          \"tableTo\": \"user\",\n          \"columnsFrom\": [\n            \"userId\"\n          ],\n          \"columnsTo\": [\n            \"id\"\n          ],\n          \"onDelete\": \"cascade\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {\n        \"account_provider_providerAccountId_pk\": {\n          \"columns\": [\n            \"provider\",\n            \"providerAccountId\"\n          ]\n        }\n      },\n      \"uniqueConstraints\": {}\n    },\n    \"invite\": {\n      \"name\": \"invite\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"text\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"token\": {\n          \"name\": \"token\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"expires\": {\n          \"name\": \"expires\",\n          \"type\": \"integer\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"created_by_id\": {\n          \"name\": \"created_by_id\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        }\n      },\n      \"indexes\": {\n        \"invite_token_unique\": {\n          \"name\": \"invite_token_unique\",\n          \"columns\": [\n            \"token\"\n          ],\n          \"isUnique\": true\n        }\n      },\n      \"foreignKeys\": {\n        \"invite_created_by_id_user_id_fk\": {\n          \"name\": \"invite_created_by_id_user_id_fk\",\n          \"tableFrom\": \"invite\",\n          \"tableTo\": \"user\",\n          \"columnsFrom\": [\n            \"created_by_id\"\n          ],\n          \"columnsTo\": [\n            \"id\"\n          ],\n          \"onDelete\": \"cascade\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {},\n      \"uniqueConstraints\": {}\n    },\n    \"migrate_token\": {\n      \"name\": \"migrate_token\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"text\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"token\": {\n          \"name\": \"token\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"boards\": {\n          \"name\": \"boards\",\n          \"type\": \"integer\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"users\": {\n          \"name\": \"users\",\n          \"type\": \"integer\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"integrations\": {\n          \"name\": \"integrations\",\n          \"type\": \"integer\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"expires\": {\n          \"name\": \"expires\",\n          \"type\": \"integer\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        }\n      },\n      \"indexes\": {\n        \"migrate_token_token_unique\": {\n          \"name\": \"migrate_token_token_unique\",\n          \"columns\": [\n            \"token\"\n          ],\n          \"isUnique\": true\n        }\n      },\n      \"foreignKeys\": {},\n      \"compositePrimaryKeys\": {},\n      \"uniqueConstraints\": {}\n    },\n    \"session\": {\n      \"name\": \"session\",\n      \"columns\": {\n        \"sessionToken\": {\n          \"name\": \"sessionToken\",\n          \"type\": \"text\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"userId\": {\n          \"name\": \"userId\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"expires\": {\n          \"name\": \"expires\",\n          \"type\": \"integer\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        }\n      },\n      \"indexes\": {\n        \"user_id_idx\": {\n          \"name\": \"user_id_idx\",\n          \"columns\": [\n            \"userId\"\n          ],\n          \"isUnique\": false\n        }\n      },\n      \"foreignKeys\": {\n        \"session_userId_user_id_fk\": {\n          \"name\": \"session_userId_user_id_fk\",\n          \"tableFrom\": \"session\",\n          \"tableTo\": \"user\",\n          \"columnsFrom\": [\n            \"userId\"\n          ],\n          \"columnsTo\": [\n            \"id\"\n          ],\n          \"onDelete\": \"cascade\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {},\n      \"uniqueConstraints\": {}\n    },\n    \"user_setting\": {\n      \"name\": \"user_setting\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"text\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"user_id\": {\n          \"name\": \"user_id\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"color_scheme\": {\n          \"name\": \"color_scheme\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false,\n          \"default\": \"'environment'\"\n        },\n        \"language\": {\n          \"name\": \"language\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false,\n          \"default\": \"'en'\"\n        },\n        \"default_board\": {\n          \"name\": \"default_board\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false,\n          \"default\": \"'default'\"\n        },\n        \"first_day_of_week\": {\n          \"name\": \"first_day_of_week\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false,\n          \"default\": \"'monday'\"\n        },\n        \"search_template\": {\n          \"name\": \"search_template\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false,\n          \"default\": \"'https://google.com/search?q=%s'\"\n        },\n        \"open_search_in_new_tab\": {\n          \"name\": \"open_search_in_new_tab\",\n          \"type\": \"integer\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false,\n          \"default\": true\n        },\n        \"disable_ping_pulse\": {\n          \"name\": \"disable_ping_pulse\",\n          \"type\": \"integer\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false,\n          \"default\": false\n        },\n        \"replace_ping_with_icons\": {\n          \"name\": \"replace_ping_with_icons\",\n          \"type\": \"integer\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false,\n          \"default\": false\n        },\n        \"use_debug_language\": {\n          \"name\": \"use_debug_language\",\n          \"type\": \"integer\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false,\n          \"default\": false\n        },\n        \"auto_focus_search\": {\n          \"name\": \"auto_focus_search\",\n          \"type\": \"integer\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false,\n          \"default\": false\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {\n        \"user_setting_user_id_user_id_fk\": {\n          \"name\": \"user_setting_user_id_user_id_fk\",\n          \"tableFrom\": \"user_setting\",\n          \"tableTo\": \"user\",\n          \"columnsFrom\": [\n            \"user_id\"\n          ],\n          \"columnsTo\": [\n            \"id\"\n          ],\n          \"onDelete\": \"cascade\",\n          \"onUpdate\": \"no action\"\n        }\n      },\n      \"compositePrimaryKeys\": {},\n      \"uniqueConstraints\": {}\n    },\n    \"user\": {\n      \"name\": \"user\",\n      \"columns\": {\n        \"id\": {\n          \"name\": \"id\",\n          \"type\": \"text\",\n          \"primaryKey\": true,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"name\": {\n          \"name\": \"name\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"email\": {\n          \"name\": \"email\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"emailVerified\": {\n          \"name\": \"emailVerified\",\n          \"type\": \"integer\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"image\": {\n          \"name\": \"image\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"password\": {\n          \"name\": \"password\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"salt\": {\n          \"name\": \"salt\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": false,\n          \"autoincrement\": false\n        },\n        \"is_admin\": {\n          \"name\": \"is_admin\",\n          \"type\": \"integer\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false,\n          \"default\": false\n        },\n        \"is_owner\": {\n          \"name\": \"is_owner\",\n          \"type\": \"integer\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false,\n          \"default\": false\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {},\n      \"compositePrimaryKeys\": {},\n      \"uniqueConstraints\": {}\n    },\n    \"verificationToken\": {\n      \"name\": \"verificationToken\",\n      \"columns\": {\n        \"identifier\": {\n          \"name\": \"identifier\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"token\": {\n          \"name\": \"token\",\n          \"type\": \"text\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        },\n        \"expires\": {\n          \"name\": \"expires\",\n          \"type\": \"integer\",\n          \"primaryKey\": false,\n          \"notNull\": true,\n          \"autoincrement\": false\n        }\n      },\n      \"indexes\": {},\n      \"foreignKeys\": {},\n      \"compositePrimaryKeys\": {\n        \"verificationToken_identifier_token_pk\": {\n          \"columns\": [\n            \"identifier\",\n            \"token\"\n          ]\n        }\n      },\n      \"uniqueConstraints\": {}\n    }\n  },\n  \"enums\": {},\n  \"_meta\": {\n    \"schemas\": {},\n    \"tables\": {},\n    \"columns\": {}\n  }\n}"
  },
  {
    "path": "drizzle/meta/_journal.json",
    "content": "{\n  \"version\": \"5\",\n  \"dialect\": \"sqlite\",\n  \"entries\": [\n    {\n      \"idx\": 0,\n      \"version\": \"5\",\n      \"when\": 1695874816934,\n      \"tag\": \"0000_supreme_the_captain\",\n      \"breakpoints\": true\n    },\n    {\n      \"idx\": 1,\n      \"version\": \"5\",\n      \"when\": 1730643218521,\n      \"tag\": \"0001_brave_mimic\",\n      \"breakpoints\": true\n    }\n  ]\n}"
  },
  {
    "path": "drizzle/migrate/migrate.ts",
    "content": "// This file is used to migrate the database to the current version\n// It is run when the docker container starts\nconst Database = require('better-sqlite3');\nconst path = require('path');\nconst dotenv = require('dotenv');\nconst { drizzle } = require('drizzle-orm/better-sqlite3');\nconst { migrate } = require('drizzle-orm/better-sqlite3/migrator');\n\nconst migrationsFolder = process.argv[2] ?? '../drizzle';\n\ndotenv.config({ path: path.join(__dirname, '/../.env') });\nconst sqlite = new Database(process.env.DATABASE_URL!.replace('file:', ''));\n\nconst db = drizzle(sqlite);\n\nconst migrateDatabase = async () => {\n  await migrate(db, { migrationsFolder });\n};\n\nmigrateDatabase();\n"
  },
  {
    "path": "drizzle/migrate/package.json",
    "content": "{\n    \"license\": \"MIT\",\n    \"description\": \"This package.json is used for the migration script the dependencies are only installed within the Dockerfile.\",\n    \"scripts\": {\n        \"db:migrate\": \"tsx ./migrate.ts\"\n    },\n    \"dependencies\": {\n        \"@types/better-sqlite3\": \"^7.6.7\",\n        \"better-sqlite3\": \"8.6.0\",\n        \"drizzle-orm\": \"^0.28.6\",\n        \"dotenv\": \"^16.3.1\",\n        \"tsx\": \"4.19.1\",\n        \"typescript\": \"^5.2.2\"\n    }\n}"
  },
  {
    "path": "drizzle.config.ts",
    "content": "import 'dotenv';\nimport { type Config } from 'drizzle-kit';\n\nexport default {\n  schema: './src/server/db/schema.ts',\n  driver: 'better-sqlite',\n  out: './drizzle',\n  dbCredentials: {\n    url: process.env.DATABASE_URL!,\n  },\n} satisfies Config;\n"
  },
  {
    "path": "next-env.d.ts",
    "content": "/// <reference types=\"next\" />\n/// <reference types=\"next/image-types/global\" />\n\n// NOTE: This file should not be edited\n// see https://nextjs.org/docs/basic-features/typescript for more information.\n"
  },
  {
    "path": "next-i18next.config.js",
    "content": "const path = require('path');\n\nmodule.exports = {\n  // https://www.i18next.com/overview/configuration-options#logging\n  i18n: {\n    defaultLocale: 'en',\n    locales: [\n      'ar',\n      'cn',\n      'cr',\n      'cs',\n      'da',\n      'de',\n      'el',\n      'en',\n      'es',\n      'fr',\n      'he',\n      'hr',\n      'hu',\n      'it',\n      'ja',\n      'ko',\n      'lv',\n      'nl',\n      'no',\n      'pl',\n      'pt',\n      'ru',\n      'sk',\n      'sl',\n      'sv',\n      'tr',\n      'tw',\n      'uk',\n      'vi',\n      'et',\n      'lt',\n      'ro'\n    ],\n\n    localeDetection: false,\n  },\n  returnEmptyString: false,\n  appendNamespaceToCIMode: true,\n  reloadOnPrerender: process.env.NODE_ENV === 'development',\n  fallbackLng: 'en',\n  localePath: path.resolve('./public/locales'),\n};\n"
  },
  {
    "path": "next.config.js",
    "content": "require('./src/env');\nconst { i18n } = require('./next-i18next.config');\n\nmodule.exports = {\n  eslint: { ignoreDuringBuilds: true },\n  webpack: (config) => {\n    // for dynamic loading of auth providers\n    config.experiments = { ...config.experiments, topLevelAwait: true };\n    return config;\n  },\n  images: {\n    domains: ['cdn.jsdelivr.net'],\n  },\n  reactStrictMode: true,\n  output: 'standalone',\n  i18n,\n  transpilePackages: ['@jellyfin/sdk'],\n  redirects: async () => [\n    {\n      source: '/',\n      destination: '/board',\n      permanent: false,\n    },\n  ],\n  env: {\n    NEXTAUTH_URL_INTERNAL: process.env.NEXTAUTH_URL_INTERNAL || process.env.HOSTNAME || 'http://localhost:3000'\n  },\n};\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"homarr\",\n  \"version\": \"0.16.0\",\n  \"description\": \"Homarr - A homepage for your server.\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/ajnart/homarr\"\n  },\n  \"scripts\": {\n    \"dev\": \"next dev\",\n    \"build\": \"NEXTAUTH_SECRET=WILL_BE_OVERWRITTEN next build\",\n    \"analyze\": \"ANALYZE=true next build\",\n    \"turbo\": \"DATABASE_URL=file:WILL_BE_OVERWRITTEN.sqlite turbo build\",\n    \"start\": \"next start\",\n    \"typecheck\": \"tsc --noEmit\",\n    \"export\": \"next build && next export\",\n    \"lint\": \"next lint\",\n    \"prettier:check\": \"prettier --check \\\"**/*.{ts,tsx}\\\"\",\n    \"prettier:write\": \"prettier --write \\\"**/*.{ts,tsx}\\\"\",\n    \"test\": \"SKIP_ENV_VALIDATION=1 vitest\",\n    \"test:docker\": \"yarn run turbo build && yarn test:run && docker build . -t homarr:local-dev && docker run -p 7575:7575 --name homarr-dev homarr:local-dev\",\n    \"test:ui\": \"SKIP_ENV_VALIDATION=1 vitest --ui\",\n    \"test:run\": \"SKIP_ENV_VALIDATION=1 vitest run\",\n    \"test:coverage\": \"SKIP_ENV_VALIDATION=1 vitest run --coverage\",\n    \"docker:build\": \"turbo build && docker build . -t homarr:local-dev\",\n    \"docker:start\": \"docker run -p 7575:7575 --name homarr-development homarr:local-dev\",\n    \"db:migrate\": \"dotenv tsx drizzle/migrate/migrate.ts ./drizzle\",\n    \"db:add\": \"drizzle-kit generate:sqlite --config ./drizzle.config.ts\"\n  },\n  \"dependencies\": {\n    \"@ctrl/deluge\": \"^4.1.0\",\n    \"@ctrl/qbittorrent\": \"^6.0.0\",\n    \"@ctrl/shared-torrent\": \"^4.1.1\",\n    \"@ctrl/transmission\": \"^4.1.1\",\n    \"@emotion/react\": \"^11.10.6\",\n    \"@emotion/server\": \"^11.10.0\",\n    \"@jellyfin/sdk\": \"^0.8.0\",\n    \"@mantine/core\": \"^6.0.0\",\n    \"@mantine/dates\": \"^6.0.0\",\n    \"@mantine/form\": \"^6.0.0\",\n    \"@mantine/hooks\": \"^6.0.0\",\n    \"@mantine/modals\": \"^6.0.0\",\n    \"@mantine/next\": \"^6.0.0\",\n    \"@mantine/notifications\": \"^6.0.0\",\n    \"@mantine/prism\": \"^6.0.19\",\n    \"@mantine/tiptap\": \"^6.0.17\",\n    \"@nivo/core\": \"^0.83.0\",\n    \"@nivo/line\": \"^0.83.0\",\n    \"@t3-oss/env-nextjs\": \"^0.7.1\",\n    \"@tabler/icons-react\": \"^2.20.0\",\n    \"@tanstack/react-query\": \"^4.2.1\",\n    \"@tanstack/react-query-devtools\": \"^4.24.4\",\n    \"@tiptap/extension-color\": \"^2.1.12\",\n    \"@tiptap/extension-highlight\": \"^2.1.12\",\n    \"@tiptap/extension-image\": \"^2.1.12\",\n    \"@tiptap/extension-link\": \"^2.1.12\",\n    \"@tiptap/extension-table\": \"^2.1.12\",\n    \"@tiptap/extension-table-cell\": \"^2.1.12\",\n    \"@tiptap/extension-table-header\": \"^2.1.12\",\n    \"@tiptap/extension-table-row\": \"^2.1.12\",\n    \"@tiptap/extension-task-item\": \"^2.1.12\",\n    \"@tiptap/extension-task-list\": \"^2.1.12\",\n    \"@tiptap/extension-text-align\": \"^2.1.12\",\n    \"@tiptap/extension-text-style\": \"^2.1.12\",\n    \"@tiptap/extension-underline\": \"^2.1.12\",\n    \"@tiptap/pm\": \"^2.1.12\",\n    \"@tiptap/react\": \"^2.1.12\",\n    \"@tiptap/starter-kit\": \"^2.1.12\",\n    \"@trpc/client\": \"^10.37.1\",\n    \"@trpc/next\": \"^10.37.1\",\n    \"@trpc/react-query\": \"^10.37.1\",\n    \"@trpc/server\": \"^10.37.1\",\n    \"@types/bcryptjs\": \"^2.4.2\",\n    \"@vitejs/plugin-react\": \"^4.0.0\",\n    \"adm-zip\": \"^0.5.15\",\n    \"axios\": \"^1.0.0\",\n    \"bcryptjs\": \"^2.4.3\",\n    \"better-sqlite3\": \"^12.6.2\",\n    \"consola\": \"^3.0.0\",\n    \"cookies\": \"^0.8.0\",\n    \"cookies-next\": \"^2.1.1\",\n    \"dayjs\": \"^1.11.7\",\n    \"dockerode\": \"^3.3.2\",\n    \"dotenv\": \"^16.3.1\",\n    \"drizzle-kit\": \"^0.19.13\",\n    \"drizzle-orm\": \"^0.28.6\",\n    \"drizzle-zod\": \"^0.5.1\",\n    \"fily-publish-gridstack\": \"^0.0.13\",\n    \"flag-icons\": \"^6.9.2\",\n    \"framer-motion\": \"^10.0.0\",\n    \"generate-password\": \"^1.7.0\",\n    \"html-entities\": \"^2.3.3\",\n    \"i18next\": \"^22.5.1\",\n    \"immer\": \"^10.0.2\",\n    \"js-file-download\": \"^0.4.12\",\n    \"ldapjs\": \"^3.0.5\",\n    \"mantine-react-table\": \"^1.3.4\",\n    \"next\": \"13.5.11\",\n    \"next-auth\": \"^4.23.0\",\n    \"next-i18next\": \"^14.0.0\",\n    \"nextjs-cors\": \"^2.2.0\",\n    \"nzbget-api\": \"^0.0.3\",\n    \"prismjs\": \"^1.29.0\",\n    \"react\": \"^18.2.0\",\n    \"react-dom\": \"^18.2.0\",\n    \"react-i18next\": \"^12.3.1\",\n    \"react-simple-code-editor\": \"^0.13.1\",\n    \"rss-parser\": \"^3.12.0\",\n    \"sabnzbd-api\": \"^1.5.0\",\n    \"swagger-ui-react\": \"^5.11.0\",\n    \"tldts\": \"^6.1.18\",\n    \"trpc-openapi\": \"^1.2.0\",\n    \"uuid\": \"^9.0.0\",\n    \"xml-js\": \"^1.6.11\",\n    \"xss\": \"^1.0.14\",\n    \"zod\": \"^3.21.4\",\n    \"zustand\": \"^4.3.7\"\n  },\n  \"devDependencies\": {\n    \"@next/bundle-analyzer\": \"^13.0.0\",\n    \"@next/eslint-plugin-next\": \"^13.4.5\",\n    \"@testing-library/react\": \"^14.0.0\",\n    \"@trivago/prettier-plugin-sort-imports\": \"^4.2.0\",\n    \"@types/adm-zip\": \"^0.5.5\",\n    \"@types/better-sqlite3\": \"^7.6.5\",\n    \"@types/cookies\": \"^0.7.7\",\n    \"@types/dockerode\": \"^3.3.9\",\n    \"@types/ldapjs\": \"^3.0.2\",\n    \"@types/node\": \"^20.6.0\",\n    \"@types/prismjs\": \"^1.26.0\",\n    \"@types/react\": \"^18.2.11\",\n    \"@types/swagger-ui-react\": \"^4.18.3\",\n    \"@types/umami\": \"^0.1.4\",\n    \"@types/uuid\": \"^9.0.0\",\n    \"@types/video.js\": \"^7.3.51\",\n    \"@typescript-eslint/eslint-plugin\": \"^6.0.0\",\n    \"@typescript-eslint/parser\": \"^6.0.0\",\n    \"@vitest/coverage-c8\": \"^0.33.0\",\n    \"@vitest/coverage-v8\": \"^0.34.5\",\n    \"@vitest/ui\": \"^0.34.4\",\n    \"dotenv-cli\": \"^7.3.0\",\n    \"eslint\": \"^8.0.1\",\n    \"eslint-config-next\": \"^13.4.5\",\n    \"eslint-plugin-promise\": \"^6.0.0\",\n    \"eslint-plugin-react\": \"latest\",\n    \"eslint-plugin-react-hooks\": \"^4.6.0\",\n    \"eslint-plugin-testing-library\": \"^5.5.1\",\n    \"eslint-plugin-unused-imports\": \"^3.0.0\",\n    \"eslint-plugin-vitest\": \"^0.2.0\",\n    \"happy-dom\": \"^10.0.0\",\n    \"node-mocks-http\": \"^1.12.2\",\n    \"prettier\": \"^3.0.0\",\n    \"sass\": \"^1.56.1\",\n    \"tsx\": \"4.19.1\",\n    \"turbo\": \"^1.10.12\",\n    \"typescript\": \"5.1.6\",\n    \"video.js\": \"^8.0.3\",\n    \"vite-tsconfig-paths\": \"^4.2.0\",\n    \"vitest\": \"^0.33.0\",\n    \"vitest-fetch-mock\": \"^0.2.2\"\n  },\n  \"nextBundleAnalysis\": {\n    \"budget\": null,\n    \"budgetPercentIncreaseRed\": 20,\n    \"minimumChangeThreshold\": 0,\n    \"showDetails\": true\n  },\n  \"prettier\": {\n    \"printWidth\": 100,\n    \"tabWidth\": 2,\n    \"parser\": \"typescript\",\n    \"singleQuote\": true,\n    \"trailingComma\": \"es5\",\n    \"useTabs\": false,\n    \"endOfLine\": \"lf\",\n    \"importOrder\": [\n      \"^@core/(.*)$\",\n      \"^@server/(.*)$\",\n      \"^@ui/(.*)$\",\n      \"^[./]\"\n    ],\n    \"importOrderSeparation\": true,\n    \"plugins\": [\n      \"@trivago/prettier-plugin-sort-imports\"\n    ],\n    \"importOrderSortSpecifiers\": true\n  },\n  \"eslintConfig\": {\n    \"ignoreDuringBuilds\": true,\n    \"extends\": [\n      \"next\",\n      \"eslint:recommended\",\n      \"plugin:@next/next/recommended\",\n      \"plugin:react-hooks/recommended\",\n      \"plugin:react/recommended\",\n      \"plugin:@typescript-eslint/recommended\",\n      \"plugin:vitest/recommended\"\n    ],\n    \"plugins\": [\n      \"testing-library\",\n      \"unused-imports\",\n      \"react\",\n      \"vitest\"\n    ],\n    \"overrides\": [\n      {\n        \"files\": [\n          \"**/?(*.)+(spec|test).[jt]s?(x)\"\n        ],\n        \"extends\": [\n          \"plugin:testing-library/react\"\n        ]\n      }\n    ],\n    \"parser\": \"@typescript-eslint/parser\",\n    \"parserOptions\": {\n      \"project\": \"./tsconfig.json\"\n    },\n    \"rules\": {\n      \"import/no-cycle\": \"off\",\n      \"react/react-in-jsx-scope\": \"off\",\n      \"react/no-children-prop\": \"off\",\n      \"@typescript-eslint/no-unused-vars\": \"off\",\n      \"@typescript-eslint/no-unused-imports\": \"off\",\n      \"@typescript-eslint/no-unused-expressions\": \"off\",\n      \"@typescript-eslint/no-explicit-any\": \"off\",\n      \"@typescript-eslint/no-shadow\": \"off\",\n      \"@typescript-eslint/no-use-before-define\": \"off\",\n      \"@typescript-eslint/no-non-null-assertion\": \"off\",\n      \"no-continue\": \"off\",\n      \"linebreak-style\": 0,\n      \"import/extensions\": \"off\",\n      \"vitest/max-nested-describe\": [\n        \"error\",\n        {\n          \"max\": 3\n        }\n      ],\n      \"testing-library/no-node-access\": [\n        \"error\",\n        {\n          \"allowContainerFirstChild\": true\n        }\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "public/locales/en/authentication/invite.json",
    "content": "{\n    \"metaTitle\": \"Create Account\",\n    \"title\": \"Create Account\",\n    \"text\": \"Please define your credentials below\",\n    \"form\": {\n        \"fields\": {\n            \"username\": {\n                \"label\": \"Username\"\n            },\n            \"password\": {\n                \"label\": \"Password\"\n            },\n            \"passwordConfirmation\": {\n                \"label\": \"Confirm password\"\n            }\n        },\n        \"buttons\": {\n            \"submit\": \"Create account\"\n        }\n    },\n    \"notifications\": {\n        \"loading\": {\n            \"title\": \"Creating account\",\n            \"text\": \"Please wait\"\n        },\n        \"success\": {\n            \"title\": \"Account created\",\n            \"text\": \"Your account has been created successfully\"\n        },\n        \"error\": {\n            \"title\": \"Error\",\n            \"text\": \"Something went wrong, got the following error: {{error}}\"\n        }\n    }\n}"
  },
  {
    "path": "public/locales/en/authentication/login.json",
    "content": "{\n  \"metaTitle\": \"Login\",\n  \"title\": \"Welcome back!\",\n  \"text\": \"Please enter your credentials\",\n  \"form\": {\n    \"fields\": {\n      \"username\": {\n        \"label\": \"Username\"\n      },\n      \"password\": {\n        \"label\": \"Password\"\n      }\n    },\n    \"buttons\": {\n      \"submit\": \"Sign in\"\n    },\n    \"afterLoginRedirection\": \"After login, you'll be redirected to {{url}}\",\n    \"providersEmpty\": {\n      \"title\": \"Auth Provider Error\",\n      \"message\": \"The provider(s) are unset, please check your logs for more information.\"\n    }\n  },\n  \"alert\": \"Your credentials are incorrect or this account doesn't exist. Please try again.\"\n}"
  },
  {
    "path": "public/locales/en/boards/common.json",
    "content": "{\n    \"header\": {\n        \"customize\": \"Customize board\"\n    }\n}"
  },
  {
    "path": "public/locales/en/boards/customize.json",
    "content": "{\n    \"metaTitle\": \"Customize {{name}} Board\",\n    \"pageTitle\": \"Customization for {{name}} Board\",\n    \"backToBoard\": \"Back to board\",\n    \"settings\": {\n        \"appearance\": {\n            \"primaryColor\": \"Primary color\",\n            \"secondaryColor\": \"Secondary color\"\n        }\n    },\n    \"save\": {\n        \"button\": \"Save changes\",\n        \"note\": \"Careful, you have unsaved changes!\"\n    },\n    \"notifications\": {\n        \"pending\": {\n            \"title\": \"Saving customization\",\n            \"message\": \"Please wait while we save your customization\"\n        },\n        \"success\": {\n            \"title\": \"Customization saved\",\n            \"message\": \"Your customization has been saved successfully\"\n        },\n        \"error\": {\n            \"title\": \"Error\",\n            \"message\": \"Unable to save changes\"\n        }\n    }\n}"
  },
  {
    "path": "public/locales/en/common.json",
    "content": "{\n  \"save\": \"Save\",\n  \"apply\": \"Apply\",\n  \"insert\": \"Insert\",\n  \"about\": \"About\",\n  \"cancel\": \"Cancel\",\n  \"close\": \"Close\",\n  \"back\": \"Back\",\n  \"delete\": \"Delete\",\n  \"ok\": \"OK\",\n  \"edit\": \"Edit\",\n  \"next\": \"Next\",\n  \"previous\": \"Previous\",\n  \"confirm\": \"Confirm\",\n  \"enabled\": \"Enabled\",\n  \"duplicate\": \"Duplicate\",\n  \"disabled\": \"Disabled\",\n  \"enableAll\": \"Enable all\",\n  \"disableAll\": \"Disable all\",\n  \"setTimer\": \"Set timer\",\n  \"version\": \"Version\",\n  \"changePosition\": \"Change position\",\n  \"remove\": \"Remove\",\n  \"removeConfirm\": \"Are you sure that you want to remove {{item}}?\",\n  \"createItem\": \"+ create {{item}}\",\n  \"sections\": {\n    \"settings\": \"Settings\",\n    \"dangerZone\": \"Danger zone\"\n  },\n  \"secrets\": {\n    \"apiKey\": \"API key\",\n    \"username\": \"Username\",\n    \"password\": \"Password\"\n  },\n  \"tip\": \"Tip: \",\n  \"time\": {\n    \"seconds\": \"seconds\",\n    \"minutes\": \"minutes\",\n    \"hours\": \"hours\"\n  },\n  \"loading\": \"Loading...\",\n  \"breakPoints\": {\n    \"small\": \"small\",\n    \"medium\": \"medium\",\n    \"large\": \"large\"\n  },\n  \"seeMore\": \"See more...\",\n  \"position\": {\n    \"left\": \"Left\",\n    \"center\": \"Center\",\n    \"right\": \"Right\"\n  },\n  \"attributes\": {\n    \"width\": \"Width\",\n    \"height\": \"Height\"\n  },\n  \"public\": \"Public\",\n  \"restricted\": \"Restricted\"\n}"
  },
  {
    "path": "public/locales/en/layout/common.json",
    "content": "{\n  \"modals\": {\n    \"blockedPopups\": {\n      \"title\": \"Popups blocked\",\n      \"text\": \"Your browser has blocked Homarr from accessing it's API. This is most commonly caused by AdBlockers or denied permissions. Homarr is unable to request permissions automatically.\",\n      \"list\": {\n        \"browserPermission\": \"Click on the icon besides the URL and check the permisions. Allow Popups and windows\",\n        \"adBlockers\": \"Disable ad blockers and security tools from your browser\",\n        \"otherBrowser\": \"Try a different browser\"\n      }\n    }\n  },\n  \"actions\": {\n    \"category\": {\n      \"openAllInNewTab\": \"Open all in new tab\"\n    }\n  },\n  \"menu\": {\n    \"moveUp\": \"Move up\",\n    \"moveDown\": \"Move down\",\n    \"addCategory\": \"Add category {{location}}\",\n    \"addAbove\": \"above\",\n    \"addBelow\": \"below\"\n  }\n}"
  },
  {
    "path": "public/locales/en/layout/element-selector/selector.json",
    "content": "{\n  \"modal\": {\n    \"title\": \"Add a new tile\",\n    \"text\": \"Tiles are the main element of Homarr. They are used to display your apps and other information. You can add as many tiles as you want.\"\n  },\n  \"widgetDescription\": \"Widgets interact with your apps, to provide you with more control over your applications. They usually require additional configuration before use.\",\n  \"goBack\": \"Go back to the previous step\",\n  \"actionIcon\": {\n    \"tooltip\": \"Add a tile\"\n  },\n  \"apps\": \"Apps\",\n  \"app\": {\n    \"defaultName\": \"Your App\"\n  },\n  \"widgets\": \"Widgets\",\n  \"categories\": \"Categories\",\n  \"category\": {\n    \"newName\": \"Name of new category\",\n    \"defaultName\": \"New Category\",\n    \"created\": {\n      \"title\": \"Category created\",\n      \"message\": \"The category \\\"{{name}}\\\" has been created\"\n    }\n  },\n  \"importFromDocker\": \"Import from docker\"\n}\n"
  },
  {
    "path": "public/locales/en/layout/errors/access-denied.json",
    "content": "{\n  \"title\": \"Access denied\",\n  \"text\": \"You do not have sufficient permissions to access this page. If you believe, that this is not intentional, please contact your administrator.\",\n  \"switchAccount\": \"Switch to a different account\"\n}"
  },
  {
    "path": "public/locales/en/layout/errors/not-found.json",
    "content": "{\n    \"title\": \"Page not found\",\n    \"text\": \"This page could not be found. The URL for this page may have expired, the URL is invalid or you do now have the required permissions to access this resource.\",\n    \"button\": \"Go to Home\"\n}"
  },
  {
    "path": "public/locales/en/layout/header/actions/toggle-edit-mode.json",
    "content": "{\n    \"description\": \"In Edit Mode, you can adjust tiles and configure apps. Changes are not saved until you exit Edit Mode.\",\n    \"button\": {\n        \"disabled\": \"Enter Edit Mode\",\n        \"enabled\": \"Exit and Save\"\n    },\n    \"popover\": {\n        \"title\": \"Edit mode is enabled for  <1>{{size}}</1> size\",\n        \"text\": \"You can adjust and configure your apps now. Changes are <strong>not saved</strong> until you exit edit mode\"\n    },\n    \"unloadEvent\": \"Exit the edit mode to save your changes\"\n}\n"
  },
  {
    "path": "public/locales/en/layout/header.json",
    "content": "{\n    \"search\": {\n        \"label\": \"Search\",\n        \"engines\": {\n            \"web\": \"Search for {{query}} on the web\",\n            \"youtube\": \"Search for {{query}} on YouTube\",\n            \"torrent\": \"Search for {{query}} torrents\",\n            \"movie\": \"Search for {{query}} on {{app}}\"\n        }\n    },\n    \"actions\": {\n        \"avatar\": {\n            \"switchTheme\": \"Switch theme\",\n            \"preferences\": \"User preferences\",\n            \"defaultBoard\": \"Default dashboard\",\n            \"manage\": \"Manage\",\n            \"logout\": \"Logout from {{username}}\",\n            \"login\": \"Login\"\n        }\n    },\n    \"modals\": {\n        \"movie\": {\n            \"title\": \"\",\n            \"topResults\": \"Top {{count}} results for <b>{{search}}</b>.\"\n        }\n    }\n}"
  },
  {
    "path": "public/locales/en/layout/manage.json",
    "content": "{\n    \"navigation\": {\n        \"home\": {\n            \"title\": \"Home\"\n        },\n        \"boards\": {\n            \"title\": \"Boards\"\n        },\n        \"users\": {\n            \"title\": \"Users\",\n            \"items\": {\n                \"manage\": \"Manage\",\n                \"invites\": \"Invites\"\n            }\n        },\n        \"help\": {\n            \"title\": \"Help\",\n            \"items\": {\n                \"documentation\": \"Documentation\",\n                \"report\": \"Report an issue / bug\",\n                \"discord\": \"Community Discord\",\n                \"contribute\": \"Contribute\"\n            }\n        },\n        \"tools\": {\n            \"title\": \"Tools\",\n            \"items\": {\n                \"docker\": \"Docker\",\n                \"api\": \"API\",\n                \"migrate\": \"Migrate to 1.0\"\n            }\n        },\n        \"about\": {\n            \"title\": \"About\"\n        }\n    }\n}"
  },
  {
    "path": "public/locales/en/layout/mobile/drawer.json",
    "content": "{\n  \"title\": \"{{position}} sidebar\"\n}\n"
  },
  {
    "path": "public/locales/en/layout/modals/about.json",
    "content": "{\n\t\"description\": \"Homarr is a <strong>sleek</strong>, <strong>modern</strong> dashboard that puts all of your apps and services at your fingertips. With Homarr, you can access and control everything in one convenient location. Homarr seamlessly integrates with the apps you've added, providing you with valuable information and giving you complete control. Installation is a breeze, and Homarr supports a wide range of deployment methods.\",\n\t\"addToDashboard\": \"Add to Dashboard\",\n\t\"tip\": \"Mod refers to your modifier key, it is Ctrl and Command/Super/Windows key\",\n\t\"key\": \"Shortcut key\",\n\t\"action\": \"Action\",\n\t\"keybinds\": \"Keybinds\",\n\t\"translators\": \"Translators ({{count}})\",\n\t\"translatorsDescription\": \"Thanks to these people, Homarr is available in {{languages}} languages! Want to help translate Homarr into your language? Read how to do so <a>here</a>.\",\n\t\"contributors\": \"Contributors ({{count}})\",\n\t\"contributorsDescription\": \"These people have built the code that makes homarr work! Want to help build Homarr? Read how to do so <a>here</a>\",\n\t\"actions\": {\n\t\t\"toggleTheme\": \"Toggle light/dark mode\",\n\t\t\"focusSearchBar\": \"Focus on search bar\",\n\t\t\"openDocker\": \"Open docker Widget\",\n\t\t\"toggleEdit\": \"Toggle Edit Mode\"\n\t},\n\t\"metrics\": {\n\t\t\"configurationSchemaVersion\": \"Configuration schema version\",\n\t\t\"version\": \"Version\",\n\t\t\"nodeEnvironment\": \"Node environment\",\n\t\t\"i18n\": \"Loaded I18n translation namespaces\",\n\t\t\"locales\": \"Configured I18n locales\",\n\t\t\"experimental_disableEditMode\": \"<b>EXPERIMENTAL</b>: Disable edit mode\"\n\t},\n\t\"version\": {\n\t\t\"new\": \"New: {{newVersion}}\",\n\t\t\"dropdown\": \"Version {{newVersion}} is available! Current Version is {{currentVersion}}\"\n\t}\n}"
  },
  {
    "path": "public/locales/en/layout/modals/add-app.json",
    "content": "{\n\t\"tabs\": {\n\t\t\"general\": \"General\",\n\t\t\"behaviour\": \"Behavior\",\n\t\t\"network\": \"Network\",\n\t\t\"appearance\": \"Appearance\",\n\t\t\"integration\": \"Integration\"\n\t},\n\t\"general\": {\n\t\t\"appname\": {\n\t\t\t\"label\": \"App name\",\n\t\t\t\"description\": \"Used to display the app on the dashboard.\"\n\t\t},\n\t\t\"internalAddress\": {\n\t\t\t\"label\": \"Internal address\",\n\t\t\t\"description\": \"Internal IP-address of the app.\",\n\t\t\t\"troubleshoot\": {\n\t\t\t\t\"label\": \"Having issues?\",\n\t\t\t\t\"header\": \"Here is a list of commonly made mistake and troubleshooting:\",\n\t\t\t\t\"lines\": {\n\t\t\t\t\t\"nothingAfterPort\": \"You should, in most if not all cases, not input any path after the port. (Even the '/admin' for pihole or '/web' for plex)\",\n\t\t\t\t\t\"protocolCheck\": \"Always make sure that the URL is preceded by http or https, and to make sure you are using the right one.\",\n\t\t\t\t\t\"preferIP\": \"It is recommended to use the direct ip of the machine or container you are trying to communicate with.\",\n\t\t\t\t\t\"enablePings\": \"Check that the IP is right by enabling pings. Customize Board -> Layout -> Enable pings. A little red or green bubble will appear on your app tiles and hovering it will give you it's response code (A green bubble with code 200 is expected in most cases).\",\n\t\t\t\t\t\"wget\": \"To make sure that homarr can communicate with the other apps, make sure to wget/curl/ping the app's IP:port.\",\n\t\t\t\t\t\"iframe\": \"When it comes to iframes, those should always be using the same protocol (http/s) as Homarr.\",\n\t\t\t\t\t\"clearCache\": \"Some informations are registered in cache, so an integration might not work unless you clear the cache in Homarr's general options.\"\n\t\t\t\t},\n\t\t\t\t\"footer\": \"For more troubleshooting, reach out on our {{discord}}.\"\n\t\t\t}\n\t\t},\n\t\t\"externalAddress\": {\n\t\t\t\"label\": \"External address\",\n\t\t\t\"description\": \"URL that will be opened when clicking on the app.\",\n\t\t\t\"tooltip\": \"You can use a few variables to create dynamic addresses:<br><br><b>[homarr_base]</b> : full address excluding port and path. <i>(Example: 'https://subdomain.homarr.dev')</i><br><b>[homarr_hostname]</b> : full base url including it's current subdomain. <i>(Example: 'subdomain.homarr.dev')</i><br><b>[homarr_domain]</b> : domain with subdomain filtered out. <i>(Example: `homarr.dev')</i><br><b>[homarr_protocol]</b> : <i>http/https</i><br><br>These variables all depend on the current url.\"\n\t\t}\n\t},\n\t\"behaviour\": {\n\t\t\"isOpeningNewTab\": {\n\t\t\t\"label\": \"Open in new tab\",\n\t\t\t\"description\": \"Open the app in a new tab instead of the current one.\"\n\t\t},\n\t\t\"tooltipDescription\": {\n\t\t\t\"label\": \"Application Description\",\n\t\t\t\"description\": \"The text you enter will appear when hovering over your app.\\r\\nUse this to give users more details about your app or leave empty to have nothing.\"\n\t\t},\n\t\t\"customProtocolWarning\": \"Using a non-standard protocol. This may require pre-installed applications and can introduce security risks. Ensure that your address is secure and trusted.\"\n\t},\n\t\"network\": {\n\t\t\"statusChecker\": {\n\t\t\t\"label\": \"Status checker\",\n\t\t\t\"description\": \"Checks if your app is online using a simple HTTP(S) request.\"\n\t\t},\n\t\t\"statusCodes\": {\n\t\t\t\"label\": \"HTTP status codes\",\n\t\t\t\"description\": \"The HTTP status codes that are considered as online.\"\n\t\t}\n\t},\n\t\"appearance\": {\n\t\t\"icon\": {\n\t\t\t\"label\": \"App Icon\",\n\t\t\t\"description\": \"Start typing to find an icon. You can also paste an image URL to use a custom icon.\",\n\t\t\t\"autocomplete\": {\n\t\t\t\t\"title\": \"No results found\",\n\t\t\t\t\"text\": \"Try to use a more specific search term. If you can't find your desired icon, paste the image URL above for a custom icon\"\n\t\t\t},\n\t\t\t\"noItems\": {\n\t\t\t\t\"title\": \"Loading external icons\",\n\t\t\t\t\"text\": \"This may take a few seconds\"\n\t\t\t}\n\t\t},\n\t\t\"appNameFontSize\": {\n\t\t\t\"label\": \"App Name Font Size\",\n\t\t\t\"description\": \"Set the font size for when the app name is shown on the tile.\"\n\t\t},\n\t\t\"appNameStatus\": {\n\t\t\t\"label\": \"App Name Status\",\n\t\t\t\"description\": \"Choose where you want the title to show up, if at all.\",\n\t\t\t\"dropdown\": {\n\t\t\t\t\"normal\": \"Show title on tile only\",\n\t\t\t\t\"hover\": \"Show title on tooltip hover only\",\n\t\t\t\t\"hidden\": \"Don't show at all\"\n\t\t\t}\n\t\t},\n\t\t\"positionAppName\": {\n\t\t\t\"label\": \"App Name Position\",\n\t\t\t\"description\": \"Position of the app's name relative to the icon.\",\n\t\t\t\"dropdown\": {\n\t\t\t\t\"top\": \"Top\",\n\t\t\t\t\"right\": \"Right\",\n\t\t\t\t\"bottom\": \"Bottom\",\n\t\t\t\t\"left\": \"Left\"\n\t\t\t}\n\t\t},\n\t\t\"lineClampAppName\": {\n\t\t\t\"label\": \"App Name Line Clamp\",\n\t\t\t\"description\": \"Defines on how many lines your title should fit at it's maximum. Set 0 for unlimited.\"\n\t\t}\n\t},\n\t\"integration\": {\n\t\t\"type\": {\n\t\t\t\"label\": \"Integration configuration\",\n\t\t\t\"description\": \"The integration configuration that will be used to connect to your app.\",\n\t\t\t\"placeholder\": \"Select an integration\",\n\t\t\t\"defined\": \"Defined\",\n\t\t\t\"undefined\": \"Undefined\",\n\t\t\t\"public\": \"Public\",\n\t\t\t\"private\": \"Private\",\n\t\t\t\"explanationPrivate\": \"A private secret will be sent to the server only once. Once your browser has refreshed the page, it will never be sent again.\",\n\t\t\t\"explanationPublic\": \"A public secret will always be sent to the client and is accessible over the API. It should not contain any confidential values such as usernames, passwords, tokens, certificates and similar!\"\n\t\t},\n\t\t\"secrets\": {\n\t\t\t\"description\": \"To update a secret, enter a value and click the save button. To remove a secret, use the clear button.\",\n\t\t\t\"warning\": \"Your credentials act as the access for your integrations and you should <strong>never</strong> share them with anybody else. The Homarr team will never ask for credentials. Make sure to <strong>store and manage your secrets safely</strong>.\",\n\t\t\t\"clear\": \"Clear secret\",\n\t\t\t\"save\": \"Save secret\",\n\t\t\t\"update\": \"Update secret\"\n\t\t}\n\t},\n\t\"validation\": {\n\t\t\"popover\": \"Your form contains invalid data. Hence, it can't be saved. Please resolve all issues and click this button again to save your changes\",\n\t\t\"name\": \"Name is required\",\n\t\t\"noUrl\": \"Url is required\",\n\t\t\"invalidUrl\": \"Value is not a valid url\",\n\t\t\"noIconUrl\": \"This field is required\",\n\t\t\"noExternalUri\": \"External URI is required\",\n\t\t\"invalidExternalUri\": \"External URI is not a valid uri\"\n\t}\n}\n"
  },
  {
    "path": "public/locales/en/layout/modals/change-position.json",
    "content": "{\n\t\"xPosition\": \"X-axis position\",\n\t\"width\": \"Width\",\n\t\"height\": \"Height\",\n\t\"yPosition\": \"Y-axis position\",\n\t\"zeroOrHigher\": \"0 or higher\",\n\t\"betweenXandY\": \"Between {{min}} and {{max}}\"\n}"
  },
  {
    "path": "public/locales/en/manage/boards.json",
    "content": "{\n    \"metaTitle\": \"Boards\",\n    \"pageTitle\": \"Boards\",\n    \"cards\": {\n        \"statistics\": {\n            \"apps\": \"Apps\",\n            \"widgets\": \"Widgets\",\n            \"categories\": \"Categories\"\n        },\n        \"buttons\": {\n            \"view\": \"View board\"\n        },\n        \"menu\": {\n            \"setAsDefault\": \"Set as your default board\",\n            \"delete\": {\n                \"label\": \"Delete permanently\",\n                \"disabled\": \"Deletion disabled, because older Homarr components do not allow the deletion of the default config. Deletion will be possible in the future.\"\n            },\n            \"duplicate\": \"Duplicate\",\n            \"rename\": {\n                \"label\": \"Rename\",\n                \"modal\": {\n                    \"title\": \"Rename board {{name}}\",\n                    \"fields\": {\n                        \"name\": {\n                            \"label\": \"New name\",\n                            \"placeholder\": \"New board name\"\n                        }\n                    }\n                }\n            }\n        },\n        \"badges\": {\n            \"fileSystem\": \"File system\",\n            \"default\": \"Default\"\n        }\n    },\n    \"buttons\": {\n        \"create\": \"Create new board\"\n    },\n    \"modals\": {\n        \"delete\": {\n            \"title\": \"Delete board\",\n            \"text\": \"Are you sure, that you want to delete this board? This action cannot be undone and your data will be lost permanently.\"\n        },\n        \"create\": {\n            \"title\": \"Create board\",\n            \"text\": \"The name cannot be changed after a board has been created.\",\n            \"form\": {\n                \"name\": {\n                    \"label\": \"Name\"\n                },\n                \"submit\": \"Create\"\n            }\n        }\n    }\n}"
  },
  {
    "path": "public/locales/en/manage/index.json",
    "content": "{\n    \"metaTitle\": \"Manage\",\n    \"hero\": {\n        \"title\": \"Welcome back, {{username}}\",\n        \"fallbackUsername\": \"Anonymous\",\n        \"subtitle\": \"Welcome to Your Application Hub. Organize, Optimize and Conquer!\"\n    },\n    \"quickActions\": {\n        \"title\": \"Quick actions\",\n        \"boards\": {\n            \"title\": \"Your boards\",\n            \"subtitle\": \"Create and manage your boards\"\n        },\n        \"inviteUsers\": {\n            \"title\": \"Invite a new user\",\n            \"subtitle\": \"Create and send an invitation for registration\"\n        },\n        \"manageUsers\": {\n            \"title\": \"Manage users\",\n            \"subtitle\": \"Delete and manage your users\"\n        }\n    }\n}"
  },
  {
    "path": "public/locales/en/manage/migrate.json",
    "content": "{\n    \"metaTitle\": \"Migrate to 1.0\",\n    \"pageTitle\": \"Migrate boards, integrations and users\",\n    \"description\": \"Exports your boards and users to a ZIP-Archive to migrate them to Homarr after version 1.0.0\",\n    \"securityNote\": {\n        \"title\": \"Security Note\",\n        \"text\": \"When exporting users and integrations it will also open a modal with an encryption key. This key is required to import the data into Homarr. Keep it safe and do not share it with anyone.\"\n    },\n    \"form\": {\n        \"label\": \"Select everything you want to export\",\n        \"option\": {\n            \"boards\": {\n                \"label\": \"Export boards\"\n            },\n            \"integrations\": {\n                \"label\": \"Export integrations\",\n                \"description\": \"This will include encrypted credentials for integrations. Only available when exporting boards\"\n            },\n            \"users\": {\n                \"label\": \"Export users\",\n                \"description\": \"This will only export credential users, passwords hash and salt are encrypted\"\n            }\n        }\n    },\n    \"action\": {\n        \"export\": \"Export data\"\n    },\n    \"modal\": {\n        \"title\": \"Encryption key\",\n        \"description\": \"Your data has been exported. Keep this key safe and do not share it with anyone. You will need this key to import the data into Homarr.\",\n        \"copyDismiss\": \"Copy & dismiss\"\n    }\n}"
  },
  {
    "path": "public/locales/en/manage/users/create.json",
    "content": "{\n    \"metaTitle\": \"Create user\",\n    \"steps\": {\n        \"account\": {\n            \"title\": \"First step\",\n            \"text\": \"Create account\",\n            \"username\": {\n                \"label\": \"Username\"\n            },\n            \"email\": {\n                \"label\": \"E-Mail\"\n            }\n        },\n        \"security\": {\n            \"title\": \"Second step\",\n            \"text\": \"Password\",\n            \"password\": {\n                \"label\": \"Password\"\n            }\n        },\n        \"finish\": {\n            \"title\": \"Confirmation\",\n            \"text\": \"Save to database\",\n            \"card\": {\n                \"title\": \"Review your inputs\",\n                \"text\": \"After you submit your data to the database, the user will be able to log in. Are you sure that you want to store this user in the database and activate the login?\"\n            },\n            \"table\": {\n                \"header\": {\n                    \"property\": \"Property\",\n                    \"value\": \"Value\",\n                    \"username\": \"Username\",\n                    \"email\": \"E-Mail\",\n                    \"password\": \"Password\"\n                },\n                \"notSet\": \"Not set\",\n                \"valid\": \"Valid\"\n            },\n            \"failed\": \"User creation has failed: {{error}}\"\n        },\n        \"completed\": {\n            \"alert\": {\n                \"title\": \"User was created\",\n                \"text\": \"The user was created in the database. They can now log in.\"\n            }\n        }\n    },\n    \"buttons\": {\n        \"generateRandomPassword\": \"Generate random\",\n        \"createAnother\": \"Create another\"\n    }\n}"
  },
  {
    "path": "public/locales/en/manage/users/edit.json",
    "content": "{\n  \"metaTitle\": \"User {{username}}\",\n  \"back\": \"Back to user management\",\n  \"sections\": {\n    \"general\": {\n      \"title\": \"General\",\n      \"inputs\": {\n        \"username\": {\n          \"label\": \"Username\"\n        },\n        \"eMail\": {\n          \"label\": \"E-Mail\"\n        }\n      }\n    },\n    \"security\": {\n      \"title\": \"Security\",\n      \"inputs\": {\n        \"password\": {\n          \"label\": \"New password\"\n        },\n        \"terminateExistingSessions\": {\n          \"label\": \"Terminate existing sessions\",\n          \"description\": \"Forces user to log in again on their devices\"\n        },\n        \"confirm\": {\n          \"label\": \"Confirm\",\n          \"description\": \"Password will be updated. Action cannot be reverted.\"\n        }\n      }\n    },\n    \"roles\": {\n      \"title\": \"Roles\",\n      \"currentRole\": \"Current role: \",\n      \"badges\": {\n        \"owner\": \"Owner\",\n        \"admin\": \"Admin\",\n        \"normal\": \"Normal\"\n      }\n    },\n    \"deletion\": {\n      \"title\": \"Account deletion\",\n      \"inputs\": {\n        \"confirmUsername\": {\n          \"label\": \"Confirm username\",\n          \"description\": \"Type username to confirm deletion\"\n        },\n        \"confirm\": {\n          \"label\": \"Delete permanently\",\n          \"description\": \"I am aware that this action is permanent and all account data will be lost.\"\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "public/locales/en/manage/users/invites.json",
    "content": "{\n    \"metaTitle\": \"User invites\",\n    \"pageTitle\": \"Manage user invites\",\n    \"description\": \"Using invites, you can invite users to your Homarr instance. An invitation will only be valid for a certain time-span and can be used once. The expiration must be between 5 minutes and 12 months upon creation.\",\n    \"button\": {\n        \"createInvite\": \"Create invitation\",\n        \"deleteInvite\": \"Delete invite\"\n    },\n    \"table\": {\n        \"header\": {\n            \"id\": \"ID\",\n            \"creator\": \"Creator\",\n            \"expires\": \"Expires\",\n            \"action\": \"Actions\"\n        },\n        \"data\": {\n            \"expiresAt\": \"expired {{at}}\",\n            \"expiresIn\": \"in {{in}}\"\n        }\n    },\n    \"modals\": {\n        \"create\": {\n            \"title\": \"Create invite\",\n            \"description\": \"After the expiration, an invite will no longer be valid and the recipient of the invite won't be able to create an account.\",\n            \"form\": {\n                \"expires\": \"Expiration date\",\n                \"submit\": \"Create\"\n            }\n        },\n        \"copy\": {\n            \"title\": \"Copy invitation\",\n            \"description\": \"Your invitation has been generated. After this modal closes, <b>you'll not be able to copy this link anymore</b>. If you do no longer wish to invite said person, you can delete this invitation any time.\",\n            \"invitationLink\": \"Invitation link\",\n            \"details\": {\n                \"id\": \"ID\",\n                \"token\": \"Token\"\n            },\n            \"button\": {\n                \"close\": \"Copy & Dismiss\"\n            }\n        },\n        \"delete\": {\n            \"title\": \"Delete invite\",\n            \"description\": \"Are you sure, that you want to delete this invitation? Users with this link will no longer be able to create an account using that link.\"\n        }\n    },\n    \"noInvites\": \"There are no invitations yet.\"\n}"
  },
  {
    "path": "public/locales/en/manage/users.json",
    "content": "{\n    \"metaTitle\": \"Users\",\n    \"pageTitle\": \"Manage users\",\n    \"buttons\": {\n        \"create\": \"Create\"\n    },\n    \"filter\": {\n        \"roles\": {\n            \"all\": \"All\",\n            \"normal\": \"Normal\",\n            \"admin\": \"Admin\",\n            \"owner\": \"Owner\"\n        }\n    },\n    \"table\": {\n        \"header\": {\n            \"user\": \"User\",\n            \"email\": \"E-Mail\"\n        }\n    },\n    \"tooltips\": {\n        \"deleteUser\": \"Delete user\",\n        \"demoteAdmin\": \"Demote administrator\",\n        \"promoteToAdmin\": \"Promote to administrator\"\n    },\n    \"modals\": {\n        \"delete\": {\n            \"title\": \"Delete user {{name}}\",\n            \"text\": \"Are you sure, that you want to delete the user {{name}}? This will delete data associated with this account, but not any created dashboards by this user.\"\n        },\n        \"change-role\": {\n            \"promote\": {\n                \"title\": \"Promote user {{name}} to admin\",\n                \"text\": \"Are you sure, that you want to promote the user {{name}} to admin? This will give the user access to all resources on your Homarr instance.\"\n            },\n            \"demote\": {\n                \"title\": \"Demote user {{name}} to user\",\n                \"text\": \"Are you sure, that you want to demote the user {{name}} to user? This will remove the user's access to all resources on your Homarr instance.\"\n            },\n            \"confirm\": \"Confirm\"\n        }\n    },\n    \"searchDoesntMatch\": \"Your search does not match any entries. Please adjust your filter.\"\n}"
  },
  {
    "path": "public/locales/en/modules/bookmark.json",
    "content": "{\n  \"descriptor\": {\n    \"name\": \"Bookmark\",\n    \"description\": \"Displays a static list of strings or links\",\n    \"settings\": {\n      \"title\": \"Bookmark settings\",\n      \"name\": {\n        \"label\": \"Widget Title\",\n        \"info\": \"Leave empty to keep the title hidden.\"\n      },\n      \"items\": {\n        \"label\": \"Items\"\n      },\n      \"layout\": {\n        \"label\": \"Layout\",\n        \"data\":{\n          \"autoGrid\": \"Auto Grid\",\n          \"horizontal\": \"Horizontal\",\n          \"vertical\": \"Vertical\"\n        }\n      }\n    }\n  },\n  \"card\": {\n    \"noneFound\": {\n      \"title\": \"Bookmark list empty\",\n      \"text\": \"Add new items to this list in the edit mode\"\n    }\n  },\n  \"item\": {\n    \"validation\": {\n      \"length\": \"Length must be between {{shortest}} and {{longest}}\",\n      \"invalidLink\": \"Not a valid link\",\n      \"errorMsg\": \"Did not save, because there were validation errors. Please adust your inputs\"\n    },\n    \"name\": \"Name\",\n    \"url\": \"URL\",\n    \"newTab\": \"Open in new tab\",\n    \"hideHostname\": \"Hide Hostname\",\n    \"hideIcon\": \"Hide Icon\",\n    \"delete\": \"Delete\"\n\n  }\n}\n"
  },
  {
    "path": "public/locales/en/modules/calendar.json",
    "content": "{\n  \"descriptor\": {\n    \"name\": \"Calendar\",\n    \"description\": \"Displays a calendar with upcoming releases, from supported integrations.\",\n    \"settings\": {\n      \"title\": \"Settings for Calendar widget\",\n      \"radarrReleaseType\": {\n        \"label\": \"Radarr release type\",\n        \"data\":{\n          \"inCinemas\": \"In Cinemas\",\n          \"physicalRelease\": \"Physical\",\n          \"digitalRelease\": \"Digital\"\n        }\n      },\n      \"hideWeekDays\": {\n        \"label\": \"Hide week days\"\n      },\n      \"showUnmonitored\": {\n        \"label\": \"Show unmonitored items\"\n      },\n      \"fontSize\": {\n        \"label\": \"Font Size\",\n        \"data\":{\n          \"xs\": \"Extra Small\",\n          \"sm\": \"Small\",\n          \"md\": \"Medium\",\n          \"lg\": \"Large\",\n          \"xl\": \"Extra Large\"\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "public/locales/en/modules/common-media-cards.json",
    "content": "{\n  \"buttons\": {\n    \"play\": \"Play\",\n    \"request\": \"Request\"\n  }\n}"
  },
  {
    "path": "public/locales/en/modules/common.json",
    "content": "{\n  \"settings\": {\n    \"label\": \"Settings\"\n  },\n  \"errors\": {\n    \"unmappedOptions\": {\n      \"text\": \"\"\n    }\n  }\n}\n"
  },
  {
    "path": "public/locales/en/modules/dashdot.json",
    "content": "{\n  \"descriptor\": {\n    \"name\": \"Dash.\",\n    \"description\": \"Displays the graphs of an external Dash. Instance inside Homarr.\",\n    \"settings\": {\n      \"title\": \"Settings for Dash. widget\",\n      \"dashName\": {\n        \"label\": \"Dash. Name\"\n      },\n      \"url\": {\n        \"label\": \"Dash. URL\"\n      },\n      \"usePercentages\": {\n        \"label\": \"Display percentages\"\n      },\n      \"columns\": {\n        \"label\": \"Display columns\"\n      },\n      \"graphHeight\": {\n        \"label\": \"Height of graphs\"\n      },\n      \"graphsOrder\": {\n        \"label\": \"Graphs (Order)\",\n        \"storage\": {\n          \"label\": \"Storage\",\n          \"enabled\": {\n            \"label\": \"Show in widget\"\n          },\n          \"span\": {\n            \"label\": \"Column span\"\n          },\n          \"compactView\": {\n            \"label\": \"Show as text (compact)\"\n          },\n          \"multiView\": {\n            \"label\": \"Show as multi-drive-view\"\n          }\n        },\n        \"network\": {\n          \"label\": \"Network\",\n          \"enabled\": {\n            \"label\": \"Show in widget\"\n          },\n          \"span\": {\n            \"label\": \"Column span\"\n          },\n          \"compactView\": {\n            \"label\": \"Show as text (compact)\"\n          }\n        },\n        \"cpu\": {\n          \"label\": \"CPU\",\n          \"enabled\": {\n            \"label\": \"Show in widget\"\n          },\n          \"span\": {\n            \"label\": \"Column span\"\n          },\n          \"multiView\": {\n            \"label\": \"Show as multi-core-view\"\n          }\n        },\n        \"ram\": {\n          \"label\": \"RAM\",\n          \"enabled\": {\n            \"label\": \"Show in widget\"\n          },\n          \"span\": {\n            \"label\": \"Column span\"\n          }\n        },\n        \"gpu\": {\n          \"label\": \"GPU\",\n          \"enabled\": {\n            \"label\": \"Show in widget\"\n          },\n          \"span\": {\n            \"label\": \"Column span\"\n          }\n        }\n      }\n    }\n  },\n  \"card\": {\n    \"title\": \"Dash.\",\n    \"errors\": {\n      \"noService\": \"No Dash. service found. Please add one to your Homarr dashboard or set a Dash. URL in the module options\",\n      \"noInformation\": \"Cannot acquire information from dash. - are you running the latest version?\",\n      \"protocolDowngrade\": {\n        \"title\": \"Detected protocol downgrade\",\n        \"text\": \"The connection to your Dash. instance is using HTTP. This is a security risk, because HTTP is unencrypted and attackers could abuse this connection. Make sure that Dash. is using HTTPS, or downgrade Homarr to HTTP (not recommended).\"\n      }\n    },\n    \"graphs\": {\n      \"storage\": {\n        \"title\": \"Storage\",\n        \"label\": \"Storage:\"\n      },\n      \"network\": {\n        \"title\": \"Network\",\n        \"label\": \"Network:\",\n        \"metrics\": {\n          \"download\": \"Down\",\n          \"upload\": \"Up\"\n        }\n      },\n      \"cpu\": {\n        \"title\": \"CPU\"\n      },\n      \"ram\": {\n        \"title\": \"RAM\"\n      },\n      \"gpu\": {\n        \"title\": \"GPU\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "public/locales/en/modules/date.json",
    "content": "{\n  \"descriptor\": {\n    \"name\": \"Date and Time\",\n    \"description\": \"Displays the current date and time.\",\n    \"settings\": {\n      \"title\": \"Settings for Date and Time widget\",\n      \"timezone\":{\n        \"label\":\"Timezone\",\n        \"info\":\"Select the name of your timezone, find yours here: \"\n      },\n      \"customTitle\":{\n        \"label\":\"City name or custom title\"\n      },\n      \"display24HourFormat\": {\n        \"label\": \"Display full time (24-hour)\"\n      },\n      \"dateFormat\": {\n        \"label\": \"Date formatting\",\n        \"data\": {\n          \"hide\": \"Hide Date\"\n        }\n      },\n      \"titleState\": {\n        \"label\": \"Clock title\",\n        \"info\": \"The custom title and the timezone code can be shown on your widget.<br/>You can also show the city alone, show none,<br/>or even show the timezone alone when both are selected but no title is provided.\",\n        \"data\": {\n          \"both\": \"Title and Timezone\",\n          \"city\": \"Title only\",\n          \"none\": \"None\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "public/locales/en/modules/dlspeed.json",
    "content": "{\n  \"descriptor\": {\n    \"name\": \"Download Speed\",\n    \"description\": \"Displays the Download and Upload speed of supported integrations.\"\n  },\n  \"card\": {\n    \"table\": {\n      \"header\": {\n        \"name\": \"Name\",\n        \"size\": \"Size\",\n        \"download\": \"Down\",\n        \"upload\": \"Up\",\n        \"estimatedTimeOfArrival\": \"ETA\",\n        \"progress\": \"Progress\"\n      },\n      \"body\": {\n        \"nothingFound\": \"No torrents found\"\n      }\n    },\n    \"lineChart\": {\n      \"title\": \"Current download speed\",\n      \"download\": \"Download: {{download}}\",\n      \"upload\": \"Upload: {{upload}}\",\n      \"timeSpan\": \"{{seconds}} seconds ago\",\n      \"totalDownload\": \"Download: {{download}}/s\",\n      \"totalUpload\": \"Upload: {{upload}}/s\"\n    },\n    \"errors\": {\n      \"noDownloadClients\": {\n        \"title\": \"No supported download clients found!\",\n        \"text\": \"Add a download service to view your current downloads\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "public/locales/en/modules/dns-hole-controls.json",
    "content": "{\n  \"descriptor\": {\n    \"name\": \"DNS hole controls\",\n    \"description\": \"Control PiHole or AdGuard from your dashboard\",\n    \"settings\": {\n      \"title\": \"DNS hole controls settings\",\n      \"showToggleAllButtons\": {\n        \"label\": \"Show 'Enable/Disable All' Buttons\"\n      }\n    },\n    \"errors\": {\n      \"general\": {\n        \"title\": \"Unable to find a DNS hole\",\n        \"text\": \"There was a problem connecting to your DNS Hole(s). Please verify your configuration/integration(s).\"\n      }\n    }\n  },\n  \"durationModal\": {\n    \"title\": \"Set disable duration time\",\n    \"hours\": \"Hours\",\n    \"minutes\": \"Minutes\",\n    \"unlimited\": \"leave empty for unlimited\",\n    \"set\": \"Set\"\n  }\n}"
  },
  {
    "path": "public/locales/en/modules/dns-hole-summary.json",
    "content": "{\n  \"descriptor\": {\n    \"name\": \"DNS hole summary\",\n    \"description\": \"Displays important data from PiHole or AdGuard\",\n    \"settings\": {\n      \"title\": \"Settings for DNS Hole summary\",\n      \"usePiHoleColors\": {\n        \"label\": \"Use colors from PiHole\"\n      },\n      \"layout\": {\n        \"label\": \"Layout\",\n        \"data\": {\n          \"grid\": \"2 by 2\",\n          \"row\": \"Horizontal\",\n          \"column\": \"Vertical\"\n        }\n      }\n    }\n  },\n  \"card\": {\n    \"metrics\": {\n      \"domainsOnAdlist\": \"Domains on adlists\",\n      \"queriesToday\": \"Queries today\",\n      \"queriesBlockedTodayPercentage\": \"Blocked today\",\n      \"queriesBlockedToday\": \"Blocked today\"\n    }\n  }\n}\n"
  },
  {
    "path": "public/locales/en/modules/docker.json",
    "content": "{\n  \"descriptor\": {\n    \"name\": \"Docker\",\n    \"description\": \"Allows you to easily see and manage all of your Docker Containers.\"\n  },\n  \"search\": {\n    \"placeholder\": \"Search by container or image name\"\n  },\n  \"table\": {\n    \"header\": {\n      \"name\": \"Name\",\n      \"image\": \"Image\",\n      \"ports\": \"Ports\",\n      \"state\": \"State\"\n    },\n    \"body\": {\n      \"portCollapse\": \"{{ports}} more\"\n    },\n    \"states\": {\n      \"running\": \"Running\",\n      \"created\": \"Created\",\n      \"stopped\": \"Stopped\",\n      \"unknown\": \"Unknown\"\n    }\n  },\n  \"actionBar\": {\n    \"addService\": {\n      \"title\": \"Add app\",\n      \"message\": \"Add app to Homarr\"\n    },\n    \"restart\": {\n      \"title\": \"Restart\"\n    },\n    \"stop\": {\n      \"title\": \"Stop\"\n    },\n    \"start\": {\n      \"title\": \"Start\"\n    },\n    \"refreshData\": {\n      \"title\": \"Refresh data\"\n    },\n    \"remove\": {\n      \"title\": \"Remove\"\n    },\n    \"addToHomarr\": {\n      \"title\": \"Add to Homarr\"\n    }\n  },\n  \"actions\": {\n    \"start\": {\n      \"start\": \"Starting\",\n      \"end\": \"Started\"\n    },\n    \"stop\": {\n      \"start\": \"Stopping\",\n      \"end\": \"Stopped\"\n    },\n    \"restart\": {\n      \"start\": \"Restarting\",\n      \"end\": \"Restarted\"\n    },\n    \"remove\": {\n      \"start\": \"Removing\",\n      \"end\": \"Removed\"\n    }\n  },\n  \"errors\": {\n    \"integrationFailed\": {\n      \"title\": \"Docker integration failed\",\n      \"message\": \"Did you forget to mount the docker socket?\"\n    },\n    \"unknownError\": {\n      \"title\": \"There was an error\"\n    },\n    \"oneServiceAtATime\": {\n      \"title\": \"Please only add one app or service at a time!\"\n    }\n  },\n  \"actionIcon\": {\n    \"tooltip\": \"Docker\"\n  }\n}\n"
  },
  {
    "path": "public/locales/en/modules/health-monitoring.json",
    "content": "{\n  \"descriptor\": {\n    \"name\": \"System Health Monitoring\",\n    \"description\": \"Displays information showing the health and status of your system(s).\",\n    \"settings\": {\n      \"title\": \"Settings for system health monitoring\",\n      \"fahrenheit\": {\n        \"label\": \"CPU Temp in Fahrenheit\"\n      },\n      \"cpu\": {\n        \"label\": \"Show CPU Info\",\n        \"load\": \"Load Average\",\n        \"minute\": \"{{minute}} minute\",\n        \"minutes\": \"{{minutes}} minutes\"\n      },\n      \"memory\": {\n        \"label\": \"Show Memory Info\"\n      },\n      \"fileSystem\": {\n        \"label\": \"Show Filesystem Info\"\n      },\n      \"node\": {\n        \"label\": \"Filter by node name\",\n        \"info\": \"Enter your Proxmox node name to only show metrics for that node. By default, the entire cluster is shown.\"\n      },\n      \"defaultViewState\": {\n        \"label\": \"Section open by default\",\n        \"data\": {\n          \"none\": \"None\",\n          \"node\": \"Nodes\",\n          \"vm\": \"VMs\",\n          \"lxc\": \"LXCs\",\n          \"storage\": \"Storage\"\n        }\n      },\n      \"defaultTabState\": {\n        \"label\": \"Tab open by default\",\n        \"info\": \"Tab open by default. Only used when multiple integrations are available.\",\n        \"data\": {\n          \"system\": \"System\",\n          \"cluster\": \"Cluster\"\n        }\n      },\n      \"summary\": {\n        \"label\": \"Show summary section\"\n      },\n      \"showNode\": {\n        \"label\": \"Show nodes section\"\n      },\n      \"showVM\": {\n        \"label\": \"Show VMs section\"\n      },\n      \"showLXCs\": {\n        \"label\": \"Show LXCs section\"\n      },\n      \"showStorage\": {\n        \"label\": \"Show storage section\"\n      },\n      \"sectionIndicatorColor\": {\n        \"label\": \"Requirement for section status indicator to be 'OK'\",\n        \"info\": \"'All' requires that all items be online for the indicator to be green. 'Any' requires at least one item to be online.\",\n        \"data\": {\n          \"any\": \"Any Active\",\n          \"all\": \"All Active\"\n        }\n      },\n      \"ignoreCert\": {\n        \"label\": \"Ignore Certificate Errors\",\n        \"info\": \"If enabled, the widget will ignore certificate errors when accessing the Proxmox API. This can be helpful when accessing Proxmox through HTTPS.\"\n      }\n    }\n  },\n  \"cpu\": {\n    \"label\": \"CPU\",\n    \"load\": \"Load Average\",\n    \"minute\": \"{{minute}} minute\"\n  },\n  \"memory\": {\n    \"label\": \"Memory\",\n    \"totalMem\": \"Total memory: {{total}}GB\",\n    \"available\": \"Available: {{available}}GB - {{percentage}}%\"\n  },\n  \"fileSystem\": {\n    \"label\": \"File System\",\n    \"available\": \"Available: {{available}} - {{percentage}}%\"\n  },\n  \"info\": {\n    \"uptime\": \"Uptime\",\n    \"uptimeFormat\": \"{{days}} days, {{hours}} hours, {{minutes}} minutes\",\n    \"updates\": \"Updates Available\",\n    \"reboot\": \"Reboot\"\n  },\n  \"errors\": {\n    \"general\": {\n      \"title\": \"Unable to find your system(s).\",\n      \"text\": \"There was a problem connecting to your system. Please verify your configuration/integration(s).\"\n    }\n  },\n  \"headings\": {\n    \"system\": \"System\",\n    \"cluster\": \"Cluster\"\n  },\n  \"cluster\": {\n    \"summary\": {\n      \"cpu\": \"CPU\",\n      \"ram\": \"RAM\"\n    },\n    \"accordion\": {\n      \"title\": {\n        \"nodes\": \"Nodes\",\n        \"vms\": \"VMs\",\n        \"lxcs\": \"LXCs\",\n        \"storage\": \"Storage\"\n      }\n    },\n    \"table\": {\n      \"header\": {\n        \"name\": \"Name\",\n        \"cpu\": \"CPU\",\n        \"ram\": \"RAM\",\n        \"node\": \"Node\"\n      }\n    },\n    \"popover\": {\n      \"node\": \"Node\",\n      \"vmid\": \"VMID\",\n      \"details\": \"Details\",\n      \"cores\": \"Cores - {{maxCpu}}\",\n      \"memSize\": \"Memory - {{maxMem}}\",\n      \"memRatio\": \"Memory - {{usedMem}} / {{maxMem}}\",\n      \"diskSize\": \"Disk - {{maxDisk}}\",\n      \"diskRatio\": \"Disk - {{usedDisk}} / {{maxDisk}}\",\n      \"uptime\": \"Uptime - {{uptime}}\",\n      \"plugin\": \"Plugin\",\n      \"ha\": \"HA State - {{haState}}\",\n      \"sharedStorage\": \"Shared Storage\",\n      \"localStorage\": \"Local Storage\",\n      \"na\": \"N/A\"\n    }\n  }\n}"
  },
  {
    "path": "public/locales/en/modules/iframe.json",
    "content": "{\n  \"descriptor\": {\n    \"name\": \"iFrame\",\n    \"description\": \"Embed any content from the internet. Some websites may restrict access.\",\n    \"settings\": {\n      \"title\": \"iFrame settings\",\n      \"embedUrl\": {\n        \"label\": \"Embed URL\"\n      },\n      \"allowFullScreen\": {\n        \"label\": \"Allow full screen\"\n      },\n      \"allowTransparency\": {\n        \"label\": \"Allow transparency\"\n      },\n      \"allowScrolling\": {\n        \"label\": \"Allow scrolling\"\n      },\n      \"allowPayment\": {\n        \"label\": \"Allow payment\"\n      },\n      \"allowAutoPlay\": {\n        \"label\": \"Allow auto play\"\n      },\n      \"allowMicrophone\": {\n        \"label\": \"Allow microphone\"\n      },\n      \"allowCamera\": {\n        \"label\": \"Allow camera\"\n      },\n      \"allowGeolocation\": {\n        \"label\": \"Allow geolocation\"\n      }\n    }\n  },\n  \"card\": {\n    \"errors\": {\n      \"noUrl\": {\n        \"title\": \"Invalid URL\",\n        \"text\": \"Ensure that you've entered a valid address in the configuration of your widget\"\n      },\n      \"browserSupport\": \"Your Browser does not support iframes. Please update your browser.\"\n    }\n  }\n}\n"
  },
  {
    "path": "public/locales/en/modules/indexer-manager.json",
    "content": "{\n    \"descriptor\": {\n      \"name\": \"Indexer manager status\",\n      \"description\": \"Status about your indexers\",\n      \"settings\": {\n        \"title\": \"Indexer manager status\",\n        \"openIndexerSiteInNewTab\": {\n          \"label\": \"Open Indexer Site In New Tab\"\n          }\n        }\n      },\n      \"indexersStatus\": {\n        \"title\": \"Indexer manager\",\n        \"testAllButton\": \"Test all\"\n      },\n      \"errors\": {\n        \"general\": {\n          \"title\": \"Unable to find a indexer manager\",\n          \"text\": \"There was a problem connecting to your indexer manager. Please verify your configuration/integration(s).\"\n        }\n      }\n  }  "
  },
  {
    "path": "public/locales/en/modules/media-requests-list.json",
    "content": "{\n  \"descriptor\": {\n    \"name\": \"Media Requests\",\n    \"description\": \"See a list of all media requests from your Overseerr or Jellyseerr instance\",\n    \"settings\": {\n      \"title\": \"Media requests list\",\n      \"replaceLinksWithExternalHost\": {\n        \"label\": \"Replace links with external host\"\n      },\n      \"openInNewTab\": {\n        \"label\": \"Open links in new tab\"\n      }\n    }\n  },\n  \"noRequests\": \"No requests found. Please ensure that you've configured your apps correctly.\",\n  \"state\": {\n    \"approved\": \"Approved\",\n    \"pendingApproval\": \"Pending approval\",\n    \"declined\": \"Declined\",\n    \"available\": \"Available\",\n    \"partial\": \"Partial\"\n  },\n  \"tooltips\": {\n    \"approve\": \"Approve requests\",\n    \"decline\": \"Decline requests\",\n    \"approving\": \"Approving Request...\"\n  },\n  \"mutation\": {\n    \"approving\": \"Approving\",\n    \"declining\": \"Declining\",\n    \"request\": \"request...\",\n    \"approved\": \"Request was approved!\",\n    \"declined\": \"Request was declined!\"\n  }\n}\n"
  },
  {
    "path": "public/locales/en/modules/media-requests-stats.json",
    "content": "{\n  \"descriptor\": {\n    \"name\": \"Media request stats\",\n    \"description\": \"Statistics about your media requests\",\n    \"settings\": {\n      \"title\": \"Media requests stats\",\n      \"replaceLinksWithExternalHost\": {\n        \"label\": \"Replace links with external host\"\n      },\n      \"openInNewTab\": {\n        \"label\": \"Open links in new tab\"\n      }\n    }\n  },\n  \"mediaStats\": {\n    \"title\": \"Media Stats\",\n    \"pending\": \"Pending approvals\",\n    \"tvRequests\": \"TV requests\",\n    \"movieRequests\": \"Movie requests\",\n    \"approved\": \"Already approved\",\n    \"totalRequests\": \"Total\"\n  },\n  \"userStats\": {\n    \"title\": \"Top Users\",\n    \"requests\": \"Requests: {{number}}\"\n  }\n}\n"
  },
  {
    "path": "public/locales/en/modules/media-server.json",
    "content": "{\n  \"descriptor\": {\n    \"name\": \"Media Server\",\n    \"description\": \"Interact with your Jellyfin or Plex media server\",\n    \"settings\": {\n      \"title\": \"Settings for media server widget\"\n    }\n  },\n  \"loading\": \"Loading streams\",\n  \"card\": {\n    \"table\": {\n      \"header\": {\n        \"session\": \"Session\",\n        \"user\": \"User\",\n        \"currentlyPlaying\": \"Currently playing\"\n      }\n    },\n    \"errors\": {\n      \"general\": {\n        \"title\": \"Unable to load content\",\n        \"text\": \"Unable to retrieve information from the server. Please check the logs for more details\"\n      }\n    }\n  }\n}"
  },
  {
    "path": "public/locales/en/modules/media-transcoding.json",
    "content": "{\n  \"descriptor\": {\n    \"name\": \"Media Transcoding\",\n    \"description\": \"Displays information about media transcoding\",\n    \"settings\": {\n      \"title\": \"Media Transcoding Settings\",\n      \"appId\": {\n        \"label\": \"Select an app\"\n      },\n      \"defaultView\": {\n        \"label\": \"Default view\",\n        \"data\": {\n          \"workers\": \"Workers\",\n          \"queue\": \"Queue\",\n          \"statistics\": \"Statistics\"\n        }\n      },\n      \"showHealthCheck\": {\n        \"label\": \"Show Health Check indicator\"\n      },\n      \"showHealthChecksInQueue\": {\n        \"label\": \"Show Health Checks in queue\"\n      },\n      \"queuePageSize\": {\n        \"label\": \"Queue: Items per page\"\n      },\n      \"showAppIcon\": {\n        \"label\": \"Show app icon in the bottom right corner\"\n      }\n    }\n  },\n  \"noAppSelected\": \"Please select an app in the widget settings\",\n  \"views\": {\n    \"workers\": {\n      \"table\": {\n        \"header\": {\n          \"name\": \"File\",\n          \"eta\": \"ETA\",\n          \"progress\": \"Progress\"\n        },\n        \"empty\": \"Empty\",\n        \"tooltip\": {\n          \"transcode\": \"Transcode\",\n          \"healthCheck\": \"Health Check\"\n        }\n      }\n    },\n    \"queue\": {\n      \"table\": {\n        \"header\": {\n          \"name\": \"File\",\n          \"size\": \"Size\"\n        },\n        \"footer\": {\n          \"currentIndex\": \"{{start}}-{{end}} of {{total}}\"\n        },\n        \"empty\": \"Empty\",\n        \"tooltip\": {\n          \"transcode\": \"Transcode\",\n          \"healthCheck\": \"Health Check\"\n        }\n      }\n    },\n    \"statistics\": {\n      \"empty\": \"Empty\",\n      \"box\": {\n        \"transcodes\": \"Transcodes: {{value}}\",\n        \"healthChecks\": \"Health Checks: {{value}}\",\n        \"files\": \"Files: {{value}}\",\n        \"spaceSaved\": \"Saved: {{value}}\"\n      },\n      \"pies\": {\n        \"transcodes\": \"Transcodes\",\n        \"healthChecks\": \"Health Checks\",\n        \"videoCodecs\": \"Codecs\",\n        \"videoContainers\": \"Containers\",\n        \"videoResolutions\": \"Resolutions\"\n      }\n    }\n  },\n  \"error\": {\n    \"title\": \"Error\",\n    \"message\": \"An error occurred while fetching data from Tdarr.\"\n  },\n  \"tabs\": {\n    \"workers\": \"Workers\",\n    \"queue\": \"Queue\",\n    \"statistics\": \"Statistics\"\n  },\n  \"healthCheckStatus\": {\n    \"title\": \"Health Check\",\n    \"queued\": \"Queued\",\n    \"healthy\": \"Healthy\",\n    \"unhealthy\": \"Unhealthy\"\n  }\n}\n"
  },
  {
    "path": "public/locales/en/modules/notebook.json",
    "content": "{\n\t\"descriptor\": {\n\t\t\"name\": \"Notebook\",\n\t\t\"description\": \"A markdown-based interactive widget for you to write down your notes!\",\n\t\t\"settings\": {\n\t\t\t\"title\": \"Settings for the notebook widget\",\n\t\t\t\"showToolbar\": {\n\t\t\t\t\"label\": \"Show the toolbar to help you write markdown\"\n\t\t\t},\n\t\t\t\"allowReadOnlyCheck\": {\n\t\t\t\t\"label\": \"Allow check in read only mode\"\n\t\t\t},\n\t\t\t\"content\": {\n\t\t\t\t\"label\": \"The content of the notebook\"\n\t\t\t}\n\t\t}\n\t},\n\t\"card\": {\n\t\t\"controls\": {\n\t\t\t\"bold\": \"Bold\",\n\t\t\t\"italic\": \"Italic\",\n\t\t\t\"strikethrough\": \"Strikethrough\",\n\t\t\t\"underline\": \"Underline\",\n\t\t\t\"colorText\": \"Color text\",\n\t\t\t\"colorHighlight\": \"Colored highlight text\",\n\t\t\t\"code\": \"Code\",\n\t\t\t\"clear\": \"Clear formatting\",\n\t\t\t\"heading\": \"Heading {{level}}\",\n\t\t\t\"align\": \"Align text: {{position}}\",\n\t\t\t\"blockquote\": \"Blockquote\",\n\t\t\t\"horizontalLine\": \"Horizontal line\",\n\t\t\t\"bulletList\": \"Bullet list\",\n\t\t\t\"orderedList\": \"Ordered list\",\n\t\t\t\"checkList\": \"Check list\",\n\t\t\t\"increaseIndent\": \"Increase Indent\",\n\t\t\t\"decreaseIndent\": \"Decrease Indent\",\n\t\t\t\"link\": \"Link\",\n\t\t\t\"unlink\": \"Remove link\",\n\t\t\t\"image\": \"Embed Image\",\n\t\t\t\"addTable\": \"Add table\",\n\t\t\t\"deleteTable\": \"Delete Table\",\n\t\t\t\"colorCell\": \"Color Cell\",\n\t\t\t\"mergeCell\": \"Toggle cell merging\",\n\t\t\t\"addColumnLeft\": \"Add column before\",\n\t\t\t\"addColumnRight\": \"Add column after\",\n\t\t\t\"deleteColumn\": \"Delete column\",\n\t\t\t\"addRowTop\": \"Add row before\",\n\t\t\t\"addRowBelow\": \"Add row after\",\n\t\t\t\"deleteRow\": \"Delete row\"\n\t\t},\n\t\t\"modals\": {\n\t\t\t\"clearColor\": \"Clear color\",\n\t\t\t\"source\": \"Source\",\n\t\t\t\"widthPlaceholder\": \"Value in % or pixels\",\n\t\t\t\"columns\": \"Columns\",\n\t\t\t\"rows\": \"Rows\"\n\t\t}\n\t}\n}"
  },
  {
    "path": "public/locales/en/modules/overseerr.json",
    "content": "{\n  \"descriptor\": {\n    \"name\": \"Overseerr\",\n    \"description\": \"Allows you to search and add media from Overseerr or Jellyseerr.\"\n  },\n  \"popup\": {\n    \"item\": {\n      \"buttons\": {\n        \"askFor\": \"Ask for {{title}}\",\n        \"cancel\": \"Cancel\",\n        \"request\": \"Request\"\n      },\n      \"alerts\": {\n        \"automaticApproval\": {\n          \"title\": \"Using API key\",\n          \"text\": \"This request will be automatically approved\"\n        }\n      }\n    },\n    \"seasonSelector\": {\n      \"caption\": \"Tick the seasons you want to download\",\n      \"table\": {\n        \"header\": {\n          \"season\": \"Season\",\n          \"numberOfEpisodes\": \"Number of episodes\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "public/locales/en/modules/ping.json",
    "content": "{\n  \"descriptor\": {\n    \"name\": \"Ping\",\n    \"description\": \"Displays a status indicator depending on the HTTP response code of a given URL.\"\n  },\n  \"states\": {\n    \"online\": \"Online {{response}}\",\n    \"offline\": \"Offline {{response}}\",\n    \"loading\": \"Loading...\"\n  }\n}\n"
  },
  {
    "path": "public/locales/en/modules/rss.json",
    "content": "{\n  \"descriptor\": {\n    \"name\": \"RSS Widget\",\n    \"description\": \"The rss widget allows you to display RSS feeds on your dashboard.\",\n    \"settings\": {\n      \"title\": \"Settings for RSS widget\",\n      \"rssFeedUrl\": {\n        \"label\": \"RSS feed URLs\",\n        \"description\": \"The URLs of the RSS feeds you want to display from.\"\n      },\n      \"refreshInterval\": {\n        \"label\": \"Refresh interval (in minutes)\"\n      },\n      \"dangerousAllowSanitizedItemContent\": {\n        \"label\": \"Allow HTML formatting (Dangerous)\",\n        \"info\": \"Allowing HTML formatting from outside could be dangerous.<br/>Please make sure that the feed is from a trusted source.\"\n      },\n      \"textLinesClamp\": {\n        \"label\": \"Text lines clamp\"\n      },\n      \"sortByPublishDateAscending\": {\n        \"label\": \"Sort by publish date (ascending)\"\n      },\n      \"sortPostsWithoutPublishDateToTheTop\": {\n        \"label\": \"Put posts without publish date to the top\"\n      },\n      \"maximumAmountOfPosts\": {\n        \"label\": \"Maximum amount of posts\"\n      }\n    },\n    \"card\": {\n      \"errors\": {\n        \"general\": {\n          \"title\": \"Unable to retrieve RSS feed\",\n          \"text\": \"There was a problem reaching out the RSS feed. Make sure that you have correctly configured the RSS feed using a valid URL. URLs should match the official specification. After updating the feed, you may need to refresh the dashboard.\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "public/locales/en/modules/search.json",
    "content": "{\n  \"descriptor\": {\n    \"name\": \"Search Bar\",\n    \"description\": \"A search bar that allows you to search your custom search engine, YouTube, and supported integrations.\"\n  },\n  \"input\": {\n    \"placeholder\": \"Search the web...\"\n  },\n  \"switched-to\": \"Switched to\",\n  \"searchEngines\": {\n    \"search\": {\n      \"name\": \"Web\",\n      \"description\": \"Search...\"\n    },\n    \"youtube\": {\n      \"name\": \"Youtube\",\n      \"description\": \"Search on Youtube\"\n    },\n    \"torrents\": {\n      \"name\": \"Torrents\",\n      \"description\": \"Search for Torrents\"\n    },\n    \"overseerr\": {\n      \"name\": \"Overseerr\",\n      \"description\": \"Search for Movies and TV Shows on Overseerr\"\n    }\n  },\n  \"tip\": \"You can select the search bar with the shortcut \",\n  \"switchedSearchEngine\": \"Switched to searching with {{searchEngine}}\"\n}\n"
  },
  {
    "path": "public/locales/en/modules/smart-home/entity-state.json",
    "content": "{\n    \"entityNotFound\": \"Entity not found\",\n    \"descriptor\": {\n        \"name\": \"Home Assistant entity\",\n        \"description\": \"Current state of an entity in Home Assistant\",\n        \"settings\": {\n            \"title\": \"Entity state\",\n            \"entityId\": {\n                \"label\": \"Entity ID\",\n                \"info\": \"Unique entity ID in Home Assistant. Copy by clicking on entity > Click on cog icon > Click on copy button at 'Entity ID'. Some custom entities may not be supported.\"\n            },\n            \"appendUnit\": {\n                \"label\": \"Append unit of measurement\",\n                \"info\": \"Append the unit of measurement attribute to the entity state.\"\n            },\n            \"automationId\": {\n                \"label\": \"Optional automation ID\",\n                \"info\": \"Your unique automation ID. Always starts with automation.XXXXX. If not set, widget will not be clickable and only display state. After click, entity state will be refreshed.\"\n            },\n            \"displayName\": {\n                \"label\": \"Display name\"\n            },\n            \"displayFriendlyName\": {\n                \"label\": \"Display friendly name\",\n                \"info\": \"Display friendly name from Home Assistant instead instead of display name.\"\n            },\n            \"genericToggle\": {\n                \"label\": \"Entity toggle\",\n                \"info\": \"Perform a generic Home Assistant toggle action on entity when clicked.\"\n            }\n        }\n    }\n}\n\n"
  },
  {
    "path": "public/locales/en/modules/smart-home/trigger-automation.json",
    "content": "{\n  \"descriptor\": {\n    \"name\": \"Home Assistant automation\",\n    \"description\": \"Execute an automation\",\n    \"settings\": {\n      \"title\": \"Execute an automation\",\n      \"automationId\": {\n        \"label\": \"Automation ID\",\n        \"info\": \"Your unique automation ID. Always starts with automation.XXXXX.\"\n      },\n      \"displayName\": {\n        \"label\": \"Display name\"\n      }\n    }\n  }\n}"
  },
  {
    "path": "public/locales/en/modules/torrents-status.json",
    "content": "{\n  \"descriptor\": {\n    \"name\": \"Torrent\",\n    \"description\": \"Displays a list of torrents from supported Torrent clients.\",\n    \"settings\": {\n      \"title\": \"Settings for Torrent widget\",\n      \"refreshInterval\": {\n        \"label\": \"Refresh interval (in seconds)\"\n      },\n      \"displayCompletedTorrents\": {\n        \"label\": \"Display completed torrents\"\n      },\n      \"displayActiveTorrents\": {\n        \"label\": \"Display active torrents\"\n      },\n      \"speedLimitOfActiveTorrents\": {\n        \"label\": \"Upload speed to consider a torrent as active (kB/s)\"\n      },\n      \"displayStaleTorrents\": {\n        \"label\": \"Display stale torrents\"\n      },\n      \"labelFilterIsWhitelist\": {\n        \"label\": \"Label list is a whitelist (instead of blacklist)\"\n      },\n      \"labelFilter\": {\n        \"label\": \"Label list\",\n        \"description\": \"When 'is whitelist' checked, this will act as a whitelist. If not checked, this is a blacklist. Will not do anything when empty\"\n      },\n      \"displayRatioWithFilter\": {\n        \"label\": \"Display filtered torrents list ratio\",\n        \"info\": \"If disabled, only the global ratio will be display. The global ratio will still use the labels if set\"\n      },\n      \"columnOrdering\":{\n        \"label\": \"Enable reordering the columns\"\n      },\n      \"rowSorting\":{\n        \"label\": \"Enable sorting the rows\"\n      },\n      \"columns\": {\n        \"label\": \"Select columns to display\",\n        \"data\": {\n          \"date\": \"Date Added\",\n          \"down\": \"Down\",\n          \"up\": \"Up\",\n          \"eta\": \"ETA\",\n          \"progress\": \"Progress\"\n        }\n      },\n      \"nameColumnSize\": {\n        \"label\": \"Change the name column size\"\n      }\n    }\n  },\n  \"card\": {\n    \"footer\": {\n      \"error\": \"Error\",\n      \"lastUpdated\": \"Last updated {{time}} ago\",\n      \"ratioGlobal\": \"Global ratio\",\n      \"ratioWithFilter\": \"Ratio with filter\"\n    },\n    \"table\": {\n      \"header\": {\n        \"isCompleted\": \"Downloading\",\n        \"name\": \"Name\",\n        \"dateAdded\": \"Added On\",\n        \"size\": \"Size\",\n        \"download\": \"Down\",\n        \"upload\": \"Up\",\n        \"estimatedTimeOfArrival\": \"ETA\",\n        \"progress\": \"Progress\",\n        \"totalUploaded\": \"Total Upload\",\n        \"totalDownloaded\": \"Total Download\",\n        \"ratio\": \"Ratio\",\n        \"seeds\": \"Seeds (Connected)\",\n        \"peers\": \"Peers (Connected)\",\n        \"label\": \"Label\",\n        \"state\": \"State\",\n        \"stateMessage\": \"State Message\"\n      },\n      \"item\": {\n        \"text\": \"Managed by {{appName}}, {{ratio}} ratio\"\n      },\n      \"body\": {\n        \"nothingFound\": \"No torrents found\",\n        \"filterHidingItems\": \"{{count}} entries are hidden by your filters\"\n      }\n    },\n    \"lineChart\": {\n      \"title\": \"Current download speed\",\n      \"download\": \"Download: {{download}}\",\n      \"upload\": \"Upload: {{upload}}\",\n      \"timeSpan\": \"{{seconds}} seconds ago\",\n      \"totalDownload\": \"Download: {{download}}/s\",\n      \"totalUpload\": \"Upload: {{upload}}/s\"\n    },\n    \"errors\": {\n      \"noDownloadClients\": {\n        \"title\": \"No supported Torrent clients found!\",\n        \"text\": \"Add a supported Torrent client to view your current downloads\"\n      },\n      \"generic\": {\n        \"title\": \"An unexpected error occurred\",\n        \"text\": \"Unable to communicate with your Torrent clients. Please check your configuration\"\n      }\n    },\n    \"popover\": {\n      \"introductionPrefix\": \"Managed by\",\n      \"metrics\": {\n        \"queuePosition\": \"Queue position - {{position}}\",\n        \"progress\": \"Progress - {{progress}}%\",\n        \"totalSelectedSize\": \"Total - {{totalSize}}\",\n        \"state\": \"State - {{state}}\",\n        \"ratio\": \"Ratio -\",\n        \"completed\": \"Completed\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "public/locales/en/modules/usenet.json",
    "content": "{\n  \"descriptor\": {\n    \"name\": \"Usenet\",\n    \"description\": \"Allows you to view and manage your Usenet instance.\"\n  },\n  \"card\": {\n    \"errors\": {\n      \"noDownloadClients\": {\n        \"title\": \"No supported download clients found!\",\n        \"text\": \"Add a supported Usenet Download Client to view your current downloads\"\n      }\n    }\n  },\n  \"tabs\": {\n    \"queue\": \"Queue\",\n    \"history\": \"History\"\n  },\n  \"info\": {\n    \"sizeLeft\": \"Size left\",\n    \"paused\": \"Paused\"\n  },\n  \"queue\": {\n    \"header\": {\n      \"name\": \"Name\",\n      \"size\": \"Size\",\n      \"eta\": \"ETA\",\n      \"progress\": \"Progress\"\n    },\n    \"empty\": \"Empty\",\n    \"error\": {\n      \"title\": \"Error\",\n      \"message\": \"An error has occurred\"\n    },\n    \"paused\": \"Paused\"\n  },\n  \"history\": {\n    \"header\": {\n      \"name\": \"Name\",\n      \"size\": \"Size\",\n      \"duration\": \"Duration\"\n    },\n    \"empty\": \"Empty\",\n    \"error\": {\n      \"title\": \"Error\",\n      \"message\": \"Error loading history\"\n    },\n    \"paused\": \"Paused\"\n  }\n}"
  },
  {
    "path": "public/locales/en/modules/video-stream.json",
    "content": "{\n  \"descriptor\": {\n    \"name\": \"Video Stream\",\n    \"description\": \"Embed a video stream or video from a camera or a website\",\n    \"settings\": {\n      \"title\": \"Settings for video stream widget\",\n      \"FeedUrl\": {\n        \"label\": \"Feed URL\"\n      },\n      \"autoPlay\": {\n        \"label\": \"Autoplay\"\n      },\n      \"muted\": {\n        \"label\": \"Muted audio\"\n      },\n      \"controls\": {\n        \"label\": \"Video player controls\"\n      }\n    }\n  },\n  \"errors\": {\n    \"invalidStream\": \"Invalid stream\"\n  }\n}"
  },
  {
    "path": "public/locales/en/modules/weather.json",
    "content": "{\n  \"descriptor\": {\n    \"name\": \"Weather\",\n    \"description\": \"Displays the current weather information of a set location.\",\n    \"settings\": {\n      \"title\": \"Settings for weather widget\",\n      \"displayInFahrenheit\": {\n        \"label\": \"Display in Fahrenheit\"\n      },\n      \"displayCityName\":{\n        \"label\":\"Display City Name\"\n      },\n      \"displayWeekly\":{\n        \"label\": \"Display Weekly Forecast\"\n      },\n      \"forecastDays\":{\n        \"label\": \"Days To Display\"\n      },\n      \"location\": {\n        \"label\": \"Weather location\"\n      }\n    }\n  },\n  \"card\": {\n    \"weatherDescriptions\": {\n      \"clear\": \"Clear\",\n      \"mainlyClear\": \"Mainly clear\",\n      \"fog\": \"Fog\",\n      \"drizzle\": \"Drizzle\",\n      \"freezingDrizzle\": \"Freezing drizzle\",\n      \"rain\": \"Rain\",\n      \"freezingRain\": \"Freezing rain\",\n      \"snowFall\": \"Snow fall\",\n      \"snowGrains\": \"Snow grains\",\n      \"rainShowers\": \"Rain showers\",\n      \"snowShowers\": \"Snow showers\",\n      \"thunderstorm\": \"Thunderstorm\",\n      \"thunderstormWithHail\": \"Thunderstorm with hail\",\n      \"unknown\": \"Unknown\"\n    }\n  },\n  \"error\": \"An error occurred\"\n}\n"
  },
  {
    "path": "public/locales/en/password-requirements.json",
    "content": "{\n    \"number\": \"Includes number\",\n    \"lowercase\": \"Includes lowercase letter\",\n    \"uppercase\": \"Includes uppercase letter\",\n    \"special\": \"Includes special character\",\n    \"length\": \"Includes at least {{count}} characters\"\n}"
  },
  {
    "path": "public/locales/en/settings/common.json",
    "content": "{\n  \"title\": \"Settings\",\n  \"tooltip\": \"Settings\",\n  \"tabs\": {\n    \"common\": \"Common\",\n    \"customizations\": \"Customizations\"\n  },\n  \"tips\": {\n    \"configTip\": \"Upload your config file by drag and dropping it onto the page!\"\n  },\n  \"credits\": {\n    \"madeWithLove\": \"Made with ❤️ by @\",\n    \"thirdPartyContent\": \"See third party content\",\n    \"thirdPartyContentTable\": {\n      \"dependencyName\": \"Dependency\",\n      \"dependencyVersion\": \"Version\"\n    }\n  },\n  \"grow\": \"Grow grid (take all space)\",\n  \"layout\": {\n    \"preview\": {\n      \"title\": \"Preview\",\n      \"subtitle\": \"Changes will be saved automatically\"\n    },\n    \"divider\": \"Layout options\",\n    \"main\": \"Main\",\n    \"sidebar\": \"Sidebar\",\n    \"cannotturnoff\": \"Cannot be turned off\",\n    \"dashboardlayout\": \"Dashboard layout\",\n    \"enablersidebar\": \"Enable right sidebar\",\n    \"enablelsidebar\": \"Enable left sidebar\",\n    \"enablesearchbar\": \"Enable search bar\",\n    \"enabledocker\": \"Enable docker integration\",\n    \"enableping\": \"Enable pings\",\n    \"enablelsidebardesc\": \"Optional. Can be used for apps and integrations only\",\n    \"enablersidebardesc\": \"Optional. Can be used for apps and integrations only\"\n  }\n}\n"
  },
  {
    "path": "public/locales/en/settings/customization/access.json",
    "content": "{\n  \"allowGuests\": {\n    \"label\": \"Allow anonymous\",\n    \"description\": \"Allow users that are not logged in to view your board\"\n  }\n}"
  },
  {
    "path": "public/locales/en/settings/customization/general.json",
    "content": "{\n  \"text\": \"Customizations allow you to configure and adjust your experience with Homarr to your preferences.\",\n  \"accordeon\": {\n    \"layout\": {\n      \"name\": \"Layout\",\n      \"description\": \"Enable and disable elements on your header and dashboard tiles\"\n    },\n    \"gridstack\": {\n      \"name\": \"Gridstack\",\n      \"description\": \"Customize the behaviour and columns of your dashboard area\"\n    },\n    \"pageMetadata\": {\n      \"name\": \"Page Metadata\",\n      \"description\": \"Adjust titles, logo and PWA\"\n    },\n    \"appereance\": {\n      \"name\": \"Appearance\",\n      \"description\": \"Customize the background, colors and apps appearance\"\n    },\n    \"accessibility\": {\n      \"name\": \"Accessibility\",\n      \"description\": \"Configure Homarr for disabled and handicapped users\"\n    },\n    \"access\": {\n      \"name\": \"Access\",\n      \"description\": \"Configure who has access to your board\"\n    }\n  }\n}\n"
  },
  {
    "path": "public/locales/en/settings/customization/gridstack.json",
    "content": "{\n  \"columnsCount\": {\n    \"labelPreset\": \"Columns in {{size}} size\",\n    \"descriptionPreset\": \"Number of columns when the screen is less than {{pixels}} pixels wide\",\n    \"descriptionExceedsPreset\": \"Number of columns when the screen size exceeds {{pixels}} pixels\"\n  },\n  \"unsavedChanges\": \"You have unsaved changes. Click the Apply changes button below to apply and save.\",\n  \"applyChanges\": \"Apply changes\",\n  \"defaultValues\": \"Default values\"\n}"
  },
  {
    "path": "public/locales/en/settings/customization/opacity-selector.json",
    "content": "{\n  \"label\": \"App Opacity\"\n}"
  },
  {
    "path": "public/locales/en/settings/customization/page-appearance.json",
    "content": "{\n  \"pageTitle\": {\n    \"label\": \"Page Title\",\n    \"description\": \"The dashboard title at the top left\"\n  },\n  \"metaTitle\": {\n    \"label\": \"Meta Title\",\n    \"description\": \"The title displayed in your browser tab\"\n  },\n  \"logo\": {\n    \"label\": \"Logo\",\n    \"description\": \"The logo displayed at the top left\"\n  },\n  \"favicon\": {\n    \"label\": \"Favicon\",\n    \"description\": \"The icon displayed in your browser tab\"\n  },\n  \"background\": {\n    \"label\": \"Background\"\n  },\n  \"backgroundImageAttachment\": {\n    \"label\": \"Background image attachment\",\n    \"options\": {\n      \"fixed\": \"Fixed - Background stays in the same position (recommended)\",\n      \"scroll\": \"Scroll - Background scrolls with your mouse\"\n    }\n  },\n  \"backgroundImageSize\": {\n    \"label\": \"Background image size\",\n    \"options\": {\n      \"cover\": \"Cover - Scales the image as small as possible to cover the entire window by cropping excessive space. (recommended)\",\n      \"contain\": \"Contain - Scales the image as large as possible within its container without cropping or stretching the image.\"\n    }\n  },\n  \"backgroundImageRepeat\": {\n    \"label\": \"Background image attachment\",\n    \"options\": {\n      \"repeat\": \"Repeat - The image is repeated as much as needed to cover the whole background image painting area.\",\n      \"no-repeat\": \"No repeat - The image is not repeated and may not fill the entire space (recommended)\",\n      \"repeat-x\": \"Repeat X - Same as 'Repeat' but only on horizontal axis.\",\n      \"repeat-y\": \"Repeat Y - Same as 'Repeat' but only on vertical axis.\"\n    }\n  },\n  \"customCSS\": {\n    \"label\": \"Custom CSS\",\n    \"description\": \"Further, customize your dashboard using CSS, only recommended for experienced users\",\n    \"placeholder\": \"Custom CSS will be applied last\",\n    \"applying\": \"Applying CSS...\"\n  }\n}\n"
  },
  {
    "path": "public/locales/en/settings/customization/shade-selector.json",
    "content": "{\n  \"label\": \"Shade\"\n}"
  },
  {
    "path": "public/locales/en/tools/docker.json",
    "content": "{\n    \"title\": \"Docker\",\n    \"alerts\": {\n        \"notConfigured\": {\n            \"text\": \"Your Homarr instance does not have Docker configured or it has failed to fetch containers. Please check the documentation on how to set up the integration.\"\n        }\n    },\n    \"modals\": {\n        \"selectBoard\": {\n            \"title\": \"Choose a board\",\n            \"text\": \"Choose the board where you want to add the apps for the selected Docker containers.\",\n            \"form\": {\n                \"board\": {\n                    \"label\": \"Board\"\n                },\n                \"submit\": \"Add apps\"\n            }\n        }\n    },\n    \"notifications\": {\n        \"selectBoard\": {\n            \"success\": {\n                \"title\": \"Added apps to board\",\n                \"message\": \"The apps for the selected Docker containers have been added to the board.\"\n            },\n            \"error\": {\n                \"title\": \"Failed to add apps to board\",\n                \"message\": \"The apps for the selected Docker containers could not be added to the board.\"\n            }\n        }\n    }\n}"
  },
  {
    "path": "public/locales/en/user/preferences.json",
    "content": "{\n    \"metaTitle\": \"Preferences\",\n    \"pageTitle\": \"Your preferences\",\n    \"boards\": {\n        \"defaultBoard\": {\n            \"label\": \"Default board\"\n        }\n    },\n    \"accessibility\": {\n        \"title\": \"Accessibility\",\n        \"disablePulse\": {\n            \"label\": \"Disable ping pulse\",\n            \"description\": \"By default, ping indicators in Homarr will pulse. This may be irritating. This slider will deactivate the animation\"\n        },\n        \"replaceIconsWithDots\": {\n            \"label\": \"Replace ping dots with icons\",\n            \"description\": \"For colorblind users, ping dots may be unrecognizable. This will replace indicators with icons\"\n        }\n    },\n    \"localization\": {\n        \"language\": {\n            \"label\": \"Language\"\n        },\n        \"firstDayOfWeek\": {\n            \"label\": \"First day of the week\",\n            \"options\": {\n                \"monday\": \"Monday\",\n                \"saturday\": \"Saturday\",\n                \"sunday\": \"Sunday\"\n            }\n        }\n    },\n    \"searchEngine\": {\n        \"title\": \"Search engine\",\n        \"custom\": \"Custom\",\n        \"newTab\": {\n            \"label\": \"Open search results in a new tab\"\n        },\n        \"autoFocus\": {\n            \"label\": \"Focus search bar on page load.\",\n            \"description\": \"This will automatically focus the search bar, when you navigate to the board pages. It will only work on desktop devices.\"\n        },\n        \"template\": {\n            \"label\": \"Query URL\",\n            \"description\": \"Use %s as a placeholder for the query\"\n        }\n    }\n}"
  },
  {
    "path": "public/locales/en/widgets/draggable-list.json",
    "content": "{\n  \"noEntries\": {\n    \"title\": \"No entries\",\n    \"text\": \"Use the buttons below to add more entries\"\n  },\n  \"buttonAdd\": \"Add\"\n}\n"
  },
  {
    "path": "public/locales/en/widgets/error-boundary.json",
    "content": "{\n  \"card\": {\n    \"title\": \"Oops, there was an error!\",\n    \"buttons\": {\n      \"details\": \"Details\",\n      \"tryAgain\": \"Try again\"\n    }\n  },\n  \"modal\": {\n    \"text\": \"The widet crashed unexpectitly. Please read the documentation and fix any typos.\",\n    \"label\": \"Occurred error\",\n    \"reportButton\": \"Report this error on GitHub\"\n  }\n}\n"
  },
  {
    "path": "public/locales/en/widgets/location.json",
    "content": "{\n  \"form\": {\n    \"field\": {\n      \"query\": \"City / postal code\",\n      \"latitude\": \"Latitude\",\n      \"longitude\": \"Longitude\"\n    },\n    \"button\": {\n      \"search\": {\n        \"label\": \"Search\",\n        \"disabledTooltip\": \"Please choose a city / postal code first\"\n      }\n    },\n    \"empty\": \"Unknown location\"\n  },\n  \"modal\": {\n    \"title\": \"Choose a location\",\n    \"table\": {\n      \"header\": {\n        \"city\": \"City\",\n        \"country\": \"Country\",\n        \"coordinates\": \"Coordinates\",\n        \"population\": \"Population\"\n      },\n      \"action\": {\n        \"select\": \"Select {{city}}, {{countryCode}}\"\n      },\n      \"population\": {\n        \"fallback\": \"Unknown\"\n      },\n      \"nothingFound\": {\n        \"title\": \"Nothing found\",\n        \"description\": \"Please try another search term\"\n      }\n    }\n  }\n}"
  },
  {
    "path": "public/locales/en/zod.json",
    "content": "{\n    \"errors\": {\n        \"default\": \"This field is invalid\",\n        \"required\": \"This field is required\",\n        \"string\": {\n            \"startsWith\": \"This field must start with {{startsWith}}\",\n            \"endsWith\": \"This field must end with {{endsWith}}\",\n            \"includes\": \"This field must include {{includes}}\"\n        },\n        \"tooSmall\": {\n            \"string\": \"This field must be at least {{minimum}} characters long\",\n            \"number\": \"This field must be greater than or equal to {{minimum}}\"\n        },\n        \"tooBig\": {\n            \"string\": \"This field must be at most {{maximum}} characters long\",\n            \"number\": \"This field must be less than or equal to {{maximum}}\"\n        },\n        \"custom\": {\n            \"passwordMatch\": \"Passwords must match\"\n        }\n    }\n}"
  },
  {
    "path": "public/site.webmanifest",
    "content": "{\n  \"name\": \"Homarr\",\n  \"start_url\": \"/\",\n  \"display\": \"standalone\",\n  \"icons\": [\n    {\n      \"src\": \"/imgs/pwa/manifest/manifest-icon-192.maskable.png\",\n      \"sizes\": \"192x192\",\n      \"type\": \"image/png\",\n      \"purpose\": \"any\"\n    },\n    {\n      \"src\": \"/imgs/pwa/manifest/manifest-icon-192.maskable.png\",\n      \"sizes\": \"192x192\",\n      \"type\": \"image/png\",\n      \"purpose\": \"maskable\"\n    },\n    {\n      \"src\": \"/imgs/pwa/manifest/manifest-icon-512.maskable.png\",\n      \"sizes\": \"512x512\",\n      \"type\": \"image/png\",\n      \"purpose\": \"any\"\n    },\n    {\n      \"src\": \"/imgs/pwa/manifest/manifest-icon-512.maskable.png\",\n      \"sizes\": \"512x512\",\n      \"type\": \"image/png\",\n      \"purpose\": \"maskable\"\n    }\n  ]\n}"
  },
  {
    "path": "scripts/run.sh",
    "content": "#!/bin/sh\n\necho \"Exporting hostname...\"\nexport NEXTAUTH_URL_INTERNAL=\"http://$HOSTNAME:${PORT:-7575}\"\n\necho \"Migrating database...\"\ncd ./migrate; yarn db:migrate & PID=$!\n# Wait for migration to finish\nwait $PID\n\n## If 'default.json' does not exist in '/app/data/configs', we copy it from '/app/data/default.json'\ncp -n /app/data/default.json /app/data/configs/default.json\n\necho \"Starting production server...\"\nnode /app/server.js & PID=$!\n\nwait $PID"
  },
  {
    "path": "src/components/AppAvatar.test.tsx",
    "content": "import { cleanup, render, screen } from '@testing-library/react';\nimport { afterEach, describe, expect, it } from 'vitest';\n\nimport { AppAvatar } from './AppAvatar';\n\ndescribe('AppAvatar', () => {\n  afterEach(cleanup);\n\n  it('display placeholder when no url', () => {\n    render(<AppAvatar iconUrl=\"\" color=\"blue\" />);\n\n    expect(screen.getByTestId('app-avatar')).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "src/components/AppAvatar.tsx",
    "content": "import { Avatar, DefaultMantineColor, useMantineTheme } from '@mantine/core';\n\nexport const AppAvatar = ({\n  iconUrl,\n  color,\n}: {\n  iconUrl: string;\n  color?: DefaultMantineColor | undefined;\n}) => {\n  const { colors, colorScheme } = useMantineTheme();\n\n  return (\n    <Avatar\n      data-testid=\"app-avatar\"\n      src={iconUrl}\n      bg={colorScheme === 'dark' ? colors.gray[8] : colors.gray[2]}\n      size=\"sm\"\n      radius=\"xl\"\n      p={4}\n      styles={{\n        root: {\n          borderColor: color !== undefined ? colors[color] : undefined,\n        },\n      }}\n    />\n  );\n};\n"
  },
  {
    "path": "src/components/Board/Customize/Access/AccessCustomization.tsx",
    "content": "import { Stack, Switch } from '@mantine/core';\nimport { useTranslation } from 'next-i18next';\nimport { useBoardCustomizationFormContext } from '~/components/Board/Customize/form';\n\nexport const AccessCustomization = () => {\n  const { t } = useTranslation('settings/customization/access');\n  const form = useBoardCustomizationFormContext();\n  return (\n    <Stack>\n      <Switch\n        label={t('allowGuests.label')}\n        description={t('allowGuests.description')}\n        {...form.getInputProps('access.allowGuests', { type: 'checkbox' })}\n      />\n    </Stack>\n  );\n};\n"
  },
  {
    "path": "src/components/Board/Customize/Appearance/AppearanceCustomization.tsx",
    "content": "import {\n  CheckIcon,\n  ColorSwatch,\n  Group,\n  Input,\n  MantineTheme,\n  Select,\n  Slider,\n  Stack,\n  TextInput,\n  createStyles,\n  rem,\n  useMantineTheme,\n} from '@mantine/core';\nimport { useTranslation } from 'next-i18next';\nimport { highlight, languages } from 'prismjs';\nimport Editor from 'react-simple-code-editor';\nimport { useColorTheme } from '~/tools/color';\nimport {\n  BackgroundImageAttachment,\n  BackgroundImageRepeat,\n  BackgroundImageSize,\n} from '~/types/settings';\n\nimport { useBoardCustomizationFormContext } from '../form';\n\nexport const AppearanceCustomization = () => {\n  const { t } = useTranslation('settings/customization/page-appearance');\n  const form = useBoardCustomizationFormContext();\n\n  return (\n    <Stack spacing=\"sm\">\n      <TextInput\n        label={t('background.label')}\n        placeholder=\"/imgs/backgrounds/background.png\"\n        {...form.getInputProps('appearance.backgroundSrc')}\n      />\n      <Select\n        label={t('backgroundImageAttachment.label')}\n        data={BackgroundImageAttachment.map((attachment) => ({\n          value: attachment,\n          label: t(`backgroundImageAttachment.options.${attachment}`) as string,\n        }))}\n        {...form.getInputProps('appearance.backgroundImageAttachment')}\n      />\n\n      <Select\n        label={t('backgroundImageSize.label')}\n        data={BackgroundImageSize.map((size) => ({\n          value: size,\n          label: t(`backgroundImageSize.options.${size}`) as string,\n        }))}\n        {...form.getInputProps('appearance.backgroundImageSize')}\n      />\n\n      <Select\n        label={t('backgroundImageRepeat.label')}\n        data={BackgroundImageRepeat.map((repeat) => ({\n          value: repeat,\n          label: t(`backgroundImageRepeat.options.${repeat}`) as string,\n        }))}\n        {...form.getInputProps('appearance.backgroundImageRepeat')}\n      />\n      <ColorSelector type=\"primaryColor\" />\n      <ColorSelector type=\"secondaryColor\" />\n      <ShadeSelector />\n      <OpacitySlider />\n      <CustomCssInput />\n    </Stack>\n  );\n};\n\ntype ColorSelectorProps = {\n  type: 'primaryColor' | 'secondaryColor';\n};\nconst ColorSelector = ({ type }: ColorSelectorProps) => {\n  const { t } = useTranslation('boards/customize');\n  const theme = useMantineTheme();\n  const form = useBoardCustomizationFormContext();\n  const { setPrimaryColor, setSecondaryColor } = useColorTheme();\n\n  const colors = Object.keys(theme.colors).map((color) => ({\n    swatch: theme.colors[color][6],\n    color,\n  }));\n\n  return (\n    <Input.Wrapper label={t(`settings.appearance.${type}`)}>\n      <Group>\n        {colors.map(({ color, swatch }) => (\n          <ColorSwatch\n            key={color}\n            component=\"button\"\n            type=\"button\"\n            onClick={() => {\n              form.getInputProps(`appearance.${type}`).onChange(color);\n              if (type === 'primaryColor') {\n                setPrimaryColor(color);\n              } else {\n                setSecondaryColor(color);\n              }\n            }}\n            color={swatch}\n            style={{ cursor: 'pointer' }}\n          >\n            {color === form.values.appearance[type] && <CheckIcon width={rem(10)} />}\n          </ColorSwatch>\n        ))}\n      </Group>\n    </Input.Wrapper>\n  );\n};\n\nconst ShadeSelector = () => {\n  const form = useBoardCustomizationFormContext();\n  const theme = useMantineTheme();\n  const { setPrimaryShade } = useColorTheme();\n\n  const primaryColor = form.values.appearance.primaryColor;\n  const primaryShades = theme.colors[primaryColor].map((_, shade) => ({\n    swatch: theme.colors[primaryColor][shade],\n    shade,\n  }));\n\n  return (\n    <Input.Wrapper label=\"Shade\">\n      <Group>\n        {primaryShades.map(({ shade, swatch }) => (\n          <ColorSwatch\n            key={shade}\n            component=\"button\"\n            type=\"button\"\n            onClick={() => {\n              form.getInputProps(`appearance.shade`).onChange(shade);\n              setPrimaryShade(shade as MantineTheme['primaryShade']);\n            }}\n            color={swatch}\n            style={{ cursor: 'pointer' }}\n          >\n            {shade === form.values.appearance.shade && <CheckIcon width={rem(10)} />}\n          </ColorSwatch>\n        ))}\n      </Group>\n    </Input.Wrapper>\n  );\n};\n\nconst OpacitySlider = () => {\n  const { t } = useTranslation('settings/customization/opacity-selector');\n  const form = useBoardCustomizationFormContext();\n\n  return (\n    <Input.Wrapper label={t('label')} mb=\"sm\">\n      <Slider\n        step={10}\n        min={10}\n        marks={opacityMarks}\n        styles={{ markLabel: { fontSize: 'xx-small' } }}\n        {...form.getInputProps('appearance.opacity')}\n      />\n    </Input.Wrapper>\n  );\n};\n\nconst opacityMarks = [\n  { value: 10, label: '10%' },\n  { value: 20, label: '20%' },\n  { value: 30, label: '30%' },\n  { value: 40, label: '40%' },\n  { value: 50, label: '50%' },\n  { value: 60, label: '60%' },\n  { value: 70, label: '70%' },\n  { value: 80, label: '80%' },\n  { value: 90, label: '90%' },\n  { value: 100, label: '100%' },\n];\n\nconst CustomCssInput = () => {\n  const { t } = useTranslation('settings/customization/page-appearance');\n  const { classes } = useStyles();\n  const form = useBoardCustomizationFormContext();\n\n  return (\n    <Input.Wrapper\n      label={t('customCSS.label')}\n      description={t('customCSS.description')}\n      inputWrapperOrder={['label', 'description', 'input', 'error']}\n    >\n      <div className={classes.codeEditorRoot}>\n        <Editor\n          {...form.getInputProps('appearance.customCss')}\n          onValueChange={(code) => form.getInputProps('appearance.customCss').onChange(code)}\n          highlight={(code) => highlight(code, languages.extend('css', {}), 'css')}\n          padding={10}\n          style={{\n            fontFamily: '\"Fira code\", \"Fira Mono\", monospace',\n            fontSize: 12,\n            minHeight: 250,\n          }}\n        />\n      </div>\n    </Input.Wrapper>\n  );\n};\n\nconst useStyles = createStyles(({ colors, colorScheme, radius }) => ({\n  codeEditorFooter: {\n    borderBottomLeftRadius: radius.sm,\n    borderBottomRightRadius: radius.sm,\n    backgroundColor: colorScheme === 'dark' ? colors.dark[7] : undefined,\n  },\n  codeEditorRoot: {\n    marginTop: 4,\n    borderColor: colorScheme === 'dark' ? colors.dark[4] : colors.gray[4],\n    borderWidth: 1,\n    borderStyle: 'solid',\n    borderRadius: radius.sm,\n  },\n  codeEditor: {\n    backgroundColor: colorScheme === 'dark' ? colors.dark[6] : 'white',\n    fontSize: 12,\n\n    '& ::placeholder': {\n      color: colorScheme === 'dark' ? colors.dark[3] : colors.gray[5],\n    },\n  },\n}));\n"
  },
  {
    "path": "src/components/Board/Customize/Gridstack/GridstackCustomization.tsx",
    "content": "import { Input, Slider } from '@mantine/core';\nimport { useTranslation } from 'next-i18next';\nimport { GridstackBreakpoints } from '~/constants/gridstack-breakpoints';\n\nimport { useBoardCustomizationFormContext } from '../form';\n\nexport const GridstackCustomization = () => {\n  const { t } = useTranslation('settings/customization/gridstack');\n  const form = useBoardCustomizationFormContext();\n\n  return (\n    <>\n      <Input.Wrapper\n        label={t('columnsCount.labelPreset', { size: t('common:breakPoints.small') })}\n        description={t('columnsCount.descriptionPreset', { pixels: GridstackBreakpoints.medium })}\n        mb=\"md\"\n      >\n        <Slider min={1} max={8} mt=\"xs\" {...form.getInputProps('gridstack.sm')} />\n      </Input.Wrapper>\n      <Input.Wrapper\n        label={t('columnsCount.labelPreset', { size: t('common:breakPoints.medium') })}\n        description={t('columnsCount.descriptionPreset', { pixels: GridstackBreakpoints.large })}\n        mb=\"md\"\n      >\n        <Slider min={3} max={16} mt=\"xs\" {...form.getInputProps('gridstack.md')} />\n      </Input.Wrapper>\n      <Input.Wrapper\n        label={t('columnsCount.labelPreset', { size: t('common:breakPoints.large') })}\n        description={t('columnsCount.descriptionExceedsPreset', {\n          pixels: GridstackBreakpoints.large,\n        })}\n      >\n        <Slider min={5} max={20} mt=\"xs\" {...form.getInputProps('gridstack.lg')} />\n      </Input.Wrapper>\n    </>\n  );\n};\n"
  },
  {
    "path": "src/components/Board/Customize/Layout/LayoutCustomization.tsx",
    "content": "import { Checkbox, Grid, Stack } from '@mantine/core';\nimport { useTranslation } from 'next-i18next';\n\nimport { useBoardCustomizationFormContext } from '../form';\nimport { LayoutPreview } from './LayoutPreview';\n\nexport const LayoutCustomization = () => {\n  const { t } = useTranslation('settings/common');\n  const form = useBoardCustomizationFormContext();\n\n  return (\n    <Grid gutter=\"xl\" align=\"stretch\">\n      <Grid.Col span={12} sm={6}>\n        <LayoutPreview\n          showLeftSidebar={form.values.layout.leftSidebarEnabled}\n          showRightSidebar={form.values.layout.rightSidebarEnabled}\n          showPings={form.values.layout.pingsEnabled}\n        />\n      </Grid.Col>\n      <Grid.Col span={12} sm={6}>\n        <Stack spacing=\"sm\" h=\"100%\" justify=\"space-between\">\n          <Stack spacing=\"xs\">\n            <Checkbox\n              label={t('layout.enablelsidebar')}\n              description={t('layout.enablelsidebardesc')}\n              {...form.getInputProps('layout.leftSidebarEnabled', { type: 'checkbox' })}\n            />\n            <Checkbox\n              label={t('layout.enablersidebar')}\n              description={t('layout.enablersidebardesc')}\n              {...form.getInputProps('layout.rightSidebarEnabled', { type: 'checkbox' })}\n            />\n            <Checkbox\n              label={t('layout.enableping')}\n              {...form.getInputProps('layout.pingsEnabled', { type: 'checkbox' })}\n            />\n          </Stack>\n        </Stack>\n      </Grid.Col>\n    </Grid>\n  );\n};\n"
  },
  {
    "path": "src/components/Board/Customize/Layout/LayoutPreview.tsx",
    "content": "import { Flex, Group, Indicator, Paper, Stack, createStyles } from '@mantine/core';\nimport { Logo } from '~/components/layout/Common/Logo';\nimport { createDummyArray } from '~/tools/client/arrays';\n\ntype LayoutPreviewProps = {\n  showLeftSidebar: boolean;\n  showRightSidebar: boolean;\n  showPings: boolean;\n};\nexport const LayoutPreview = ({\n  showLeftSidebar,\n  showRightSidebar,\n  showPings,\n}: LayoutPreviewProps) => {\n  const { classes } = useStyles();\n\n  return (\n    <Stack spacing=\"xs\">\n      <Paper px=\"xs\" py={4} withBorder>\n        <Group position=\"apart\">\n          <div style={{ flex: 1 }}>\n            <Logo size=\"xs\" />\n          </div>\n          <BaseElement width={60} height={10} />\n          <Group style={{ flex: 1 }} position=\"right\">\n            <BaseElement width={10} height={10} />\n          </Group>\n        </Group>\n      </Paper>\n\n      <Flex gap={6}>\n        {showLeftSidebar && (\n          <Paper className={classes.secondaryWrapper} p=\"xs\" withBorder>\n            <Flex gap={5} wrap=\"wrap\" align=\"end\" w={65}>\n              {createDummyArray(5).map((_item, index) => (\n                <PlaceholderElement\n                  height={index % 4 === 0 ? 60 + 5 : 30}\n                  width={30}\n                  key={`example-item-right-sidebard-${index}`}\n                  index={index}\n                  showPing={showPings}\n                />\n              ))}\n            </Flex>\n          </Paper>\n        )}\n\n        <Paper className={classes.primaryWrapper} p=\"xs\" withBorder>\n          <Flex gap={5} wrap=\"wrap\">\n            {createDummyArray(10).map((_item, index) => (\n              <PlaceholderElement\n                height={30}\n                width={index % 5 === 0 ? 60 + 5 : 30}\n                key={`example-item-main-${index}`}\n                index={index}\n                showPing={showPings}\n              />\n            ))}\n          </Flex>\n        </Paper>\n\n        {showRightSidebar && (\n          <Paper className={classes.secondaryWrapper} p=\"xs\" withBorder>\n            <Flex gap={5} align=\"start\" wrap=\"wrap\" w={65}>\n              {createDummyArray(5).map((_item, index) => (\n                <PlaceholderElement\n                  height={30}\n                  width={index % 4 === 0 ? 60 + 5 : 30}\n                  key={`example-item-right-sidebard-${index}`}\n                  index={index}\n                  showPing={showPings}\n                />\n              ))}\n            </Flex>\n          </Paper>\n        )}\n      </Flex>\n    </Stack>\n  );\n};\n\nconst useStyles = createStyles((theme) => ({\n  primaryWrapper: {\n    flexGrow: 2,\n  },\n  secondaryWrapper: {\n    flexGrow: 1,\n    maxWidth: 100,\n  },\n}));\n\nconst BaseElement = ({ height, width }: { height: number; width: number }) => (\n  <Paper\n    sx={(theme) => ({\n      backgroundColor: theme.colorScheme === 'dark' ? theme.colors.gray[8] : theme.colors.gray[1],\n    })}\n    h={height}\n    p={2}\n    w={width}\n  />\n);\n\ntype PlaceholderElementProps = {\n  height: number;\n  width: number;\n  showPing: boolean;\n  index: number;\n};\nconst PlaceholderElement = ({ height, width, showPing, index }: PlaceholderElementProps) => {\n  if (showPing) {\n    return (\n      <Indicator\n        position=\"bottom-end\"\n        size={5}\n        offset={10}\n        color={index % 4 === 0 ? 'red' : 'green'}\n        zIndex={0}\n      >\n        <BaseElement width={width} height={height} />\n      </Indicator>\n    );\n  }\n\n  return <BaseElement width={width} height={height} />;\n};\n"
  },
  {
    "path": "src/components/Board/Customize/PageMetadata/PageMetadataCustomization.tsx",
    "content": "import { Grid, Stack, TextInput } from '@mantine/core';\nimport { useTranslation } from 'next-i18next';\n\nimport { useBoardCustomizationFormContext } from '../form';\n\nexport const PageMetadataCustomization = () => {\n  const { t } = useTranslation('settings/customization/page-appearance');\n  const form = useBoardCustomizationFormContext();\n  return (\n    <Grid gutter=\"md\" align=\"stretch\">\n      <Grid.Col span={12} sm={6}>\n        <TextInput\n          label={t('pageTitle.label')}\n          description={t('pageTitle.description')}\n          placeholder=\"homarr\"\n          {...form.getInputProps('pageMetadata.pageTitle')}\n        />\n      </Grid.Col>\n      <Grid.Col span={12} sm={6}>\n        <TextInput\n          label={t('metaTitle.label')}\n          description={t('metaTitle.description')}\n          placeholder=\"homarr - the best dashboard\"\n          {...form.getInputProps('pageMetadata.metaTitle')}\n        />\n      </Grid.Col>\n      <Grid.Col span={12} sm={6}>\n        <TextInput\n          label={t('logo.label')}\n          description={t('logo.description')}\n          placeholder=\"/imgs/logo/logo.png\"\n          {...form.getInputProps('pageMetadata.logoSrc')}\n        />\n      </Grid.Col>\n      <Grid.Col span={12} sm={6}>\n        <TextInput\n          label={t('favicon.label')}\n          description={t('favicon.description')}\n          placeholder=\"/imgs/favicon/favicon.svg\"\n          {...form.getInputProps('pageMetadata.faviconSrc')}\n        />\n      </Grid.Col>\n    </Grid>\n  );\n};\n"
  },
  {
    "path": "src/components/Board/Customize/form.ts",
    "content": "import { createFormContext } from '@mantine/form';\nimport { z } from 'zod';\nimport { boardCustomizationSchema } from '~/validations/boards';\n\nexport const [\n  BoardCustomizationFormProvider,\n  useBoardCustomizationFormContext,\n  useBoardCustomizationForm,\n] = createFormContext<z.infer<typeof boardCustomizationSchema>>();\n"
  },
  {
    "path": "src/components/Dashboard/Dashboard.tsx",
    "content": "import { MobileRibbons } from './Mobile/Ribbon/MobileRibbon';\nimport { DashboardDetailView } from './Views/DetailView';\nimport { DashboardEditView } from './Views/EditView';\nimport { useEditModeStore } from './Views/useEditModeStore';\n\nexport const Dashboard = () => {\n  const isEditMode = useEditModeStore((x) => x.enabled);\n\n  return (\n    <>\n      {/* The following elemens are splitted because gridstack doesn't reinitialize them when using same item. */}\n      {isEditMode ? <DashboardEditView /> : <DashboardDetailView />}\n      <MobileRibbons />\n    </>\n  );\n};\n"
  },
  {
    "path": "src/components/Dashboard/Mobile/Ribbon/MobileRibbon.tsx",
    "content": "import { ActionIcon, Space, createStyles } from '@mantine/core';\nimport { useDisclosure } from '@mantine/hooks';\nimport { IconChevronLeft, IconChevronRight } from '@tabler/icons-react';\nimport { useConfigContext } from '~/config/provider';\nimport { useScreenLargerThan } from '~/hooks/useScreenLargerThan';\n\nimport { MobileRibbonSidebarDrawer } from './MobileRibbonSidebarDrawer';\n\nexport const MobileRibbons = () => {\n  const { classes, cx } = useStyles();\n  const { config } = useConfigContext();\n  const [openedRight, rightSidebar] = useDisclosure(false);\n  const [openedLeft, leftSidebar] = useDisclosure(false);\n  const screenLargerThanMd = useScreenLargerThan('md');\n\n  if (screenLargerThanMd || !config) {\n    return <></>;\n  }\n\n  const layoutSettings = config.settings.customization.layout;\n\n  return (\n    <div className={classes.root}>\n      {layoutSettings.enabledLeftSidebar ? (\n        <>\n          <ActionIcon\n            onClick={leftSidebar.open}\n            className={cx(classes.button, classes.removeBorderLeft)}\n            variant=\"default\"\n          >\n            <IconChevronRight />\n          </ActionIcon>\n          <MobileRibbonSidebarDrawer\n            onClose={leftSidebar.close}\n            opened={openedLeft}\n            location=\"left\"\n          />\n        </>\n      ) : (\n        <Space />\n      )}\n\n      {layoutSettings.enabledRightSidebar ? (\n        <>\n          <ActionIcon\n            onClick={rightSidebar.open}\n            className={cx(classes.button, classes.removeBorderRight)}\n            variant=\"default\"\n          >\n            <IconChevronLeft />\n          </ActionIcon>\n          <MobileRibbonSidebarDrawer\n            onClose={rightSidebar.close}\n            opened={openedRight}\n            location=\"right\"\n          />\n        </>\n      ) : null}\n    </div>\n  );\n};\n\nconst useStyles = createStyles(() => ({\n  root: {\n    position: 'fixed',\n    top: 0,\n    left: 0,\n    width: '100%',\n    height: '100%',\n    display: 'flex',\n    alignItems: 'center',\n    justifyContent: 'space-between',\n    pointerEvents: 'none',\n  },\n  button: {\n    height: 100,\n    width: 36,\n    pointerEvents: 'auto',\n  },\n  removeBorderLeft: {\n    borderTopLeftRadius: 0,\n    borderBottomLeftRadius: 0,\n  },\n  removeBorderRight: {\n    borderTopRightRadius: 0,\n    borderBottomRightRadius: 0,\n  },\n}));\n"
  },
  {
    "path": "src/components/Dashboard/Mobile/Ribbon/MobileRibbonSidebarDrawer.tsx",
    "content": "import { Drawer, Title } from '@mantine/core';\nimport { useTranslation } from 'next-i18next';\n\nimport { DashboardSidebar } from '../../Wrappers/Sidebar/Sidebar';\n\ninterface MobileRibbonSidebarDrawerProps {\n  onClose: () => void;\n  opened: boolean;\n  location: 'left' | 'right';\n}\n\nexport const MobileRibbonSidebarDrawer = ({\n  location,\n  ...props\n}: MobileRibbonSidebarDrawerProps) => {\n  const { t } = useTranslation('layout/mobile/drawer');\n  return (\n    <Drawer\n      padding={10}\n      position={location}\n      title={<Title order={4}>{t('title', { position: location })}</Title>}\n      style={{\n        display: 'flex',\n        justifyContent: 'center',\n      }}\n      styles={{\n        title: {\n          width: '100%',\n        },\n      }}\n      transitionProps={{ transition: `slide-${location === 'right' ? 'left' : 'right'}` }}\n      {...props}\n    >\n      <DashboardSidebar location={location} isGridstackReady />\n    </Drawer>\n  );\n};\n"
  },
  {
    "path": "src/components/Dashboard/Modals/ChangePosition/ChangeAppPositionModal.tsx",
    "content": "import { SelectItem } from '@mantine/core';\nimport { ContextModalProps, closeModal } from '@mantine/modals';\nimport { useConfigContext } from '~/config/provider';\nimport { useConfigStore } from '~/config/store';\nimport { AppType } from '~/types/app';\n\nimport { useGridstackStore, useWrapperColumnCount } from '../../Wrappers/gridstack/store';\nimport { ChangePositionModal } from './ChangePositionModal';\n\ntype ChangeAppPositionModalInnerProps = {\n  app: AppType;\n};\n\nexport const ChangeAppPositionModal = ({\n  id,\n  context,\n  innerProps,\n}: ContextModalProps<ChangeAppPositionModalInnerProps>) => {\n  const { name: configName } = useConfigContext();\n  const updateConfig = useConfigStore((x) => x.updateConfig);\n  const shapeSize = useGridstackStore((x) => x.currentShapeSize);\n\n  if (!shapeSize) return null;\n\n  const handleSubmit = (x: number, y: number, width: number, height: number) => {\n    if (!configName) {\n      return;\n    }\n\n    updateConfig(\n      configName,\n      (previousConfig) => ({\n        ...previousConfig,\n        apps: [\n          ...previousConfig.apps.filter((x) => x.id !== innerProps.app.id),\n          {\n            ...innerProps.app,\n            shape: {\n              ...innerProps.app.shape,\n              [shapeSize]: { location: { x, y }, size: { width, height } },\n            },\n          },\n        ],\n      }),\n      true\n    );\n    context.closeModal(id);\n  };\n\n  const handleCancel = () => {\n    closeModal(id);\n  };\n\n  const widthData = useWidthData();\n  const heightData = useHeightData();\n\n  return (\n    <ChangePositionModal\n      onSubmit={handleSubmit}\n      onCancel={handleCancel}\n      widthData={widthData}\n      heightData={heightData}\n      initialX={innerProps.app.shape[shapeSize]?.location.x}\n      initialY={innerProps.app.shape[shapeSize]?.location.y}\n      initialWidth={innerProps.app.shape[shapeSize]?.size.width}\n      initialHeight={innerProps.app.shape[shapeSize]?.size.height}\n    />\n  );\n};\n\nconst useHeightData = (): SelectItem[] => {\n  const mainAreaWidth = useGridstackStore((x) => x.mainAreaWidth);\n  const wrapperColumnCount = useWrapperColumnCount();\n\n  return Array.from(Array(11).keys()).map((n) => {\n    const index = n + 1;\n    return {\n      value: index.toString(),\n      label: `${Math.floor(index * (mainAreaWidth! / wrapperColumnCount!))}px`,\n    };\n  });\n};\n\nconst useWidthData = (): SelectItem[] => {\n  const wrapperColumnCount = useWrapperColumnCount();\n  return Array.from(Array(wrapperColumnCount!).keys()).map((n) => {\n    const index = n + 1;\n    return {\n      value: index.toString(),\n      // eslint-disable-next-line no-mixed-operators\n      label: `${((100 / wrapperColumnCount!) * index).toFixed(2)}%`,\n    };\n  });\n};\n"
  },
  {
    "path": "src/components/Dashboard/Modals/ChangePosition/ChangePositionModal.tsx",
    "content": "import { Button, Flex, Grid, NumberInput, Select, SelectItem } from '@mantine/core';\nimport { useForm } from '@mantine/form';\nimport { useTranslation } from 'next-i18next';\nimport { useConfigContext } from '~/config/provider';\n\ninterface ChangePositionModalProps {\n  initialX?: number;\n  initialY?: number;\n  initialWidth?: number;\n  initialHeight?: number;\n  widthData: SelectItem[];\n  heightData: SelectItem[];\n  onSubmit: (x: number, y: number, width: number, height: number) => void;\n  onCancel: () => void;\n}\n\nexport const ChangePositionModal = ({\n  initialX,\n  initialY,\n  initialWidth,\n  initialHeight,\n  widthData,\n  heightData,\n  onCancel,\n  onSubmit,\n}: ChangePositionModalProps) => {\n  const { name: configName } = useConfigContext();\n\n  const form = useForm<FormType>({\n    initialValues: {\n      x: initialX ?? null,\n      y: initialY ?? null,\n      width: initialWidth?.toString() ?? '',\n      height: initialHeight?.toString() ?? '',\n    },\n    validateInputOnChange: true,\n    validateInputOnBlur: true,\n  });\n\n  const handleSubmit = () => {\n    if (!configName) {\n      return;\n    }\n\n    const width = parseInt(form.values.width, 10);\n    const height = parseInt(form.values.height, 10);\n\n    if (\n      form.values.x === null ||\n      form.values.y === null ||\n      Number.isNaN(width) ||\n      Number.isNaN(height)\n    ) {\n      return;\n    }\n\n    onSubmit(form.values.x, form.values.y, width, height);\n  };\n\n  const { t } = useTranslation(['layout/modals/change-position', 'common']);\n\n  return (\n    <form onSubmit={form.onSubmit(handleSubmit)}>\n      <Grid>\n        <Grid.Col xs={12} md={6}>\n          <NumberInput\n            max={99}\n            min={0}\n            label={t('xPosition')}\n            description={t('layout/modals/change-position:zeroOrHigher')}\n            {...form.getInputProps('x')}\n          />\n        </Grid.Col>\n\n        <Grid.Col xs={12} md={6}>\n          <NumberInput\n            max={99}\n            min={0}\n            label={t('layout/modals/change-position:yPosition')}\n            description={t('layout/modals/change-position:zeroOrHigher')}\n            {...form.getInputProps('y')}\n          />\n        </Grid.Col>\n      </Grid>\n\n      <Grid>\n        <Grid.Col xs={12} md={6}>\n          <Select\n            data={widthData}\n            max={24}\n            min={1}\n            label={t('common:attributes.width')}\n            description={t('layout/modals/change-position:betweenXandY', {\n              min: widthData.at(0)?.label,\n              max: widthData.at(-1)?.label,\n            })}\n            withinPortal\n            {...form.getInputProps('width')}\n          />\n        </Grid.Col>\n\n        <Grid.Col xs={12} md={6}>\n          <Select\n            data={heightData}\n            max={24}\n            min={1}\n            label={t('common:attributes.height')}\n            description={t('layout/modals/change-position:betweenXandY', {\n              min: heightData.at(0)?.label,\n              max: heightData.at(-1)?.label,\n            })}\n            withinPortal\n            {...form.getInputProps('height')}\n          />\n        </Grid.Col>\n      </Grid>\n\n      <Flex justify=\"end\" gap=\"sm\" mt=\"md\">\n        <Button onClick={() => onCancel()} variant=\"light\" color=\"gray\">\n          {t('common:cancel')}\n        </Button>\n        <Button type=\"submit\">{t('common:save')}</Button>\n      </Flex>\n    </form>\n  );\n};\n\ntype FormType = {\n  x: number | null;\n  y: number | null;\n  width: string;\n  height: string;\n};\n"
  },
  {
    "path": "src/components/Dashboard/Modals/ChangePosition/ChangeWidgetPositionModal.tsx",
    "content": "import { SelectItem } from '@mantine/core';\nimport { ContextModalProps, closeModal } from '@mantine/modals';\nimport { useConfigContext } from '~/config/provider';\nimport { useConfigStore } from '~/config/store';\n\nimport widgets from '../../../../widgets';\nimport { WidgetChangePositionModalInnerProps } from '../../Tiles/Widgets/WidgetsMenu';\nimport { useGridstackStore, useWrapperColumnCount } from '../../Wrappers/gridstack/store';\nimport { ChangePositionModal } from './ChangePositionModal';\n\nexport const ChangeWidgetPositionModal = ({\n  context,\n  id,\n  innerProps,\n}: ContextModalProps<WidgetChangePositionModalInnerProps>) => {\n  const { name: configName } = useConfigContext();\n  const updateConfig = useConfigStore((x) => x.updateConfig);\n  const shapeSize = useGridstackStore((x) => x.currentShapeSize);\n\n  if (shapeSize === null) {\n    return null;\n  }\n\n  const handleSubmit = (x: number, y: number, width: number, height: number) => {\n    if (!configName) {\n      return;\n    }\n\n    updateConfig(\n      configName,\n      (prev) => {\n        const currentWidget = prev.widgets.find((x) => x.id === innerProps.widgetId);\n        currentWidget!.shape[shapeSize] = {\n          location: {\n            x,\n            y,\n          },\n          size: {\n            height,\n            width,\n          },\n        };\n\n        return {\n          ...prev,\n          widgets: [...prev.widgets.filter((x) => x.id !== innerProps.widgetId), currentWidget!],\n        };\n      },\n      true\n    );\n    context.closeModal(id);\n  };\n\n  const handleCancel = () => {\n    closeModal(id);\n  };\n\n  const widthData = useWidthData(innerProps.widgetType);\n  const heightData = useHeightData(innerProps.widgetType);\n\n  return (\n    <ChangePositionModal\n      onSubmit={handleSubmit}\n      onCancel={handleCancel}\n      heightData={heightData}\n      widthData={widthData}\n      initialX={innerProps.widget.shape[shapeSize]?.location.x}\n      initialY={innerProps.widget.shape[shapeSize]?.location.y}\n      initialWidth={innerProps.widget.shape[shapeSize]?.size.width}\n      initialHeight={innerProps.widget.shape[shapeSize]?.size.height}\n    />\n  );\n};\n\nconst useWidthData = (integration: string): SelectItem[] => {\n  const wrapperColumnCount = useWrapperColumnCount();\n  const currentWidget = widgets[integration as keyof typeof widgets];\n  if (!currentWidget) return [];\n  const offset = currentWidget.gridstack.minWidth ?? 2;\n  const length =\n    (currentWidget.gridstack.maxWidth > wrapperColumnCount!\n      ? wrapperColumnCount!\n      : currentWidget.gridstack.maxWidth) - offset;\n  return Array.from({ length: length + 1 }, (_, i) => i + offset).map((n) => ({\n    value: n.toString(),\n    // eslint-disable-next-line no-mixed-operators\n    label: `${((100 / wrapperColumnCount!) * n).toFixed(2)}%`,\n  }));\n};\n\nconst useHeightData = (integration: string): SelectItem[] => {\n  const mainAreaWidth = useGridstackStore((x) => x.mainAreaWidth);\n  const wrapperColumnCount = useWrapperColumnCount();\n\n  const currentWidget = widgets[integration as keyof typeof widgets];\n  if (!currentWidget) return [];\n  const offset = currentWidget.gridstack.minHeight ?? 2;\n  const length = (currentWidget.gridstack.maxHeight ?? 12) - offset;\n  return Array.from({ length }, (_, i) => i + offset).map((n) => ({\n    value: n.toString(),\n    label: `${(mainAreaWidth! / wrapperColumnCount!) * n}px`,\n  }));\n};\n"
  },
  {
    "path": "src/components/Dashboard/Modals/EditAppModal/EditAppModal.tsx",
    "content": "import { Alert, Button, Group, Popover, Stack, Tabs, Text, ThemeIcon } from '@mantine/core';\nimport { useForm } from '@mantine/form';\nimport { useDisclosure } from '@mantine/hooks';\nimport { ContextModalProps } from '@mantine/modals';\nimport {\n  IconAccessPoint,\n  IconAdjustments,\n  IconAlertTriangle,\n  IconBrush,\n  IconClick,\n  IconPlug,\n} from '@tabler/icons-react';\nimport { useTranslation } from 'next-i18next';\nimport { removeTrailingSlash } from 'next/dist/shared/lib/router/utils/remove-trailing-slash';\nimport { useState } from 'react';\nimport { useConfigContext } from '~/config/provider';\nimport { useConfigStore } from '~/config/store';\nimport { AppType } from '~/types/app';\n\nimport { DebouncedImage } from '../../../IconSelector/DebouncedImage';\nimport { useEditModeStore } from '../../Views/useEditModeStore';\nimport { AppearanceTab } from './Tabs/AppereanceTab/AppereanceTab';\nimport { BehaviourTab } from './Tabs/BehaviourTab/BehaviourTab';\nimport { GeneralTab } from './Tabs/GeneralTab/GeneralTab';\nimport { IntegrationTab } from './Tabs/IntegrationTab/IntegrationTab';\nimport { NetworkTab } from './Tabs/NetworkTab/NetworkTab';\nimport { EditAppModalTab } from './Tabs/type';\n\nconst appUrlRegex =\n  '(https?://(?:www.|(?!www))\\\\[?[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\\\\]?.[^\\\\s]{2,}|www.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9].[^\\\\s]{2,}|https?://(?:www.|(?!www))\\\\[?[a-zA-Z0-9]+\\\\]?.[^\\\\s]{2,}|www.[a-zA-Z0-9]+.[^\\\\s]{2,})';\n\nconst appUrlWithAnyProtocolRegex =\n  '([A-z]+://(?:www.|(?!www))\\\\[?[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\\\\]?.[^\\\\s]{2,}|www.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9].[^\\\\s]{2,}|[A-z]+://(?:www.|(?!www))\\\\[?[a-zA-Z0-9]+\\\\]?.[^\\\\s]{2,}|www.[a-zA-Z0-9]+.[^\\\\s]{2,})';\n\nexport const EditAppModal = ({\n  context,\n  id,\n  innerProps,\n}: ContextModalProps<{ app: AppType; allowAppNamePropagation: boolean }>) => {\n  const { t } = useTranslation(['layout/modals/add-app', 'common']);\n  const { name: configName, config } = useConfigContext();\n  const updateConfig = useConfigStore((store) => store.updateConfig);\n  const { enabled: isEditMode } = useEditModeStore();\n  const [allowAppNamePropagation, setAllowAppNamePropagation] = useState<boolean>(\n    innerProps.allowAppNamePropagation\n  );\n\n  const form = useForm<AppType>({\n    initialValues: innerProps.app,\n    validate: {\n      name: (name) => (!name ? t('validation.name') : null),\n      url: (url) => {\n        if (!url) {\n          return t('validation.noUrl');\n        }\n\n        if (!url.match(appUrlRegex)) {\n          return t('validation.invalidUrl');\n        }\n\n        return null;\n      },\n      appearance: {\n        iconUrl: (url: string) => {\n          if (url.length < 1) {\n            return t('validation.noIconUrl');\n          }\n\n          return null;\n        },\n      },\n      behaviour: {\n        externalUrl: (url: string) => {\n          if (url === undefined || url.length < 1) {\n            return t('validation.noExternalUri');\n          }\n\n          if (\n            !url.match(appUrlWithAnyProtocolRegex) &&\n            !url.startsWith('[homarr_base]') &&\n            !url.startsWith('[homarr_protocol]://')\n          ) {\n            return t('validation.invalidExternalUri');\n          }\n\n          return null;\n        },\n      },\n    },\n    validateInputOnChange: true,\n  });\n\n  const onSubmit = (values: AppType) => {\n    if (!configName) {\n      return;\n    }\n\n    values.url = removeTrailingSlash(values.url);\n\n    void updateConfig(\n      configName,\n      (previousConfig) => ({\n        ...previousConfig,\n        apps: [\n          ...previousConfig.apps.filter((x) => x.id !== values.id),\n          {\n            ...values,\n          },\n        ],\n      }),\n      true,\n      !isEditMode\n    );\n\n    // also close the parent modal\n    context.closeAll();\n    umami.track('Add app', { name: values.name });\n  };\n\n  const [activeTab, setActiveTab] = useState<EditAppModalTab>('general');\n\n  const closeModal = () => {\n    context.closeModal(id);\n  };\n\n  const validationErrors = Object.keys(form.errors);\n\n  const ValidationErrorIndicator = ({ keys }: { keys: string[] }) => {\n    const relevantErrors = validationErrors.filter((x) => keys.includes(x));\n\n    return (\n      <ThemeIcon\n        opacity={relevantErrors.length === 0 ? 0 : 1}\n        color=\"red\"\n        size={18}\n        variant=\"light\"\n      >\n        <IconAlertTriangle size={15} />\n      </ThemeIcon>\n    );\n  };\n\n  return (\n    <>\n      {configName === undefined ||\n        (config === undefined && (\n          <Alert color=\"red\">\n            There was an unexpected problem loading the configuration. Functionality might be\n            restricted. Please report this incident.\n          </Alert>\n        ))}\n      <Stack spacing={0} align=\"center\" my=\"lg\">\n        <DebouncedImage src={form.values.appearance.iconUrl} width={120} height={120} />\n\n        <Text align=\"center\" weight=\"bold\" size=\"lg\" mt=\"md\">\n          {form.values.name ?? 'New App'}\n        </Text>\n      </Stack>\n\n      <form onSubmit={form.onSubmit(onSubmit)}>\n        <Stack\n          justify=\"space-between\"\n          style={{\n            minHeight: 300,\n          }}\n        >\n          <Tabs\n            value={activeTab}\n            onTabChange={(tab) => setActiveTab(tab as EditAppModalTab)}\n            defaultValue=\"general\"\n            radius=\"md\"\n          >\n            <Tabs.List grow>\n              <Tabs.Tab\n                rightSection={<ValidationErrorIndicator keys={['name', 'url']} />}\n                icon={<IconAdjustments size={14} />}\n                value=\"general\"\n              >\n                {t('tabs.general')}\n              </Tabs.Tab>\n              <Tabs.Tab\n                rightSection={<ValidationErrorIndicator keys={['behaviour.externalUrl']} />}\n                icon={<IconClick size={14} />}\n                value=\"behaviour\"\n              >\n                {t('tabs.behaviour')}\n              </Tabs.Tab>\n              <Tabs.Tab\n                rightSection={<ValidationErrorIndicator keys={[]} />}\n                icon={<IconAccessPoint size={14} />}\n                value=\"network\"\n              >\n                {t('tabs.network')}\n              </Tabs.Tab>\n              <Tabs.Tab\n                rightSection={<ValidationErrorIndicator keys={['appearance.iconUrl']} />}\n                icon={<IconBrush size={14} />}\n                value=\"appearance\"\n              >\n                {t('tabs.appearance')}\n              </Tabs.Tab>\n              <Tabs.Tab\n                rightSection={<ValidationErrorIndicator keys={[]} />}\n                icon={<IconPlug size={14} />}\n                value=\"integration\"\n              >\n                {t('tabs.integration')}\n              </Tabs.Tab>\n            </Tabs.List>\n\n            <GeneralTab form={form} openTab={(targetTab) => setActiveTab(targetTab)} />\n            <BehaviourTab form={form} />\n            <NetworkTab form={form} />\n            <AppearanceTab\n              form={form}\n              disallowAppNamePropagation={() => setAllowAppNamePropagation(false)}\n              allowAppNamePropagation={allowAppNamePropagation}\n            />\n            <IntegrationTab form={form} />\n          </Tabs>\n\n          <Group noWrap position=\"right\" mt=\"md\">\n            <Button onClick={closeModal} px={50} variant=\"light\" color=\"gray\">\n              {t('common:cancel')}\n            </Button>\n            <SaveButton formIsValid={form.isValid()} />\n          </Group>\n        </Stack>\n      </form>\n    </>\n  );\n};\n\nconst SaveButton = ({ formIsValid }: { formIsValid: boolean }) => {\n  const [opened, { close, open }] = useDisclosure(false);\n  const { t } = useTranslation(['layout/modals/add-app', 'common']);\n\n  return (\n    <Popover opened={opened && !formIsValid} width={300} withArrow withinPortal>\n      <Popover.Target>\n        <div onMouseEnter={open} onMouseLeave={close}>\n          <Button disabled={!formIsValid} px={50} type=\"submit\">\n            {t('common:save')}\n          </Button>\n        </div>\n      </Popover.Target>\n      <Popover.Dropdown sx={{ pointerEvents: 'none' }}>{t('validation.popover')}</Popover.Dropdown>\n    </Popover>\n  );\n};\n"
  },
  {
    "path": "src/components/Dashboard/Modals/EditAppModal/Tabs/AppereanceTab/AppereanceTab.tsx",
    "content": "import { Flex, NumberInput, Select, Stack, Tabs } from '@mantine/core';\nimport { UseFormReturnType } from '@mantine/form';\nimport { useDebouncedValue } from '@mantine/hooks';\nimport { useTranslation } from 'next-i18next';\nimport { useEffect, useRef } from 'react';\nimport { IconSelector } from '~/components/IconSelector/IconSelector';\nimport { AppType } from '~/types/app';\n\ninterface AppearanceTabProps {\n  form: UseFormReturnType<AppType, (values: AppType) => AppType>;\n  disallowAppNamePropagation: () => void;\n  allowAppNamePropagation: boolean;\n}\n\nexport const AppearanceTab = ({\n  form,\n  disallowAppNamePropagation,\n  allowAppNamePropagation,\n}: AppearanceTabProps) => {\n  const iconSelectorRef = useRef();\n  const [debouncedValue] = useDebouncedValue(form.values.name, 2 * 1000); // 2 seconds debounce\n  const { t } = useTranslation('layout/modals/add-app');\n\n  useEffect(() => {\n    if (allowAppNamePropagation !== true) {\n      return;\n    }\n    if (!iconSelectorRef.current) {\n      return;\n    }\n\n    const currentRef = iconSelectorRef.current as {\n      chooseFirstOrDefault: (debouncedValue: string) => void;\n    };\n\n    currentRef.chooseFirstOrDefault(debouncedValue);\n  }, [debouncedValue]);\n\n  return (\n    <Tabs.Panel value=\"appearance\" pt=\"lg\">\n      <Stack spacing=\"xs\">\n        <Flex gap={5} mb=\"xs\">\n          <IconSelector\n            defaultValue={form.values.appearance.iconUrl}\n            onChange={(value) => {\n              form.setFieldValue('appearance.iconUrl', value);\n              disallowAppNamePropagation();\n            }}\n            value={form.values.appearance.iconUrl}\n            ref={iconSelectorRef}\n          />\n        </Flex>\n        <Select\n          label={t('appearance.appNameStatus.label')}\n          description={t('appearance.appNameStatus.description')}\n          data={[\n            { value: 'normal', label: t('appearance.appNameStatus.dropdown.normal') as string },\n            { value: 'hover', label: t('appearance.appNameStatus.dropdown.hover') as string },\n            { value: 'hidden', label: t('appearance.appNameStatus.dropdown.hidden') as string },\n          ]}\n          {...form.getInputProps('appearance.appNameStatus')}\n          onChange={(value) => {\n            form.setFieldValue('appearance.appNameStatus', value);\n          }}\n        />\n        {form.values.appearance.appNameStatus === 'normal' && (\n          <>\n            <NumberInput\n              label={t('appearance.appNameFontSize.label')}\n              description={t('appearance.appNameFontSize.description')}\n              min={5}\n              max={64}\n              {...form.getInputProps('appearance.appNameFontSize')}\n              onChange={(value) => {\n                form.setFieldValue('appearance.appNameFontSize', value);\n              }}\n            />\n            <Select\n              label={t('appearance.positionAppName.label')}\n              description={t('appearance.positionAppName.description')}\n              data={[\n                {\n                  value: 'column',\n                  label: t('appearance.positionAppName.dropdown.top') as string,\n                },\n                {\n                  value: 'row-reverse',\n                  label: t('appearance.positionAppName.dropdown.right') as string,\n                },\n                {\n                  value: 'column-reverse',\n                  label: t('appearance.positionAppName.dropdown.bottom') as string,\n                },\n                {\n                  value: 'row',\n                  label: t('appearance.positionAppName.dropdown.left') as string,\n                },\n              ]}\n              {...form.getInputProps('appearance.positionAppName')}\n              onChange={(value) => {\n                form.setFieldValue('appearance.positionAppName', value);\n              }}\n            />\n            <NumberInput\n              label={t('appearance.lineClampAppName.label')}\n              description={t('appearance.lineClampAppName.description')}\n              min={0}\n              {...form.getInputProps('appearance.lineClampAppName')}\n              onChange={(value) => {\n                form.setFieldValue('appearance.lineClampAppName', value);\n              }}\n            />\n          </>\n        )}\n      </Stack>\n    </Tabs.Panel>\n  );\n};\n\nconst replaceCharacters = (value: string) => value.toLowerCase().replaceAll('', '-');\n"
  },
  {
    "path": "src/components/Dashboard/Modals/EditAppModal/Tabs/BehaviourTab/BehaviourTab.tsx",
    "content": "import {\n  Group,\n  HoverCard,\n  Stack,\n  Switch,\n  Tabs,\n  Text,\n  TextInput,\n  Tooltip,\n  useMantineTheme,\n} from '@mantine/core';\nimport { UseFormReturnType } from '@mantine/form';\nimport { useTranslation } from 'next-i18next';\nimport { InfoCard } from '~/components/InfoCard/InfoCard';\nimport { AppType } from '~/types/app';\n\ninterface BehaviourTabProps {\n  form: UseFormReturnType<AppType, (values: AppType) => AppType>;\n}\n\nexport const BehaviourTab = ({ form }: BehaviourTabProps) => {\n  const { t } = useTranslation('layout/modals/add-app');\n  const { primaryColor } = useMantineTheme();\n\n  return (\n    <Tabs.Panel value=\"behaviour\" pt=\"xs\">\n      <Stack spacing=\"xs\">\n        <Switch\n          label={t('behaviour.isOpeningNewTab.label')}\n          description={t('behaviour.isOpeningNewTab.description')}\n          styles={{ label: { fontWeight: 500 }, description: { marginTop: 0 } }}\n          {...form.getInputProps('behaviour.isOpeningNewTab', { type: 'checkbox' })}\n        />\n        <Stack spacing=\"0.25rem\">\n          <Group>\n            <Text size=\"0.875rem\" weight={500}>\n              {t('behaviour.tooltipDescription.label')}\n            </Text>\n            <InfoCard message={t('behaviour.tooltipDescription.description')} />\n          </Group>\n          <TextInput {...form.getInputProps('behaviour.tooltipDescription')} />\n        </Stack>\n      </Stack>\n    </Tabs.Panel>\n  );\n};\n"
  },
  {
    "path": "src/components/Dashboard/Modals/EditAppModal/Tabs/GeneralTab/GeneralTab.tsx",
    "content": "import { Anchor, Button, Card, Collapse, Group, Stack, Tabs, Text, TextInput } from '@mantine/core';\nimport { UseFormReturnType } from '@mantine/form';\nimport { useDisclosure } from '@mantine/hooks';\nimport { IconClick, IconCursorText, IconLink } from '@tabler/icons-react';\nimport { useTranslation } from 'next-i18next';\nimport { InfoCard } from '~/components/InfoCard/InfoCard';\nimport { AppType } from '~/types/app';\n\nimport { EditAppModalTab } from '../type';\n\ninterface GeneralTabProps {\n  form: UseFormReturnType<AppType, (values: AppType) => AppType>;\n  openTab: (tab: EditAppModalTab) => void;\n}\n\nexport const GeneralTab = ({ form, openTab }: GeneralTabProps) => {\n  const { t } = useTranslation('layout/modals/add-app');\n\n  const [opened, { toggle }] = useDisclosure(false);\n\n  const commonMistakes = [\n    t('general.internalAddress.troubleshoot.lines.nothingAfterPort'),\n    t('general.internalAddress.troubleshoot.lines.protocolCheck'),\n    t('general.internalAddress.troubleshoot.lines.preferIP'),\n    t('general.internalAddress.troubleshoot.lines.enablePings'),\n    t('general.internalAddress.troubleshoot.lines.wget'),\n    t('general.internalAddress.troubleshoot.lines.iframe'),\n  ];\n\n  return (\n    <Tabs.Panel value=\"general\" pt=\"sm\">\n      <Stack spacing=\"xs\">\n        <TextInput\n          icon={<IconCursorText size={16} />}\n          label={t('general.appname.label')}\n          description={t('general.appname.description')}\n          placeholder=\"My example app\"\n          variant=\"default\"\n          withAsterisk\n          {...form.getInputProps('name')}\n        />\n        <TextInput\n          icon={<IconLink size={16} />}\n          label={t('general.internalAddress.label')}\n          description={t('general.internalAddress.description')}\n          placeholder=\"https://google.com\"\n          variant=\"default\"\n          withAsterisk\n          {...form.getInputProps('url')}\n          onChange={(e) => {\n            form.setFieldValue('url', e.target.value);\n          }}\n        />\n        <Stack style={{ gap: 0 }}>\n          <Group style={{ gap: '0.25rem' }}>\n            <Text size=\"0.875rem\" weight={500}>\n              {t('general.externalAddress.label')}\n            </Text>\n            <InfoCard message={t('general.externalAddress.tooltip')} />\n          </Group>\n          <TextInput\n            icon={<IconClick size={16} />}\n            description={t('general.externalAddress.description')}\n            placeholder=\"https://homarr.mywebsite.com/\"\n            variant=\"default\"\n            {...form.getInputProps('behaviour.externalUrl')}\n          />\n        </Stack>\n\n        <Collapse in={opened}>\n          <Card withBorder>\n            <Text>{t('general.internalAddress.troubleshoot.header')}</Text>\n            {commonMistakes.map((value: string, key: number) => {\n              return (\n                <Group key={key} display=\"flex\" style={{ alignItems: 'start' }}>\n                  <Text>•</Text>\n                  <Text style={{ flex: '1' }}>{value}</Text>\n                </Group>\n              );\n            })}\n            <Text>\n              {t('general.internalAddress.troubleshoot.footer').split('{{discord}}')[0]}\n              <Anchor href=\"https://discord.gg/aCsmEV5RgA\" target=\"_blank\">\n                Discord\n              </Anchor>\n              {t('general.internalAddress.troubleshoot.footer').split('{{discord}}')[1]}\n            </Text>\n          </Card>\n        </Collapse>\n\n        {!form.values.behaviour.externalUrl.startsWith('https://') &&\n          !form.values.behaviour.externalUrl.startsWith('http://') &&\n          !form.values.behaviour.externalUrl.startsWith('[homarr_base]') &&\n          !form.values.behaviour.externalUrl.startsWith('[homarr_protocol]://') && (\n            <Text color=\"red\" mt=\"sm\" size=\"sm\">\n              {t('behaviour.customProtocolWarning')}\n            </Text>\n          )}\n      </Stack>\n\n      <Button onClick={toggle} bottom={-68} left={0} color=\"yellow.7\" variant=\"light\">\n        {t('general.internalAddress.troubleshoot.label')}\n      </Button>\n    </Tabs.Panel>\n  );\n};\n"
  },
  {
    "path": "src/components/Dashboard/Modals/EditAppModal/Tabs/IntegrationTab/Components/InputElements/GenericSecretInput.tsx",
    "content": "import {\n  Badge,\n  Button,\n  Card,\n  Flex,\n  Grid,\n  Group,\n  PasswordInput,\n  Text,\n  ThemeIcon,\n  Title,\n  Tooltip,\n  createStyles,\n} from '@mantine/core';\nimport { Icon } from '@tabler/icons-react';\nimport { useTranslation } from 'next-i18next';\nimport { useState } from 'react';\nimport { AppIntegrationPropertyAccessabilityType } from '~/types/app';\n\ninterface GenericSecretInputProps {\n  label: string;\n  value: string;\n  setIcon: Icon;\n  secretIsPresent: boolean;\n  type: AppIntegrationPropertyAccessabilityType;\n  onClickUpdateButton: (value: string | undefined) => void;\n}\n\nexport const GenericSecretInput = ({\n  label,\n  value,\n  setIcon,\n  secretIsPresent,\n  type,\n  onClickUpdateButton,\n  ...props\n}: GenericSecretInputProps) => {\n  const { classes } = useStyles();\n\n  const Icon = setIcon;\n\n  const [displayUpdateField, setDisplayUpdateField] = useState<boolean>(!secretIsPresent);\n  const { t } = useTranslation(['layout/modals/add-app', 'common']);\n\n  return (\n    <Card p=\"xs\" withBorder>\n      <Grid>\n        <Grid.Col className={classes.alignSelfCenter} xs={12} md={6}>\n          <Group spacing=\"sm\" noWrap>\n            <ThemeIcon color={secretIsPresent ? 'green' : 'red'} variant=\"light\" size=\"lg\">\n              <Icon size={18} />\n            </ThemeIcon>\n            <Flex justify=\"start\" align=\"start\" direction=\"column\">\n              <Group spacing=\"xs\">\n                <Title className={classes.subtitle} order={6}>\n                  {t(label)}\n                </Title>\n\n                <Group spacing=\"xs\">\n                  <Badge\n                    className={classes.textTransformUnset}\n                    color={secretIsPresent ? 'green' : 'red'}\n                    variant=\"dot\"\n                  >\n                    {secretIsPresent\n                      ? t('integration.type.defined')\n                      : t('integration.type.undefined')}\n                  </Badge>\n                  {type === 'private' ? (\n                    <Tooltip\n                      label={t('integration.type.explanationPrivate')}\n                      width={400}\n                      multiline\n                      withinPortal\n                      withArrow\n                    >\n                      <Badge className={classes.textTransformUnset} color=\"orange\" variant=\"dot\">\n                        {t('integration.type.private')}\n                      </Badge>\n                    </Tooltip>\n                  ) : (\n                    <Tooltip\n                      label={t('integration.type.explanationPublic')}\n                      width={400}\n                      multiline\n                      withinPortal\n                      withArrow\n                    >\n                      <Badge className={classes.textTransformUnset} color=\"red\" variant=\"dot\">\n                        {t('integration.type.public')}\n                      </Badge>\n                    </Tooltip>\n                  )}\n                </Group>\n              </Group>\n              <Text size=\"xs\" color=\"dimmed\" w={400}>\n                {type === 'private'\n                  ? 'Private: Once saved, you cannot read out this value again'\n                  : 'Public: Can be read out repeatedly'}\n              </Text>\n            </Flex>\n          </Group>\n        </Grid.Col>\n        <Grid.Col xs={12} md={6}>\n          <Flex gap={10} justify=\"end\" align=\"end\">\n            {displayUpdateField === true ? (\n              <PasswordInput\n                required\n                defaultValue={value}\n                placeholder=\"new secret\"\n                styles={{ root: { width: 200 } }}\n                {...props}\n              />\n            ) : (\n              <Button onClick={() => setDisplayUpdateField(true)} variant=\"light\">\n                {t('integration.secrets.update')}\n              </Button>\n            )}\n          </Flex>\n        </Grid.Col>\n      </Grid>\n    </Card>\n  );\n};\n\nconst useStyles = createStyles(() => ({\n  subtitle: {\n    lineHeight: 1.1,\n  },\n  alignSelfCenter: {\n    alignSelf: 'center',\n  },\n  textTransformUnset: {\n    textTransform: 'inherit',\n  },\n}));\n"
  },
  {
    "path": "src/components/Dashboard/Modals/EditAppModal/Tabs/IntegrationTab/Components/InputElements/IntegrationSelector.tsx",
    "content": "/* eslint-disable @next/next/no-img-element */\nimport { Group, Image, Select, SelectItem, Text } from '@mantine/core';\nimport { UseFormReturnType } from '@mantine/form';\nimport { useTranslation } from 'next-i18next';\nimport { forwardRef } from 'react';\nimport {\n  AppIntegrationPropertyType,\n  AppIntegrationType,\n  AppType,\n  IntegrationField,\n  integrationFieldDefinitions,\n  integrationFieldProperties,\n} from '~/types/app';\n\ninterface IntegrationSelectorProps {\n  form: UseFormReturnType<AppType, (item: AppType) => AppType>;\n}\n\nexport const IntegrationSelector = ({ form }: IntegrationSelectorProps) => {\n  const { t } = useTranslation('layout/modals/add-app');\n\n  const data = availableIntegrations.filter((x) =>\n    Object.keys(integrationFieldProperties).includes(x.value)\n  );\n\n  const getNewProperties = (value: string | null): AppIntegrationPropertyType[] => {\n    if (!value) return [];\n    const integrationType = value as Exclude<AppIntegrationType['type'], null>;\n    if (integrationType === null) {\n      return [];\n    }\n\n    const requiredProperties = Object.entries(integrationFieldDefinitions).filter(([k, v]) => {\n      const val = integrationFieldProperties[integrationType];\n      return val.includes(k as IntegrationField);\n    })!;\n    return requiredProperties.map(([k, value]) => ({\n      type: value.type,\n      field: k as IntegrationField,\n      value: undefined,\n      isDefined: false,\n    }));\n  };\n\n  const inputProps = form.getInputProps('integration.type');\n\n  return (\n    <Select\n      label={t('integration.type.label')}\n      description={t('integration.type.description')}\n      placeholder={t('integration.type.placeholder') ?? undefined}\n      itemComponent={SelectItemComponent}\n      data={data}\n      maxDropdownHeight={250}\n      dropdownPosition=\"bottom\"\n      clearable\n      variant=\"default\"\n      searchable\n      zIndex={203}\n      withinPortal\n      filter={(value, item) =>\n        item.label?.toLowerCase().includes(value.toLowerCase().trim()) ||\n        item.description?.toLowerCase().includes(value.toLowerCase().trim())\n      }\n      icon={\n        form.values.integration?.type && (\n          <Image\n            src={data.find((x) => x.value === form.values.integration?.type)?.image}\n            alt=\"integration\"\n            width={20}\n            height={20}\n            fit=\"contain\"\n          />\n        )\n      }\n      {...inputProps}\n      onChange={(value) => {\n        form.setFieldValue('integration.properties', getNewProperties(value));\n        inputProps.onChange(value);\n      }}\n    />\n  );\n};\n\ninterface ItemProps extends React.ComponentPropsWithoutRef<'div'> {\n  image: string;\n  description: string;\n  label: string;\n}\n\nconst SelectItemComponent = forwardRef<HTMLDivElement, ItemProps>(\n  ({ image, label, description, ...others }: ItemProps, ref) => (\n    <div ref={ref} {...others}>\n      <Group noWrap>\n        <Image src={image} alt=\"integration icon\" width={20} height={20} fit=\"contain\" />\n\n        <div>\n          <Text size=\"sm\">{label}</Text>\n          {description && (\n            <Text size=\"xs\" color=\"dimmed\">\n              {description}\n            </Text>\n          )}\n        </div>\n      </Group>\n    </div>\n  )\n);\n\nexport const availableIntegrations = [\n  {\n    value: 'sabnzbd',\n    image: 'https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/sabnzbd.png',\n    label: 'SABnzbd',\n  },\n  {\n    value: 'nzbGet',\n    image: 'https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/nzbget.png',\n    label: 'NZBGet',\n  },\n  {\n    value: 'deluge',\n    image: 'https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/deluge.png',\n    label: 'Deluge',\n  },\n  {\n    value: 'transmission',\n    image: 'https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/transmission.png',\n    label: 'Transmission',\n  },\n  {\n    value: 'qBittorrent',\n    image: 'https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/qbittorrent.png',\n    label: 'qBittorrent',\n  },\n  {\n    value: 'jellyseerr',\n    image: 'https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/jellyseerr.png',\n    label: 'Jellyseerr',\n  },\n  {\n    value: 'overseerr',\n    image: 'https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/overseerr.png',\n    label: 'Overseerr',\n  },\n  {\n    value: 'sonarr',\n    image: 'https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/sonarr.png',\n    label: 'Sonarr',\n  },\n  {\n    value: 'radarr',\n    image: 'https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/radarr.png',\n    label: 'Radarr',\n  },\n  {\n    value: 'lidarr',\n    image: 'https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/lidarr.png',\n    label: 'Lidarr',\n  },\n  {\n    value: 'readarr',\n    image: 'https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/readarr.png',\n    label: 'Readarr',\n  },\n  {\n    value: 'prowlarr',\n    image: 'https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/prowlarr.png',\n    label: 'Prowlarr',\n  },\n  {\n    value: 'jellyfin',\n    image: 'https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/jellyfin.png',\n    label: 'Jellyfin (and Emby)',\n  },\n  {\n    value: 'plex',\n    image: 'https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/plex.png',\n    label: 'Plex',\n  },\n  {\n    value: 'pihole',\n    image: 'https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/pi-hole.png',\n    label: 'PiHole',\n  },\n  {\n    value: 'adGuardHome',\n    image: 'https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/adguard-home.png',\n    label: 'AdGuard Home',\n  },\n  {\n    value: 'homeAssistant',\n    image: 'https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/home-assistant.png',\n    label: 'Home Assistant',\n  },\n  {\n    value: 'openmediavault',\n    image: 'https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/openmediavault.png',\n    label: 'OpenMediaVault',\n  },\n  {\n    value: 'proxmox',\n    image: 'https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/png/proxmox.png',\n    label: 'Proxmox',\n  },\n  {\n    value: 'tdarr',\n    image: 'https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/tdarr.png',\n    label: 'Tdarr',\n  }\n] as const satisfies Readonly<SelectItem[]>;\n"
  },
  {
    "path": "src/components/Dashboard/Modals/EditAppModal/Tabs/IntegrationTab/Components/IntegrationOptionsRenderer/IntegrationOptionsRenderer.tsx",
    "content": "import { Stack } from '@mantine/core';\nimport { UseFormReturnType } from '@mantine/form';\nimport { IconKey } from '@tabler/icons-react';\nimport {\n  AppIntegrationPropertyType,\n  AppType,\n  IntegrationField,\n  integrationFieldDefinitions,\n  integrationFieldProperties,\n} from '~/types/app';\n\nimport { GenericSecretInput } from '../InputElements/GenericSecretInput';\n\ninterface IntegrationOptionsRendererProps {\n  form: UseFormReturnType<AppType, (values: AppType) => AppType>;\n}\n\nexport const IntegrationOptionsRenderer = ({ form }: IntegrationOptionsRendererProps) => {\n  const selectedIntegration = form.values.integration?.type;\n\n  if (!selectedIntegration) return null;\n\n  const displayedProperties = integrationFieldProperties[selectedIntegration];\n\n  return (\n    <Stack spacing=\"xs\" mb=\"md\">\n      {displayedProperties.map((property, index) => {\n        const [_, definition] = Object.entries(integrationFieldDefinitions).find(\n          ([key]) => property === key\n        )!;\n\n        let indexInFormValue =\n          form.values.integration?.properties.findIndex((p) => p.field === property) ?? -1;\n        if (indexInFormValue === -1) {\n          const { type } = Object.entries(integrationFieldDefinitions).find(\n            ([k, v]) => k === property\n          )![1];\n          const newProperty: AppIntegrationPropertyType = {\n            type,\n            field: property as IntegrationField,\n            isDefined: false,\n          };\n          form.insertListItem('integration.properties', newProperty);\n          indexInFormValue = form.values.integration!.properties.length;\n        }\n        const formValue = form.values.integration?.properties[indexInFormValue];\n\n        const isPresent = formValue?.isDefined;\n        const accessabilityType = formValue?.type;\n\n        if (!definition) {\n          return (\n            <GenericSecretInput\n              onClickUpdateButton={(value) => {\n                form.setFieldValue(`integration.properties.${index}.value`, value);\n                form.setFieldValue(\n                  `integration.properties.${index}.isDefined`,\n                  value !== undefined\n                );\n              }}\n              key={`input-${property}`}\n              label={`${property} (potentionally unmapped)`}\n              secretIsPresent={isPresent}\n              setIcon={IconKey}\n              type={accessabilityType}\n              {...form.getInputProps(`integration.properties.${index}.value`)}\n            />\n          );\n        }\n\n        return (\n          <GenericSecretInput\n            onClickUpdateButton={(value) => {\n              form.setFieldValue(`integration.properties.${index}.value`, value);\n              form.setFieldValue(`integration.properties.${index}.isDefined`, value !== undefined);\n            }}\n            key={`input-${definition.label}`}\n            label={definition.label}\n            secretIsPresent={isPresent}\n            setIcon={definition.icon}\n            type={accessabilityType}\n            {...form.getInputProps(`integration.properties.${index}.value`)}\n          />\n        );\n      })}\n    </Stack>\n  );\n};\n"
  },
  {
    "path": "src/components/Dashboard/Modals/EditAppModal/Tabs/IntegrationTab/IntegrationTab.tsx",
    "content": "import { Alert, Divider, Tabs, Text } from '@mantine/core';\nimport { UseFormReturnType } from '@mantine/form';\nimport { IconAlertTriangle } from '@tabler/icons-react';\nimport { Trans, useTranslation } from 'next-i18next';\nimport { AppType } from '~/types/app';\n\nimport { IntegrationSelector } from './Components/InputElements/IntegrationSelector';\nimport { IntegrationOptionsRenderer } from './Components/IntegrationOptionsRenderer/IntegrationOptionsRenderer';\n\ninterface IntegrationTabProps {\n  form: UseFormReturnType<AppType, (values: AppType) => AppType>;\n}\n\nexport const IntegrationTab = ({ form }: IntegrationTabProps) => {\n  const { t } = useTranslation('layout/modals/add-app');\n  const hasIntegrationSelected = form.values.integration?.type;\n\n  return (\n    <Tabs.Panel value=\"integration\" pt=\"lg\">\n      <IntegrationSelector form={form} />\n\n      {hasIntegrationSelected && (\n        <>\n          <Divider label={t('integration.type.label')} labelPosition=\"center\" mt=\"xl\" mb=\"md\" />\n          <Text size=\"sm\" color=\"dimmed\" mb=\"lg\">\n            {t('integration.secrets.description')}\n          </Text>\n          <IntegrationOptionsRenderer form={form} />\n          <Alert icon={<IconAlertTriangle />} color=\"yellow\">\n            <Text>\n              <Trans i18nKey=\"layout/modals/add-app:integration.secrets.warning\" />\n            </Text>\n          </Alert>\n        </>\n      )}\n    </Tabs.Panel>\n  );\n};\n"
  },
  {
    "path": "src/components/Dashboard/Modals/EditAppModal/Tabs/NetworkTab/NetworkTab.tsx",
    "content": "import { MultiSelect, Stack, Switch, Tabs } from '@mantine/core';\nimport { UseFormReturnType } from '@mantine/form';\nimport { useTranslation } from 'next-i18next';\nimport { StatusCodes } from '~/tools/acceptableStatusCodes';\nimport { AppType } from '~/types/app';\n\ninterface NetworkTabProps {\n  form: UseFormReturnType<AppType, (values: AppType) => AppType>;\n}\n\nexport const NetworkTab = ({ form }: NetworkTabProps) => {\n  const { t } = useTranslation('layout/modals/add-app');\n  const acceptableStatusCodes = (form.values.network.statusCodes ?? ['200']).map((x) =>\n    x.toString()\n  );\n  return (\n    <Tabs.Panel value=\"network\" pt=\"lg\">\n      <Stack spacing=\"xs\">\n        <Switch\n          label={t('network.statusChecker.label')}\n          description={t('network.statusChecker.description')}\n          styles={{ label: { fontWeight: 500 }, description: { marginTop: 0 } }}\n          defaultChecked={form.values.network.enabledStatusChecker}\n          {...form.getInputProps('network.enabledStatusChecker')}\n        />\n        {form.values.network.enabledStatusChecker && (\n          <MultiSelect\n            required\n            label={t('network.statusCodes.label')}\n            description={t('network.statusCodes.description')}\n            data={StatusCodes}\n            clearable\n            searchable\n            defaultValue={acceptableStatusCodes}\n            variant=\"default\"\n            {...form.getInputProps('network.statusCodes')}\n          />\n        )}\n      </Stack>\n    </Tabs.Panel>\n  );\n};\n"
  },
  {
    "path": "src/components/Dashboard/Modals/EditAppModal/Tabs/type.ts",
    "content": "export type EditAppModalTab = 'general' | 'behaviour' | 'network' | 'appereance' | 'integration';\n"
  },
  {
    "path": "src/components/Dashboard/Modals/RenameBoard/RenameBoardModal.tsx",
    "content": "import { modals } from '@mantine/modals';\nimport { Alert, Button, TextInput } from '@mantine/core';\nimport { api } from '~/utils/api';\nimport { useForm, zodResolver } from '@mantine/form';\nimport { z } from 'zod';\nimport { IconAlertCircle } from '@tabler/icons-react';\nimport { useTranslation } from 'next-i18next';\nimport { configNameSchema } from '~/validations/boards';\n\ntype RenameBoardModalProps = {\n  boardName: string;\n  configNames: string[];\n  onClose: () => void;\n}\n\nexport const RenameBoardModal = ({ boardName, configNames, onClose }: RenameBoardModalProps) => {\n  const { t } = useTranslation(['manage/boards', 'common']);\n\n  const utils = api.useUtils();\n  const { mutateAsync: mutateRenameBoardAsync, isLoading, isError, error } = api.boards.renameBoard.useMutation({\n    onSettled: () => {\n      void utils.boards.all.invalidate();\n    }\n  });\n\n  const form = useForm({\n    initialValues: {\n      newName: '',\n    },\n    validate: zodResolver(z.object({\n      newName: configNameSchema.refine(value => !configNames.includes(value)),\n    })),\n    validateInputOnBlur: true,\n    validateInputOnChange: true,\n  });\n\n  const handleSubmit = () => {\n    mutateRenameBoardAsync({\n      oldName: boardName,\n      newName: form.values.newName,\n    }).then(() => {\n      onClose();\n    });\n  };\n\n  return (\n    <form onSubmit={form.onSubmit(handleSubmit)}>\n      {isError && error && (\n        <Alert icon={<IconAlertCircle size={\"1rem\"} />} mb={\"md\"}>\n          {error.message}\n        </Alert>\n      )}\n      <TextInput\n        label={t('cards.menu.rename.modal.fields.name.label')}\n        placeholder={t('cards.menu.rename.modal.fields.name.placeholder') as string}\n        data-autofocus\n        {...form.getInputProps('newName')} />\n      <Button\n        loading={isLoading}\n        fullWidth\n        mt=\"md\"\n        type={'submit'}\n        variant={\"light\"}>\n        {t('common:confirm')}\n      </Button>\n    </form>\n  );\n};\n"
  },
  {
    "path": "src/components/Dashboard/Modals/SelectElement/Components/Overview/AvailableElementsOverview.tsx",
    "content": "import { Group, Space, Stack, Text, UnstyledButton } from '@mantine/core';\nimport { closeModal } from '@mantine/modals';\nimport { showNotification } from '@mantine/notifications';\nimport { IconBox, IconBoxAlignTop, IconStack } from '@tabler/icons-react';\nimport { motion } from 'framer-motion';\nimport { useSession } from 'next-auth/react';\nimport { useTranslation } from 'next-i18next';\nimport { ReactNode } from 'react';\nimport { v4 as uuidv4 } from 'uuid';\nimport { useConfigContext } from '~/config/provider';\nimport { useConfigStore } from '~/config/store';\nimport { openContextModalGeneric } from '~/tools/mantineModalManagerExtensions';\nimport { generateDefaultApp } from '~/tools/shared/app';\nimport { AppType } from '~/types/app';\n\nimport { CategoryEditModalInnerProps } from '../../../../Wrappers/Category/CategoryEditModal';\nimport { useStyles } from '../Shared/styles';\nimport { getLowestWrapper } from '~/tools/config/wrapper-finder';\nimport { ConfigType } from '~/types/config';\n\ninterface AvailableElementTypesProps {\n  modalId: string;\n  onOpenIntegrations: () => void;\n}\n\nexport const AvailableElementTypes = ({\n  modalId,\n  onOpenIntegrations: onOpenWidgets,\n}: AvailableElementTypesProps) => {\n  const { t } = useTranslation('layout/element-selector/selector');\n  const { config, name: configName } = useConfigContext();\n  const { updateConfig } = useConfigStore();\n  const { data } = useSession();\n\n  const onClickCreateCategory = async () => {\n    openContextModalGeneric<CategoryEditModalInnerProps>({\n      modal: 'categoryEditModal',\n      title: t('category.newName'),\n      withCloseButton: false,\n      innerProps: {\n        category: {\n          id: uuidv4(),\n          name: t('category.defaultName'),\n          position: 0, // doesn't matter, is being overwritten\n        },\n        onSuccess: async (category) => {\n          if (!configName) return;\n\n          await updateConfig(configName, (previousConfig) => ({\n            ...previousConfig,\n            wrappers: [\n              ...previousConfig.wrappers,\n              {\n                id: uuidv4(),\n                // Thank you ChatGPT ;)\n                position: previousConfig.categories.length + 1,\n              },\n            ],\n            categories: [\n              ...previousConfig.categories,\n              {\n                id: uuidv4(),\n                name: category.name,\n                position: previousConfig.categories.length + 1,\n              },\n            ],\n          })).then(() => {\n            closeModal(modalId);\n            showNotification({\n              title: t('category.created.title'),\n              message: t('category.created.message', { name: category.name }),\n              color: 'teal',\n            });\n          });\n        },\n      },\n    });\n  };\n\n  return (\n    <>\n      <Text color=\"dimmed\">{t('modal.text')}</Text>\n      <Space h=\"lg\" />\n      <Group spacing=\"md\" grow>\n        <ElementItem\n          name={t('apps')}\n          icon={<IconBox size={40} strokeWidth={1.3} />}\n          onClick={() => {\n            openContextModalGeneric<{ app: AppType; allowAppNamePropagation: boolean }>({\n              modal: 'editApp',\n              innerProps: {\n                app: generateDefaultApp(getLowestWrapper(config as ConfigType)?.id ?? 'default'),\n                allowAppNamePropagation: true,\n              },\n              size: 'xl',\n            });\n          }}\n        />\n        <ElementItem\n          name={t('widgets')}\n          icon={<IconStack size={40} strokeWidth={1.3} />}\n          onClick={onOpenWidgets}\n        />\n        <ElementItem\n          name={t('categories')}\n          icon={<IconBoxAlignTop size={40} strokeWidth={1.3} />}\n          onClick={onClickCreateCategory}\n        />\n      </Group>\n    </>\n  );\n};\n\ninterface ElementItemProps {\n  icon: ReactNode;\n  name: string;\n  onClick: () => void;\n}\n\nconst ElementItem = ({ name, icon, onClick }: ElementItemProps) => {\n  const { classes, cx } = useStyles();\n  return (\n    <UnstyledButton\n      className={cx(classes.elementButton, classes.styledButton)}\n      onClick={onClick}\n      py=\"md\"\n    >\n      <Stack className={classes.elementStack} align=\"center\" spacing={5}>\n        <motion.div\n          // On hover zoom in\n          whileHover={{ scale: 1.2 }}\n        >\n          {icon}\n        </motion.div>\n        <Text className={classes.elementName} weight={500} size=\"sm\">\n          {name}\n        </Text>\n      </Stack>\n    </UnstyledButton>\n  );\n};\n"
  },
  {
    "path": "src/components/Dashboard/Modals/SelectElement/Components/Shared/GenericElementType.tsx",
    "content": "import { Button, Card, Center, Grid, Stack, Text } from '@mantine/core';\nimport { Icon } from '@tabler/icons-react';\nimport { useTranslation } from 'next-i18next';\nimport Image from 'next/image';\nimport React from 'react';\n\nimport { useStyles } from './styles';\n\ninterface GenericAvailableElementTypeProps {\n  name: string;\n  id: string;\n  handleAddition: () => Promise<void>;\n  description?: string;\n  image: string | Icon;\n  disabled?: boolean;\n}\n\nexport const GenericAvailableElementType = ({\n  name,\n  id,\n  description,\n  image,\n  disabled,\n  handleAddition,\n}: GenericAvailableElementTypeProps) => {\n  const { classes } = useStyles();\n  const { t } = useTranslation('layout/modals/about');\n\n  const Icon =\n    typeof image === 'string'\n      ? () => <Image alt={name} src={image} width={24} height={24} />\n      : image;\n\n  return (\n    <Grid.Col xs={12} sm={4} md={3}>\n      <Card style={{ height: '100%' }}>\n        <Stack justify=\"space-between\" style={{ height: '100%' }}>\n          <Stack spacing=\"xs\">\n            <Center>\n              <Icon />\n            </Center>\n            <Text className={classes.elementText} align=\"center\">\n              {name}\n            </Text>\n            {description && (\n              <Text className={classes.elementText} size=\"xs\" align=\"center\" color=\"dimmed\">\n                {description}\n              </Text>\n            )}\n          </Stack>\n          <Button\n            disabled={disabled}\n            onClick={handleAddition}\n            variant=\"light\"\n            size=\"xs\"\n            mt=\"auto\"\n            radius=\"md\"\n            fullWidth\n          >\n            {t('addToDashboard')}\n          </Button>\n        </Stack>\n      </Card>\n    </Grid.Col>\n  );\n};\n"
  },
  {
    "path": "src/components/Dashboard/Modals/SelectElement/Components/Shared/SelectorBackArrow.tsx",
    "content": "import { Button, Text } from '@mantine/core';\nimport { IconArrowNarrowLeft } from '@tabler/icons-react';\nimport { useTranslation } from 'next-i18next';\n\ninterface SelectorBackArrowProps {\n  onClickBack: () => void;\n}\n\nexport function SelectorBackArrow({ onClickBack }: SelectorBackArrowProps) {\n  const { t } = useTranslation('layout/element-selector/selector');\n  return (\n    <Button\n      leftIcon={<IconArrowNarrowLeft />}\n      onClick={onClickBack}\n      styles={{ inner: { width: 'fit-content' } }}\n      fullWidth\n      variant=\"default\"\n      mb=\"md\"\n    >\n      <Text>{t('goBack')}</Text>\n    </Button>\n  );\n}\n"
  },
  {
    "path": "src/components/Dashboard/Modals/SelectElement/Components/Shared/styles.tsx",
    "content": "import { createStyles } from '@mantine/core';\n\nexport const useStyles = createStyles((theme) => ({\n  styledButton: {\n    backgroundColor: theme.colorScheme === 'dark' ? theme.colors.gray[9] : theme.colors.gray[2],\n    color: theme.colorScheme === 'dark' ? theme.colors.gray[0] : theme.colors.dark[9],\n    '&:hover': {\n      backgroundColor: theme.colorScheme === 'dark' ? theme.colors.gray[8] : theme.colors.gray[3],\n    },\n  },\n  elementButton: {\n    width: '100%',\n    height: '100%',\n    borderRadius: theme.radius.sm,\n  },\n  elementStack: {\n    width: '100%',\n  },\n  elementName: {\n    whiteSpace: 'normal',\n    textAlign: 'center',\n    lineHeight: 1.2,\n  },\n  elementText: {\n    lineHeight: 1.2,\n    whiteSpace: 'normal',\n  },\n}));\n"
  },
  {
    "path": "src/components/Dashboard/Modals/SelectElement/Components/WidgetsTab/AvailableWidgetsTab.tsx",
    "content": "import { Grid, Stack, Text } from '@mantine/core';\nimport { useTranslation } from 'next-i18next';\n\nimport widgets from '../../../../../../widgets';\nimport { SelectorBackArrow } from '../Shared/SelectorBackArrow';\nimport { WidgetElementType } from './WidgetElementType';\n\ninterface AvailableIntegrationElementsProps {\n  onClickBack: () => void;\n}\n\nexport const AvailableIntegrationElements = ({\n  onClickBack,\n}: AvailableIntegrationElementsProps) => {\n  const { t } = useTranslation('layout/element-selector/selector');\n  return (\n    <Stack m=\"sm\">\n      <SelectorBackArrow onClickBack={onClickBack} />\n\n      <Text mb=\"md\" color=\"dimmed\">\n        {t('widgetDescription')}\n      </Text>\n\n      <Grid>\n        {Object.entries(widgets).map(([k, v]) => (\n          <WidgetElementType key={k} id={k} image={v.icon} widget={v} />\n        ))}\n      </Grid>\n    </Stack>\n  );\n};\n"
  },
  {
    "path": "src/components/Dashboard/Modals/SelectElement/Components/WidgetsTab/WidgetElementType.tsx",
    "content": "import { useModals } from '@mantine/modals';\nimport { showNotification } from '@mantine/notifications';\nimport { Icon, IconChecks } from '@tabler/icons-react';\nimport { useTranslation } from 'next-i18next';\nimport { v4 as uuidv4 } from 'uuid';\nimport { useConfigContext } from '~/config/provider';\nimport { useConfigStore } from '~/config/store';\nimport { IWidget, IWidgetDefinition } from '~/widgets/widgets';\n\nimport { useEditModeStore } from '../../../../Views/useEditModeStore';\nimport { GenericAvailableElementType } from '../Shared/GenericElementType';\n\ninterface WidgetElementTypeProps {\n  id: string;\n  image: string | Icon;\n  disabled?: boolean;\n  widget: IWidgetDefinition;\n}\n\nexport const WidgetElementType = ({ id, image, disabled, widget }: WidgetElementTypeProps) => {\n  const { closeModal } = useModals();\n  const { t } = useTranslation(`modules/${id}`);\n  const { name: configName, config } = useConfigContext();\n  const updateConfig = useConfigStore((x) => x.updateConfig);\n  const isEditMode = useEditModeStore((x) => x.enabled);\n\n  if (!configName) return null;\n\n  const getLowestWrapper = () => config?.wrappers.sort((a, b) => a.position - b.position)[0];\n\n  const handleAddition = async () => {\n    await updateConfig(\n      configName,\n      (prev) => ({\n        ...prev,\n        widgets: [\n          ...prev.widgets,\n          {\n            id: uuidv4(),\n            type: widget.id,\n            properties: Object.entries(widget.options).reduce(\n              (prev, [k, v]) => {\n                const newPrev = prev;\n                newPrev[k] = v.defaultValue;\n                return newPrev;\n              },\n              {} as IWidget<string, any>['properties']\n            ),\n            area: {\n              type: 'wrapper',\n              properties: {\n                id: getLowestWrapper()?.id ?? '',\n              },\n            },\n            shape: {\n              sm: {\n                location: {\n                  x: 0,\n                  y: 0,\n                },\n                size: {\n                  width: widget.gridstack.minWidth,\n                  height: widget.gridstack.minHeight,\n                },\n              },\n              md: {\n                location: {\n                  x: 0,\n                  y: 0,\n                },\n                size: {\n                  width: widget.gridstack.minWidth,\n                  height: widget.gridstack.minHeight,\n                },\n              },\n              lg: {\n                location: {\n                  x: 0,\n                  y: 0,\n                },\n                size: {\n                  width: widget.gridstack.minWidth,\n                  height: widget.gridstack.minHeight,\n                },\n              },\n            },\n          },\n        ],\n      }),\n      true,\n      !isEditMode\n    );\n    closeModal('selectElement');\n    showNotification({\n      title: t('descriptor.name'),\n      message: t('descriptor.description'),\n      icon: <IconChecks stroke={1.5} />,\n      color: 'teal',\n    });\n    umami.track('Add widget', { id: widget.id });\n  };\n\n  return (\n    <GenericAvailableElementType\n      name={t('descriptor.name')}\n      description={t('descriptor.description') ?? undefined}\n      image={image}\n      id={widget.id}\n      disabled={disabled}\n      handleAddition={handleAddition}\n    />\n  );\n};\n"
  },
  {
    "path": "src/components/Dashboard/Modals/SelectElement/SelectElementModal.tsx",
    "content": "import { ContextModalProps } from '@mantine/modals';\nimport { useState } from 'react';\n\nimport { AvailableElementTypes } from './Components/Overview/AvailableElementsOverview';\nimport { AvailableIntegrationElements } from './Components/WidgetsTab/AvailableWidgetsTab';\n\nexport const SelectElementModal = ({ context, id }: ContextModalProps) => {\n  const [activeTab, setActiveTab] = useState<undefined | 'integrations' | 'dockerImport'>();\n\n  switch (activeTab) {\n    case undefined:\n      return (\n        <AvailableElementTypes\n          modalId={id}\n          onOpenIntegrations={() => setActiveTab('integrations')}\n        />\n      );\n    case 'integrations':\n      return <AvailableIntegrationElements onClickBack={() => setActiveTab(undefined)} />;\n    default:\n      /* default to the main selection tab */\n      setActiveTab(undefined);\n      return <></>;\n  }\n};\n"
  },
  {
    "path": "src/components/Dashboard/Tiles/Apps/AppIcon.tsx",
    "content": "interface ServiceIconProps {\n  size: '100%' | number;\n}\n\nexport const AppIcon = ({ size }: ServiceIconProps) => null;\n"
  },
  {
    "path": "src/components/Dashboard/Tiles/Apps/AppMenu.tsx",
    "content": "import { useConfigContext } from '~/config/provider';\nimport { useConfigStore } from '~/config/store';\nimport { openContextModalGeneric } from '~/tools/mantineModalManagerExtensions';\nimport { generateDefaultApp } from '~/tools/shared/app';\nimport { AppType } from '~/types/app';\n\nimport { GenericTileMenu } from '../GenericTileMenu';\nimport { getLowestWrapper } from '~/tools/config/wrapper-finder';\n\ninterface TileMenuProps {\n  app: AppType;\n}\n\nexport const AppMenu = ({ app }: TileMenuProps) => {\n  const { config, name: configName } = useConfigContext();\n  const { updateConfig } = useConfigStore();\n\n  const handleDuplicate = () => {\n    if (!configName || !config) {\n      return;\n    }\n\n    const newApp = generateDefaultApp(getLowestWrapper(config)?.id ?? 'default');\n    newApp.name = app.name;\n    newApp.url = app.url;\n    newApp.behaviour = app.behaviour;\n    newApp.network = app.network;\n    newApp.appearance = app.appearance;\n    newApp.integration = app.integration;\n\n    void updateConfig(\n      configName,\n      (previousConfig) => ({\n        ...previousConfig,\n        apps: [\n          ...previousConfig.apps,\n          {\n            ...newApp,\n          },\n        ],\n      }),\n      true,\n      true\n    );\n  };\n\n  const handleClickEdit = () => {\n    openContextModalGeneric<{ app: AppType; allowAppNamePropagation: boolean }>({\n      modal: 'editApp',\n      size: 'xl',\n      innerProps: {\n        app,\n        allowAppNamePropagation: false,\n      },\n      styles: {\n        root: {\n          zIndex: 201,\n        },\n      },\n    });\n  };\n\n  const handleClickChangePosition = () => {\n    openContextModalGeneric({\n      modal: 'changeAppPositionModal',\n      innerProps: {\n        app,\n      },\n      styles: {\n        root: {\n          zIndex: 201,\n        },\n      },\n    });\n  };\n\n  const handleClickDelete = () => {\n    if (configName === undefined) {\n      return;\n    }\n\n    updateConfig(configName, (previousConfig) => ({\n      ...previousConfig,\n      apps: previousConfig.apps.filter((a) => a.id !== app.id),\n    }));\n  };\n\n  return (\n    <GenericTileMenu\n      handleClickEdit={handleClickEdit}\n      handleClickChangePosition={handleClickChangePosition}\n      handleClickDelete={handleClickDelete}\n      handleDuplicate={handleDuplicate}\n      displayEdit\n    />\n  );\n};\n"
  },
  {
    "path": "src/components/Dashboard/Tiles/Apps/AppPing.tsx",
    "content": "import { Box, Indicator, Tooltip } from '@mantine/core';\nimport { IconCheck, IconLoader, IconX } from '@tabler/icons-react';\nimport Consola from 'consola';\nimport { TargetAndTransition, Transition, motion } from 'framer-motion';\nimport { useSession } from 'next-auth/react';\nimport { useTranslation } from 'next-i18next';\nimport { useConfigContext } from '~/config/provider';\nimport { AppType } from '~/types/app';\nimport { RouterOutputs, api } from '~/utils/api';\n\ninterface AppPingProps {\n  app: AppType;\n}\n\nexport const AppPing = ({ app }: AppPingProps) => {\n  const { data: sessionData } = useSession();\n  const { data: userWithSettings } = api.user.withSettings.useQuery(undefined, {\n    enabled: app.network.enabledStatusChecker && !!sessionData?.user,\n  });\n\n  const { data, isFetching, isError, error, isActive } = usePing(app);\n  const tooltipLabel = useTooltipLabel({ isFetching, isError, data, errorMessage: error?.message });\n  const isOnline = isError ? false : data?.state === 'online';\n\n  const pulse = usePingPulse({ isOnline, settings: userWithSettings?.settings });\n\n  if (!isActive) return null;\n\n  const replaceDotWithIcon = userWithSettings?.settings.replacePingWithIcons ?? false;\n\n  return (\n    <motion.div\n      style={{\n        position: 'absolute',\n        bottom: replaceDotWithIcon ? 0 : 20,\n        right: replaceDotWithIcon ? 8 : 20,\n        zIndex: 2,\n      }}\n      animate={pulse.animate}\n      transition={pulse.transition}\n    >\n      <Tooltip withinPortal radius=\"lg\" label={tooltipLabel}>\n        {replaceDotWithIcon ? (\n          <Box>\n            <AccessibleIndicatorPing isFetching={isFetching} isOnline={isOnline} />\n          </Box>\n        ) : (\n          <Indicator\n            size={15}\n            color={isFetching ? 'yellow' : isOnline ? 'green' : 'red'}\n            children={null}\n          />\n        )}\n      </Tooltip>\n    </motion.div>\n  );\n};\n\ntype AccessibleIndicatorPingProps = {\n  isOnline: boolean;\n  isFetching: boolean;\n};\n\nconst AccessibleIndicatorPing = ({ isFetching, isOnline }: AccessibleIndicatorPingProps) => {\n  if (isOnline) {\n    return <IconCheck color=\"green\" />;\n  }\n\n  if (isFetching) {\n    return <IconLoader />;\n  }\n\n  return <IconX color=\"red\" />;\n};\n\nexport const isStatusOk = (app: AppType, status: number) => {\n  if (app.network.okStatus === undefined || app.network.statusCodes.length >= 1) {\n    return app.network.statusCodes.includes(status.toString());\n  }\n  return app.network.okStatus.includes(status);\n};\n\ntype TooltipLabelProps = {\n  isFetching: boolean;\n  isError: boolean;\n  data: RouterOutputs['app']['ping'] | undefined;\n  errorMessage: string | undefined;\n};\n\nconst useTooltipLabel = ({ isFetching, isError, data, errorMessage }: TooltipLabelProps) => {\n  const { t } = useTranslation('modules/ping');\n\n  if (isFetching) return t('states.loading');\n  if (isError) return errorMessage;\n  if (data?.state === 'online') return t('states.online', { response: data?.status ?? 'N/A' });\n  return `${data?.statusText}: ${data?.status} (denied)`;\n};\n\nconst usePing = (app: AppType) => {\n  const { config, name } = useConfigContext();\n  const isActive =\n    (config?.settings.customization.layout.enabledPing && app.network.enabledStatusChecker) ??\n    false;\n\n  const queryResult = api.app.ping.useQuery(\n    {\n      id: app.id,\n      configName: name ?? '',\n    },\n    {\n      retry: false,\n      enabled: isActive,\n      refetchOnWindowFocus: false,\n      refetchInterval: 1000 * 60,\n      cacheTime: 1000 * 30,\n      retryOnMount: true,\n      select: (data) => {\n        const isOk = isStatusOk(app, data.status);\n        if (isOk)\n          Consola.info(`Ping of app \"${app.name}\" (${app.url}) returned ${data.status} (Accepted)`);\n        else\n          Consola.warn(`Ping of app \"${app.name}\" (${app.url}) returned ${data.status} (Refused)`);\n        return {\n          status: data.status,\n          state: isOk ? ('online' as const) : ('down' as const),\n          statusText: data.statusText,\n        };\n      },\n    }\n  );\n\n  return {\n    ...queryResult,\n    isActive,\n  };\n};\n\ntype PingPulse = {\n  animate?: TargetAndTransition;\n  transition?: Transition;\n};\n\ntype UsePingPulseProps = {\n  isOnline: boolean;\n  settings?: RouterOutputs['user']['withSettings']['settings'];\n};\n\nconst usePingPulse = ({ isOnline, settings }: UsePingPulseProps): PingPulse => {\n  const disablePulse = settings?.disablePingPulse ?? false;\n\n  if (disablePulse) {\n    return {};\n  }\n\n  return {\n    animate: {\n      scale: isOnline ? [1, 0.7, 1] : 1,\n    },\n    transition: {\n      repeat: Infinity,\n      duration: 2.5,\n      ease: 'easeInOut',\n    },\n  };\n};\n"
  },
  {
    "path": "src/components/Dashboard/Tiles/Apps/AppTile.tsx",
    "content": "import { Box, Text, Tooltip, UnstyledButton } from '@mantine/core';\nimport { createStyles, useMantineTheme } from '@mantine/styles';\nimport { motion } from 'framer-motion';\nimport { useExternalUrl } from '~/hooks/useExternalUrl';\nimport { AppType } from '~/types/app';\n\nimport { useEditModeStore } from '../../Views/useEditModeStore';\nimport { HomarrCardWrapper } from '../HomarrCardWrapper';\nimport { BaseTileProps } from '../type';\nimport { AppMenu } from './AppMenu';\nimport { AppPing } from './AppPing';\n\ninterface AppTileProps extends BaseTileProps {\n  app: AppType;\n}\n\nexport const AppTile = ({ className, app }: AppTileProps) => {\n  const isEditMode = useEditModeStore((x) => x.enabled);\n  const { cx, classes } = useStyles();\n  const { colorScheme } = useMantineTheme();\n  const tooltipContent = [\n    app.appearance.appNameStatus === 'hover' ? app.name : undefined,\n    app.behaviour.tooltipDescription,\n  ]\n    .filter((e) => e)\n    .join(': ');\n\n  const isRow = app.appearance.positionAppName.includes('row');\n  const href = useExternalUrl(app);\n\n  function Inner() {\n    return (\n      <Tooltip.Floating\n        label={tooltipContent}\n        position=\"right-start\"\n        c={colorScheme === 'light' ? 'black' : 'dark.0'}\n        color={colorScheme === 'light' ? 'gray.2' : 'dark.4'}\n        multiline\n        disabled={!tooltipContent}\n        styles={{ tooltip: { maxWidth: 300 } }}\n      >\n        <Box\n          className={`${classes.base} ${cx(classes.appContent, 'dashboard-tile-app')}`}\n          h=\"100%\"\n          sx={{\n            flexFlow: app.appearance.positionAppName ?? 'column',\n          }}\n        >\n          {app.appearance.appNameStatus === 'normal' && (\n            <Text\n              className={cx(classes.appName, 'dashboard-tile-app-title')}\n              fw={700}\n              size={app.appearance.appNameFontSize}\n              ta=\"center\"\n              sx={{\n                flex: isRow ? '1' : undefined,\n              }}\n              lineClamp={app.appearance.lineClampAppName}\n            >\n              {app.name}\n            </Text>\n          )}\n          <motion.img\n            className={cx(classes.appImage, 'dashboard-tile-app-image')}\n            src={app.appearance.iconUrl}\n            alt={app.name}\n            whileHover={{ scale: 0.9 }}\n            initial={{ scale: 0.8 }}\n            style={{\n              width: isRow ? 0 : undefined,\n            }}\n          />\n        </Box>\n      </Tooltip.Floating>\n    );\n  }\n\n  return (\n    <HomarrCardWrapper className={className} p={10}>\n      <AppMenu app={app} />\n      {!app.url || isEditMode ? (\n        <UnstyledButton\n          className={`${classes.button} ${classes.base}`}\n          style={{ pointerEvents: isEditMode ? 'none' : 'auto' }}\n        >\n          <Inner />\n        </UnstyledButton>\n      ) : (\n        <UnstyledButton\n          style={{ pointerEvents: isEditMode ? 'none' : 'auto' }}\n          component=\"a\"\n          rel=\"noreferrer\"\n          href={href}\n          target={app.behaviour.isOpeningNewTab ? '_blank' : '_self'}\n          className={`${classes.button} ${classes.base}`}\n        >\n          <Inner />\n        </UnstyledButton>\n      )}\n      <AppPing app={app} />\n    </HomarrCardWrapper>\n  );\n};\n\nconst useStyles = createStyles((theme, _params, getRef) => ({\n  base: {\n    display: 'flex',\n    alignItems: 'center',\n    justifyContent: 'center',\n  },\n  appContent: {\n    gap: 0,\n    overflow: 'visible',\n    flexGrow: 5,\n  },\n  appImage: {\n    maxHeight: '100%',\n    maxWidth: '100%',\n    overflow: 'auto',\n    flex: 1,\n    objectFit: 'contain',\n  },\n  appName: {\n    wordBreak: 'break-word',\n  },\n  button: {\n    height: '100%',\n    width: '100%',\n    gap: 4,\n  },\n}));\n\nexport const appTileDefinition = {\n  component: AppTile,\n  minWidth: 1,\n  minHeight: 1,\n  maxWidth: 12,\n  maxHeight: 12,\n};\n"
  },
  {
    "path": "src/components/Dashboard/Tiles/EmptyTile.tsx",
    "content": "import { HomarrCardWrapper } from './HomarrCardWrapper';\nimport { BaseTileProps } from './type';\n\nexport const EmptyTile = ({ className }: BaseTileProps) => (\n  <HomarrCardWrapper className={className}>Empty</HomarrCardWrapper>\n);\n"
  },
  {
    "path": "src/components/Dashboard/Tiles/GenericTileMenu.tsx",
    "content": "import { ActionIcon, Menu } from '@mantine/core';\nimport {\n  IconCopy,\n  IconLayoutKanban,\n  IconPencil,\n  IconSettings,\n  IconTrash,\n} from '@tabler/icons-react';\nimport { useTranslation } from 'next-i18next';\n\nimport { useEditModeStore } from '../Views/useEditModeStore';\n\ninterface GenericTileMenuProps {\n  handleClickEdit: () => void;\n  handleClickChangePosition: () => void;\n  handleClickDelete: () => void;\n  handleDuplicate?: () => void;\n  displayEdit: boolean;\n}\n\nexport const GenericTileMenu = ({\n  handleClickEdit,\n  handleClickChangePosition,\n  handleClickDelete,\n  handleDuplicate,\n  displayEdit,\n}: GenericTileMenuProps) => {\n  const { t } = useTranslation('common');\n  const isEditMode = useEditModeStore((x) => x.enabled);\n\n  if (!isEditMode) {\n    return null;\n  }\n\n  return (\n    <Menu withinPortal withArrow position=\"right\">\n      <Menu.Target>\n        <ActionIcon\n          style={{ zIndex: 1 }}\n          size=\"md\"\n          radius=\"md\"\n          variant=\"light\"\n          pos=\"absolute\"\n          top={8}\n          right={8}\n        >\n          <IconSettings />\n        </ActionIcon>\n      </Menu.Target>\n      <Menu.Dropdown w={250}>\n        <Menu.Label>{t('sections.settings')}</Menu.Label>\n        {displayEdit && (\n          <Menu.Item icon={<IconPencil size={16} stroke={1.5} />} onClick={handleClickEdit}>\n            {t('edit')}\n          </Menu.Item>\n        )}\n        {handleDuplicate && (\n          <Menu.Item icon={<IconCopy size={'1rem'} />} onClick={handleDuplicate}>\n            {t('duplicate')}\n          </Menu.Item>\n        )}\n        <Menu.Item\n          icon={<IconLayoutKanban size={16} stroke={1.5} />}\n          onClick={handleClickChangePosition}\n        >\n          {t('changePosition')}\n        </Menu.Item>\n        <Menu.Label>{t('sections.dangerZone')}</Menu.Label>\n        <Menu.Item\n          color=\"red\"\n          icon={<IconTrash size={16} stroke={1.5} color=\"red\" />}\n          onClick={handleClickDelete}\n        >\n          {t('remove')}\n        </Menu.Item>\n      </Menu.Dropdown>\n    </Menu>\n  );\n};\n"
  },
  {
    "path": "src/components/Dashboard/Tiles/HomarrCardWrapper.tsx",
    "content": "import { Card, CardProps } from '@mantine/core';\nimport { ReactNode } from 'react';\n\nimport { useCardStyles } from '../../layout/Common/useCardStyles';\nimport { useEditModeStore } from '../Views/useEditModeStore';\n\ninterface HomarrCardWrapperProps extends CardProps {\n  children: ReactNode;\n  isCategory?: boolean;\n}\n\nexport const HomarrCardWrapper = ({ ...props }: HomarrCardWrapperProps) => {\n  const { isCategory = false, ...restProps } = props;\n  const {\n    cx,\n    classes: { card: cardClass },\n  } = useCardStyles(isCategory);\n  const isEditMode = useEditModeStore((x) => x.enabled);\n  return (\n    <Card\n      {...restProps}\n      className={cx(restProps.className, cardClass, 'dashboard-gs-generic-item')}\n      withBorder\n      style={{ cursor: isEditMode ? 'move' : 'default' }}\n      radius=\"lg\"\n      shadow=\"sm\"\n    />\n  );\n};\n"
  },
  {
    "path": "src/components/Dashboard/Tiles/TileWrapper.tsx",
    "content": "/* eslint-disable react/no-unknown-property */\nimport { ReactNode, RefObject } from 'react';\n\ninterface GridstackTileWrapperProps {\n  id: string;\n  type: 'app' | 'widget';\n  x?: number;\n  y?: number;\n  width?: number;\n  height?: number;\n  minWidth?: number;\n  minHeight?: number;\n  maxWidth?: number;\n  maxHeight?: number;\n  itemRef: RefObject<HTMLDivElement>;\n  children: ReactNode;\n}\n\nexport const GridstackTileWrapper = ({\n  id,\n  type,\n  x,\n  y,\n  width,\n  height,\n  minWidth,\n  minHeight,\n  maxWidth,\n  maxHeight,\n  children,\n  itemRef,\n}: GridstackTileWrapperProps) => {\n  const locationProperties = useLocationProperties(x, y);\n  const normalizedWidth = width ?? minWidth;\n  const normalizedHeight = height ?? minHeight;\n\n  return (\n    <div\n      className=\"grid-stack-item\"\n      data-type={type}\n      data-id={id}\n      {...locationProperties}\n      gs-w={normalizedWidth}\n      data-gridstack-w={normalizedWidth}\n      gs-h={normalizedHeight}\n      data-gridstack-h={normalizedHeight}\n      gs-min-w={minWidth}\n      gs-min-h={minHeight}\n      gs-max-w={maxWidth}\n      gs-max-h={maxHeight}\n      ref={itemRef}\n    >\n      {children}\n    </div>\n  );\n};\n\nconst useLocationProperties = (x: number | undefined, y: number | undefined) => {\n  const isLocationDefined = x !== undefined && y !== undefined;\n\n  if (!isLocationDefined) {\n    return {\n      'gs-auto-position': 'true',\n    };\n  }\n\n  return {\n    'gs-x': x.toString(),\n    'data-gridstack-x': x.toString(),\n    'gs-y': y.toString(),\n    'data-gridstack-y': y.toString(),\n  };\n};\n"
  },
  {
    "path": "src/components/Dashboard/Tiles/Widgets/Inputs/DraggableList.tsx",
    "content": "import { Collapse, Flex, Stack, Text, createStyles } from '@mantine/core';\nimport { useDisclosure } from '@mantine/hooks';\nimport { IconChevronDown, IconGripVertical } from '@tabler/icons-react';\nimport { Reorder, useDragControls } from 'framer-motion';\nimport { FC, useEffect, useRef } from 'react';\nimport { IDraggableEditableListInputValue } from '~/widgets/widgets';\n\ninterface DraggableListProps {\n  items: {\n    data: { id: string } & any;\n  }[];\n  value: IDraggableEditableListInputValue<any>['defaultValue'];\n  onChange: (value: IDraggableEditableListInputValue<any>['defaultValue']) => void;\n  options: IDraggableEditableListInputValue<any>;\n}\n\nexport const DraggableList = ({ items, value, onChange, options }: DraggableListProps) => (\n  <div>\n    <Reorder.Group\n      axis=\"y\"\n      values={items.map((x) => x.data.id)}\n      onReorder={(order) => onChange(order.map((id) => value.find((v) => v.id === id)!))}\n      as=\"div\"\n    >\n      {items.map(({ data }) => (\n        <ListItem key={data.id} item={data} label={options.getLabel(data)}>\n          <options.itemComponent\n            data={data}\n            onChange={(data: any) => {\n              onChange(\n                items.map((item) => {\n                  if (item.data.id === data.id) return data;\n                  return item.data;\n                })\n              );\n            }}\n            delete={() => {\n              onChange(items.filter((item) => item.data.id !== data.id).map((item) => item.data));\n            }}\n          />\n        </ListItem>\n      ))}\n    </Reorder.Group>\n  </div>\n);\n\nconst ListItem: FC<{\n  item: any;\n  label: string | JSX.Element;\n  children: JSX.Element;\n}> = ({ item, label, children }) => {\n  const [opened, handlers] = useDisclosure(false);\n  const { classes, cx } = useStyles();\n  const controls = useDragControls();\n\n  // Workaround for mobile drag controls not working\n  // https://github.com/framer/motion/issues/1597#issuecomment-1235026724\n  const dragRef = useRef<HTMLDivElement>(null);\n  useEffect(() => {\n    const touchHandler: EventListener = (e) => e.preventDefault();\n\n    const dragItem = dragRef.current;\n\n    if (dragItem) {\n      dragItem.addEventListener('touchstart', touchHandler, { passive: false });\n\n      return () => {\n        dragItem.removeEventListener('touchstart', touchHandler);\n      };\n    }\n\n    return undefined;\n  }, [dragRef]);\n\n  return (\n    <Reorder.Item value={item.id} dragListener={false} dragControls={controls} as=\"div\">\n      <div className={classes.container}>\n        <div className={classes.row}>\n          <Flex ref={dragRef} onPointerDown={(e) => controls.start(e)}>\n            <IconGripVertical className={classes.clickableIcons} size={18} stroke={1.5} />\n          </Flex>\n\n          <div className={classes.middle}>\n            <Text className={classes.symbol}>{label}</Text>\n          </div>\n\n          <IconChevronDown\n            className={cx(classes.clickableIcons, { [classes.rotate]: opened })}\n            onClick={() => handlers.toggle()}\n            size={18}\n            stroke={1.5}\n          />\n        </div>\n\n        <Collapse in={opened}>\n          <Stack className={classes.collapseContent}>{children}</Stack>\n        </Collapse>\n      </div>\n    </Reorder.Item>\n  );\n};\n\nconst useStyles = createStyles((theme) => ({\n  container: {\n    display: 'flex',\n    flexDirection: 'column',\n    borderRadius: theme.radius.md,\n    border: `1px solid ${\n      theme.colorScheme === 'dark' ? theme.colors.dark[5] : theme.colors.gray[2]\n    }`,\n    backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[5] : theme.white,\n    marginBottom: theme.spacing.xs,\n  },\n  row: {\n    display: 'flex',\n    alignItems: 'center',\n    justifyContent: 'space-between',\n    padding: '12px 16px',\n    gap: theme.spacing.sm,\n  },\n  middle: {\n    flexGrow: 1,\n  },\n  symbol: {\n    fontSize: 16,\n  },\n  clickableIcons: {\n    color: theme.colorScheme === 'dark' ? theme.colors.dark[1] : theme.colors.gray[6],\n    cursor: 'pointer',\n    userSelect: 'none',\n    transition: 'transform .3s ease-in-out',\n  },\n  rotate: {\n    transform: 'rotate(180deg)',\n  },\n  collapseContent: {\n    padding: '12px 16px',\n  },\n}));\n"
  },
  {
    "path": "src/components/Dashboard/Tiles/Widgets/Inputs/LocationSelection.tsx",
    "content": "import {\n  ActionIcon,\n  Anchor,\n  Button,\n  Card,\n  Center,\n  Flex,\n  Group,\n  Loader,\n  Modal,\n  NumberInput,\n  Stack,\n  Table,\n  Text,\n  TextInput,\n  Title,\n  Tooltip,\n} from '@mantine/core';\nimport { useDisclosure } from '@mantine/hooks';\nimport { IconAlertTriangle, IconClick, IconListSearch } from '@tabler/icons-react';\nimport { useTranslation } from 'next-i18next';\nimport { useState } from 'react';\nimport { InfoCard } from '~/components/InfoCard/InfoCard';\nimport { City } from '~/server/api/routers/weather';\nimport { api } from '~/utils/api';\n\nimport { IntegrationOptionsValueType } from '../WidgetsEditModal';\n\ntype LocationSelectionProps = {\n  widgetId: string;\n  propName: string;\n  value: any;\n  handleChange: (key: string, value: IntegrationOptionsValueType) => void;\n  info?: boolean;\n  infoLink?: string;\n};\n\nexport const LocationSelection = ({\n  widgetId,\n  propName: key,\n  value,\n  handleChange,\n  info,\n  infoLink,\n}: LocationSelectionProps) => {\n  const { t } = useTranslation('widgets/location');\n  const [query, setQuery] = useState(value.name ?? '');\n  const [opened, { open, close }] = useDisclosure(false);\n  const selectionEnabled = query.length > 1;\n  const emptyLocation = t('form.empty');\n\n  const onCitySelected = (city: City) => {\n    close();\n    handleChange(key, {\n      name: city.name,\n      latitude: city.latitude,\n      longitude: city.longitude,\n    });\n    setQuery(city.name);\n  };\n\n  return (\n    <>\n      <Card>\n        <Stack spacing=\"xs\">\n          <Flex direction=\"row\" justify=\"space-between\" wrap=\"nowrap\">\n            <Title order={5}>{t(`modules/${widgetId}:descriptor.settings.${key}.label`)}</Title>\n            {info && (\n              <InfoCard\n                message={t(`modules/${widgetId}:descriptor.settings.${key}.info`)}\n                link={infoLink}\n              />\n            )}\n          </Flex>\n\n          <Group noWrap align=\"end\">\n            <TextInput\n              w=\"100%\"\n              label={t('form.field.query')}\n              value={query}\n              onChange={(ev) => {\n                setQuery(ev.currentTarget.value);\n                handleChange(key, {\n                  name: ev.currentTarget.value,\n                  longitude: '',\n                  latitude: '',\n                });\n              }}\n            />\n            <Tooltip hidden={selectionEnabled} label={t('form.button.search.disabledTooltip')}>\n              <div>\n                <Button\n                  disabled={!selectionEnabled}\n                  onClick={() => {\n                    if (selectionEnabled) open();\n                  }}\n                  variant=\"light\"\n                  leftIcon={<IconListSearch size={16} />}\n                >\n                  {t('form.button.search.label')}\n                </Button>\n              </div>\n            </Tooltip>\n          </Group>\n\n          <Group grow>\n            <NumberInput\n              value={value.latitude}\n              onChange={(inputValue) => {\n                if (typeof inputValue !== 'number') return;\n                handleChange(key, {\n                  ...value,\n                  name: emptyLocation,\n                  latitude: inputValue,\n                });\n                setQuery(emptyLocation);\n              }}\n              precision={5}\n              label={t('form.field.latitude')}\n              hideControls\n            />\n            <NumberInput\n              value={value.longitude}\n              onChange={(inputValue) => {\n                if (typeof inputValue !== 'number') return;\n                handleChange(key, {\n                  ...value,\n                  name: emptyLocation,\n                  longitude: inputValue,\n                });\n                setQuery(emptyLocation);\n              }}\n              precision={5}\n              label={t('form.field.longitude')}\n              hideControls\n            />\n          </Group>\n        </Stack>\n      </Card>\n      <CitySelectModal\n        opened={opened}\n        closeModal={close}\n        query={query}\n        onCitySelected={onCitySelected}\n      />\n    </>\n  );\n};\n\ntype CitySelectModalProps = {\n  opened: boolean;\n  closeModal: () => void;\n  query: string;\n  onCitySelected: (location: City) => void;\n};\n\nconst CitySelectModal = ({ opened, closeModal, query, onCitySelected }: CitySelectModalProps) => {\n  const { t } = useTranslation('widgets/location');\n  const { isLoading, data, isError } = api.weather.findCity.useQuery(\n    { query },\n    {\n      retry: false,\n      enabled: opened,\n      refetchOnWindowFocus: false,\n      refetchOnMount: false,\n    }\n  );\n\n  if (isError === true)\n    return (\n      <Modal\n        title={t('modal.title') + ' - ' + query}\n        size=\"xl\"\n        opened={opened}\n        onClose={closeModal}\n        zIndex={250}\n      >\n        <Center>\n          <Stack align=\"center\">\n            <IconAlertTriangle />\n            <Title order={6}>{t('modal.table.nothingFound.title')}</Title>\n            <Text>{t('modal.table.nothingFound.description')}</Text>\n          </Stack>\n        </Center>\n      </Modal>\n    );\n\n  const formatter = Intl.NumberFormat('en', { notation: 'compact' });\n\n  return (\n    <Modal\n      title={t('modal.title') + ' - ' + query}\n      size=\"xl\"\n      opened={opened}\n      onClose={closeModal}\n      zIndex={250}\n    >\n      <Stack>\n        <Table striped>\n          <thead>\n            <tr>\n              <th style={{ width: '70%' }}>{t('modal.table.header.city')}</th>\n              <th style={{ width: '50%' }}>{t('modal.table.header.country')}</th>\n              <th>{t('modal.table.header.coordinates')}</th>\n              <th>{t('modal.table.header.population')}</th>\n              <th style={{ width: 40 }} />\n            </tr>\n          </thead>\n          <tbody>\n            {isLoading && (\n              <tr>\n                <td colSpan={5}>\n                  <Group position=\"center\">\n                    <Loader />\n                  </Group>\n                </td>\n              </tr>\n            )}\n            {data?.results.map((city) => (\n              <tr key={city.id}>\n                <td>\n                  <Text style={{ whiteSpace: 'nowrap' }}>{city.name}</Text>\n                </td>\n                <td>\n                  <Text style={{ whiteSpace: 'nowrap' }}>{city.country}</Text>\n                </td>\n                <td>\n                  <Anchor\n                    target=\"_blank\"\n                    href={`https://www.google.com/maps/place/${city.latitude},${city.longitude}`}\n                  >\n                    <Text style={{ whiteSpace: 'nowrap' }}>\n                      {city.latitude}, {city.longitude}\n                    </Text>\n                  </Anchor>\n                </td>\n                <td>\n                  {city.population ? (\n                    <Text style={{ whiteSpace: 'nowrap' }}>\n                      {formatter.format(city.population)}\n                    </Text>\n                  ) : (\n                    <Text color=\"dimmed\"> {t('modal.table.population.fallback')}</Text>\n                  )}\n                </td>\n                <td>\n                  <Tooltip\n                    label={t('modal.table.action.select', {\n                      city: city.name,\n                      countryCode: city.country_code,\n                    })}\n                  >\n                    <ActionIcon\n                      color=\"red\"\n                      variant=\"subtle\"\n                      onClick={() => {\n                        onCitySelected(city);\n                      }}\n                    >\n                      <IconClick size={16} />\n                    </ActionIcon>\n                  </Tooltip>\n                </td>\n              </tr>\n            ))}\n          </tbody>\n        </Table>\n        <Group position=\"right\">\n          <Button variant=\"light\" onClick={() => closeModal()}>\n            {t('common:cancel')}\n          </Button>\n        </Group>\n      </Stack>\n    </Modal>\n  );\n};\n"
  },
  {
    "path": "src/components/Dashboard/Tiles/Widgets/Inputs/StaticDraggableList.tsx",
    "content": "import { Collapse, Flex, Stack, Text, createStyles } from '@mantine/core';\nimport { useDisclosure } from '@mantine/hooks';\nimport { IconChevronDown, IconGripVertical } from '@tabler/icons-react';\nimport { Reorder, useDragControls } from 'framer-motion';\nimport { FC, ReactNode, useEffect, useRef } from 'react';\nimport { IDraggableListInputValue } from '~/widgets/widgets';\n\nconst useStyles = createStyles((theme) => ({\n  container: {\n    display: 'flex',\n    flexDirection: 'column',\n    borderRadius: theme.radius.md,\n    border: `1px solid ${\n      theme.colorScheme === 'dark' ? theme.colors.dark[5] : theme.colors.gray[2]\n    }`,\n    backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[5] : theme.white,\n    marginBottom: theme.spacing.xs,\n  },\n  row: {\n    display: 'flex',\n    alignItems: 'center',\n    justifyContent: 'space-between',\n    padding: '12px 16px',\n    gap: theme.spacing.sm,\n  },\n  middle: {\n    flexGrow: 1,\n  },\n  symbol: {\n    fontSize: 16,\n  },\n  clickableIcons: {\n    color: theme.colorScheme === 'dark' ? theme.colors.dark[1] : theme.colors.gray[6],\n    cursor: 'pointer',\n    userSelect: 'none',\n    transition: 'transform .3s ease-in-out',\n  },\n  rotate: {\n    transform: 'rotate(180deg)',\n  },\n  collapseContent: {\n    padding: '12px 16px',\n  },\n}));\n\ntype StaticDraggableListParams = {\n  value: IDraggableListInputValue['defaultValue'];\n  onChange: (value: IDraggableListInputValue['defaultValue']) => void;\n  labels: Record<string, string>;\n  children?: Record<string, ReactNode>;\n};\n\nexport const StaticDraggableList: FC<StaticDraggableListParams> = (props) => {\n  const keys = props.value.map((v) => v.key);\n\n  return (\n    <div>\n      <Reorder.Group\n        axis=\"y\"\n        values={keys}\n        onReorder={(order) =>\n          props.onChange(order.map((key) => props.value.find((v) => v.key === key)!))\n        }\n        as=\"div\"\n      >\n        {props.value.map((item) => (\n          <ListItem key={item.key} item={item} label={props.labels[item.key]}>\n            {props.children?.[item.key]}\n          </ListItem>\n        ))}\n      </Reorder.Group>\n    </div>\n  );\n};\n\nconst ListItem: FC<{\n  item: IDraggableListInputValue['defaultValue'][number];\n  label: string;\n  children?: ReactNode;\n}> = (props) => {\n  const { classes, cx } = useStyles();\n  const controls = useDragControls();\n\n  const [opened, handlers] = useDisclosure(false);\n  const hasContent = props.children != null && Object.keys(props.children).length !== 0;\n\n  // Workaround for mobile drag controls not working\n  // https://github.com/framer/motion/issues/1597#issuecomment-1235026724\n  const dragRef = useRef<HTMLDivElement>(null);\n  useEffect(() => {\n    const touchHandler: EventListener = (e) => e.preventDefault();\n\n    const dragItem = dragRef.current;\n\n    if (dragItem) {\n      dragItem.addEventListener('touchstart', touchHandler, { passive: false });\n\n      return () => {\n        dragItem.removeEventListener('touchstart', touchHandler);\n      };\n    }\n\n    return undefined;\n  }, [dragRef]);\n\n  return (\n    <Reorder.Item value={props.item.key} dragListener={false} dragControls={controls} as=\"div\">\n      <div className={classes.container}>\n        <div className={classes.row}>\n          <Flex ref={dragRef} onPointerDown={(e) => controls.start(e)}>\n            <IconGripVertical className={classes.clickableIcons} size={18} stroke={1.5} />\n          </Flex>\n\n          <div className={classes.middle}>\n            <Text className={classes.symbol}>{props.label}</Text>\n          </div>\n\n          {hasContent && (\n            <IconChevronDown\n              className={cx(classes.clickableIcons, { [classes.rotate]: opened })}\n              onClick={() => handlers.toggle()}\n              size={18}\n              stroke={1.5}\n            />\n          )}\n        </div>\n\n        {hasContent && (\n          <Collapse in={opened}>\n            <Stack className={classes.collapseContent}>{props.children}</Stack>\n          </Collapse>\n        )}\n      </div>\n    </Reorder.Item>\n  );\n};\n"
  },
  {
    "path": "src/components/Dashboard/Tiles/Widgets/WidgetsEditModal.tsx",
    "content": "import {\n  Alert,\n  Button,\n  Card,\n  Flex,\n  Group,\n  MultiSelect,\n  NumberInput,\n  Select,\n  Slider,\n  Stack,\n  Switch,\n  Text,\n  TextInput,\n  Title,\n} from '@mantine/core';\nimport { ContextModalProps } from '@mantine/modals';\nimport { IconAlertTriangle, IconPlaylistX, IconPlus } from '@tabler/icons-react';\nimport { Trans, useTranslation } from 'next-i18next';\nimport { FC, useState } from 'react';\nimport { useConfigContext } from '~/config/provider';\nimport { useConfigStore } from '~/config/store';\nimport { mapObject } from '~/tools/client/objects';\nimport type { IDraggableListInputValue, IWidgetOptionValue } from '~/widgets/widgets';\nimport { IWidget } from '~/widgets/widgets';\n\nimport Widgets from '../../../../widgets';\nimport { InfoCard } from '../../../InfoCard/InfoCard';\nimport { DraggableList } from './Inputs/DraggableList';\nimport { LocationSelection } from './Inputs/LocationSelection';\nimport { StaticDraggableList } from './Inputs/StaticDraggableList';\n\nexport type WidgetEditModalInnerProps = {\n  widgetId: string;\n  widgetType: string;\n  options: IWidget<string, any>['properties'];\n  widgetOptions: IWidget<string, any>['properties'];\n};\n\nexport type IntegrationOptionsValueType = IWidget<string, any>['properties'][string];\n\nexport const WidgetsEditModal = ({\n  context,\n  id,\n  innerProps,\n}: ContextModalProps<WidgetEditModalInnerProps>) => {\n  const { t } = useTranslation([`modules/${innerProps.widgetType}`, 'common']);\n  const [moduleProperties, setModuleProperties] = useState(innerProps.options);\n  const items = Object.entries(innerProps.widgetOptions ?? {}) as [\n    string,\n    IntegrationOptionsValueType,\n  ][];\n\n  // Find the Key in the \"Widgets\" Object that matches the widgetId\n  const currentWidgetDefinition = Widgets[innerProps.widgetType as keyof typeof Widgets];\n  const { name: configName } = useConfigContext();\n  const updateConfig = useConfigStore((x) => x.updateConfig);\n\n  if (!configName || !innerProps.options) return null;\n\n  const handleChange = (key: string, value: IntegrationOptionsValueType) => {\n    setModuleProperties((prev) => {\n      const copyOfPrev: any = { ...prev };\n      copyOfPrev[key] = value;\n      return copyOfPrev;\n    });\n  };\n\n  const handleSave = () => {\n    updateConfig(\n      configName,\n      (prev) => {\n        const currentWidget = prev.widgets.find((x) => x.id === innerProps.widgetId);\n        currentWidget!.properties = moduleProperties;\n\n        return {\n          ...prev,\n          widgets: [...prev.widgets.filter((x) => x.id !== innerProps.widgetId), currentWidget!],\n        };\n      },\n      true\n    );\n    context.closeModal(id);\n  };\n\n  return (\n    <Stack>\n      {items.map(([key], index) => {\n        const option = (currentWidgetDefinition as any).options[key] as IWidgetOptionValue;\n        const value = moduleProperties[key] ?? option.defaultValue;\n\n        if (!option) {\n          return (\n            <Alert icon={<IconAlertTriangle />} color=\"red\">\n              <Text>\n                <Trans\n                  i18nKey=\"modules/common:errors.unmappedOptions.text\"\n                  values={{ key }}\n                  components={{ b: <b />, code: <code /> }}\n                />\n              </Text>\n            </Alert>\n          );\n        }\n\n        return (\n          <WidgetOptionTypeSwitch\n            key={`${key}.${index}`}\n            option={option}\n            widgetId={innerProps.widgetType}\n            propName={key}\n            value={value}\n            handleChange={handleChange}\n          />\n        );\n      })}\n      <Group position=\"right\">\n        <Button onClick={() => context.closeModal(id)} variant=\"light\">\n          {t('common:cancel')}\n        </Button>\n        <Button onClick={handleSave}>{t('common:save')}</Button>\n      </Group>\n    </Stack>\n  );\n};\n\n// Widget switch\n// Widget options are computed based on their type.\n// here you can define new types for options (along with editing the widgets.d.ts file)\nconst WidgetOptionTypeSwitch: FC<{\n  option: IWidgetOptionValue;\n  widgetId: string;\n  propName: string;\n  value: any;\n  handleChange: (key: string, value: IntegrationOptionsValueType) => void;\n}> = ({ option, widgetId, propName: key, value, handleChange }) => {\n  const { t } = useTranslation([`modules/${widgetId}`, 'common']);\n  const info = option.info ?? false;\n  const link = option.infoLink ?? undefined;\n\n  if (option.hide) return null;\n\n  switch (option.type) {\n    case 'switch':\n      return (\n        <Group align=\"center\" spacing=\"sm\">\n          <Switch\n            label={t(`descriptor.settings.${key}.label`)}\n            checked={value as boolean}\n            onChange={(ev) => handleChange(key, ev.currentTarget.checked)}\n            {...option.inputProps}\n          />\n          {info && <InfoCard message={t(`descriptor.settings.${key}.info`)} link={link} />}\n        </Group>\n      );\n    case 'text':\n      return (\n        <Stack spacing={0}>\n          <Group align=\"center\" spacing=\"sm\">\n            <Text size=\"0.875rem\" weight=\"500\">\n              {t(`descriptor.settings.${key}.label`)}\n            </Text>\n            {info && <InfoCard message={t(`descriptor.settings.${key}.info`)} link={link} />}\n          </Group>\n          <TextInput\n            value={value as string}\n            onChange={(ev) => handleChange(key, ev.currentTarget.value)}\n            {...option.inputProps}\n          />\n        </Stack>\n      );\n    case 'multi-select':\n      const multiSelectItems = typeof option.data === 'function' ? option.data() : option.data;\n      const multiSelectData = multiSelectItems.map((dataType) => {\n        return !dataType.label\n          ? {\n              value: dataType.value,\n              label: t(`descriptor.settings.${key}.data.${dataType.value}`),\n            }\n          : dataType;\n      });\n      return (\n        <Stack spacing={0}>\n          <Group align=\"center\" spacing=\"sm\">\n            <Text size=\"0.875rem\" weight=\"500\">\n              {t(`descriptor.settings.${key}.label`)}\n            </Text>\n            {info && <InfoCard message={t(`descriptor.settings.${key}.info`)} link={link} />}\n          </Group>\n          <MultiSelect\n            searchable\n            defaultValue={option.defaultValue}\n            data={multiSelectData}\n            value={value as string[]}\n            onChange={(v) => handleChange(key, v)}\n            withinPortal\n            {...option.inputProps}\n          />\n        </Stack>\n      );\n    case 'select':\n      const selectItems = typeof option.data === 'function' ? option.data() : option.data;\n      const selectData = selectItems.map((dataType) => {\n        return !dataType.label\n          ? {\n              value: dataType.value,\n              label: t(`descriptor.settings.${key}.data.${dataType.value}`),\n            }\n          : dataType;\n      });\n      return (\n        <Stack spacing={0}>\n          <Group align=\"center\" spacing=\"sm\">\n            <Text size=\"0.875rem\" weight=\"500\">\n              {t(`descriptor.settings.${key}.label`)}\n            </Text>\n            {info && <InfoCard message={t(`descriptor.settings.${key}.info`)} link={link} />}\n          </Group>\n          <Select\n            searchable\n            defaultValue={option.defaultValue}\n            data={selectData}\n            value={value as string}\n            onChange={(v) => handleChange(key, v ?? option.defaultValue)}\n            withinPortal\n            {...option.inputProps}\n          />\n        </Stack>\n      );\n    case 'number':\n      return (\n        <Stack spacing={0}>\n          <Group align=\"center\" spacing=\"sm\">\n            <Text size=\"0.875rem\" weight=\"500\">\n              {t(`descriptor.settings.${key}.label`)}\n            </Text>\n            {info && <InfoCard message={t(`descriptor.settings.${key}.info`)} link={link} />}\n          </Group>\n          <NumberInput\n            value={value as number}\n            onChange={(v) => handleChange(key, v!)}\n            {...option.inputProps}\n          />\n        </Stack>\n      );\n    case 'slider':\n      return (\n        <Stack spacing={0}>\n          <Group align=\"center\" spacing=\"sm\">\n            <Text size=\"0.875rem\" weight=\"500\">\n              {t(`descriptor.settings.${key}.label`)}\n            </Text>\n            {info && <InfoCard message={t(`descriptor.settings.${key}.info`)} link={link} />}\n          </Group>\n          <Slider\n            label={value}\n            value={value as number}\n            min={option.min}\n            max={option.max}\n            step={option.step}\n            onChange={(v) => handleChange(key, v)}\n            {...option.inputProps}\n          />\n        </Stack>\n      );\n    case 'location':\n      return (\n        <LocationSelection\n          propName={key}\n          value={value}\n          handleChange={handleChange}\n          widgetId={widgetId}\n          info={info}\n          infoLink={link}\n        />\n      );\n\n    case 'draggable-list':\n      /* eslint-disable no-case-declarations */\n      const typedVal = value as IDraggableListInputValue['defaultValue'];\n\n      const extractSubValue = (liName: string, settingName: string) =>\n        typedVal.find((v) => v.key === liName)?.subValues?.[settingName];\n\n      const handleSubChange = (liName: string, settingName: string) => (_: any, newVal: any) =>\n        handleChange(\n          key,\n          typedVal.map((oldVal) =>\n            oldVal.key === liName\n              ? {\n                  ...oldVal,\n                  subValues: {\n                    ...oldVal.subValues,\n                    [settingName]: newVal,\n                  },\n                }\n              : oldVal\n          )\n        );\n\n      return (\n        <Stack spacing=\"xs\">\n          <Group align=\"center\" spacing=\"sm\">\n            <Text>{t(`descriptor.settings.${key}.label`)}</Text>\n            {info && <InfoCard message={t(`descriptor.settings.${key}.info`)} link={link} />}\n          </Group>\n          <StaticDraggableList\n            value={typedVal}\n            onChange={(v) => handleChange(key, v)}\n            labels={mapObject(option.items, (liName) =>\n              t(`descriptor.settings.${key}.${liName}.label`)\n            )}\n          >\n            {mapObject(option.items, (liName, liSettings) =>\n              Object.entries(liSettings).map(([settingName, setting], i) => (\n                <WidgetOptionTypeSwitch\n                  key={`${liName}.${settingName}.${i}`}\n                  option={setting as IWidgetOptionValue}\n                  widgetId={widgetId}\n                  propName={`${key}.${liName}.${settingName}`}\n                  value={extractSubValue(liName, settingName)}\n                  handleChange={handleSubChange(liName, settingName)}\n                />\n              ))\n            )}\n          </StaticDraggableList>\n        </Stack>\n      );\n    case 'multiple-text':\n      return (\n        <Stack spacing={0}>\n          <Group align=\"center\" spacing=\"sm\">\n            <Text size=\"0.875rem\" weight=\"500\">\n              {t(`descriptor.settings.${key}.label`)}\n            </Text>\n            {info && <InfoCard message={t(`descriptor.settings.${key}.info`)} link={link} />}\n          </Group>\n          <MultiSelect\n            data={value.map((name: any) => ({ value: name, label: name }))}\n            description={t(`descriptor.settings.${key}.description`)}\n            defaultValue={value as string[]}\n            withinPortal\n            searchable\n            creatable\n            getCreateLabel={(query) => t('common:createItem', { item: query })}\n            onChange={(values) =>\n              handleChange(\n                key,\n                values.map((item: string) => item)\n              )\n            }\n          />\n        </Stack>\n      );\n    case 'draggable-editable-list':\n      const { t: translateDraggableList } = useTranslation('widgets/draggable-list');\n      return (\n        <Stack spacing=\"xs\">\n          <Group align=\"center\" spacing=\"sm\">\n            <Text>{t(`descriptor.settings.${key}.label`)}</Text>\n            {info && <InfoCard message={t(`descriptor.settings.${key}.info`)} link={link} />}\n          </Group>\n          <DraggableList\n            items={Array.from(value).map((v: any) => ({\n              data: v,\n            }))}\n            value={value}\n            onChange={(v) => handleChange(key, v)}\n            options={option}\n          />\n\n          {Array.from(value).length === 0 && (\n            <Card>\n              <Stack align=\"center\">\n                <IconPlaylistX size=\"2rem\" />\n                <Stack align=\"center\" spacing={0}>\n                  <Title order={5}>{translateDraggableList('noEntries.title')}</Title>\n                  <Text>{translateDraggableList('noEntries.text')}</Text>\n                </Stack>\n              </Stack>\n            </Card>\n          )}\n\n          <Flex gap=\"md\">\n            <Button\n              onClick={() => {\n                handleChange('items', [...value, option.create()]);\n              }}\n              leftIcon={<IconPlus size={16} />}\n              variant=\"default\"\n              fullWidth\n            >\n              {translateDraggableList('buttonAdd')}\n            </Button>\n          </Flex>\n        </Stack>\n      );\n\n    /* eslint-enable no-case-declarations */\n    default:\n      return null;\n  }\n};\n"
  },
  {
    "path": "src/components/Dashboard/Tiles/Widgets/WidgetsMenu.tsx",
    "content": "import { useTranslation } from 'next-i18next';\nimport { openContextModalGeneric } from '~/tools/mantineModalManagerExtensions';\nimport { IWidget } from '~/widgets/widgets';\n\nimport WidgetsDefinitions from '../../../../widgets';\nimport { useWrapperColumnCount } from '../../Wrappers/gridstack/store';\nimport { GenericTileMenu } from '../GenericTileMenu';\nimport { WidgetEditModalInnerProps } from './WidgetsEditModal';\nimport { WidgetsRemoveModalInnerProps } from './WidgetsRemoveModal';\n\nexport type WidgetChangePositionModalInnerProps = {\n  widgetId: string;\n  widgetType: string;\n  widget: IWidget<string, any>;\n  wrapperColumnCount: number;\n};\n\ninterface WidgetsMenuProps {\n  integration: string;\n  widget: IWidget<string, any> | undefined;\n}\n\nexport const WidgetsMenu = ({ integration, widget }: WidgetsMenuProps) => {\n  const { t } = useTranslation(`modules/${integration}`);\n  const wrapperColumnCount = useWrapperColumnCount();\n\n  if (!widget || !wrapperColumnCount) return null;\n  // Match widget.id with WidgetsDefinitions\n  // First get the keys\n  const keys = Object.keys(WidgetsDefinitions);\n  // Then find the key that matches the widget.type\n  const widgetDefinition = keys.find((key) => key === widget.type);\n  // Then get the widget definition\n  const widgetDefinitionObject =\n    WidgetsDefinitions[widgetDefinition as keyof typeof WidgetsDefinitions];\n\n  const handleDeleteClick = () => {\n    openContextModalGeneric<WidgetsRemoveModalInnerProps>({\n      modal: 'integrationRemove',\n      title: t('common:remove'),\n      innerProps: {\n        widgetId: widget.id,\n        widgetType: integration,\n      },\n    });\n  };\n\n  const handleChangeSizeClick = () => {\n    openContextModalGeneric<WidgetChangePositionModalInnerProps>({\n      modal: 'changeIntegrationPositionModal',\n      size: 'xl',\n      title: null,\n      innerProps: {\n        widgetId: widget.id,\n        widgetType: integration,\n        widget,\n        wrapperColumnCount,\n      },\n    });\n  };\n\n  const handleEditClick = () => {\n    openContextModalGeneric<WidgetEditModalInnerProps>({\n      modal: 'integrationOptions',\n      title: t('descriptor.settings.title'),\n      innerProps: {\n        widgetId: widget.id,\n        widgetType: integration,\n        options: widget.properties,\n        // Cast as the right type for the correct widget\n        widgetOptions: widgetDefinitionObject.options as any,\n      },\n      zIndex: 250,\n    });\n  };\n\n  return (\n    <GenericTileMenu\n      handleClickEdit={handleEditClick}\n      handleClickChangePosition={handleChangeSizeClick}\n      handleClickDelete={handleDeleteClick}\n      displayEdit={\n        typeof widget.properties !== 'undefined' &&\n        Object.keys(widgetDefinitionObject?.options ?? {}).length !== 0\n      }\n    />\n  );\n};\n"
  },
  {
    "path": "src/components/Dashboard/Tiles/Widgets/WidgetsRemoveModal.tsx",
    "content": "import { Button, Group, Stack, Text } from '@mantine/core';\nimport { ContextModalProps } from '@mantine/modals';\nimport { Trans, useTranslation } from 'next-i18next';\nimport { useConfigContext } from '~/config/provider';\nimport { useConfigStore } from '~/config/store';\n\nexport type WidgetsRemoveModalInnerProps = {\n  widgetId: string;\n  widgetType: string;\n};\n\nexport const WidgetsRemoveModal = ({\n  context,\n  id,\n  innerProps,\n}: ContextModalProps<WidgetsRemoveModalInnerProps>) => {\n  const { t } = useTranslation([`modules/${innerProps.widgetType}`, 'common']);\n  const { name: configName } = useConfigContext();\n  if (!configName) return null;\n  const updateConfig = useConfigStore((x) => x.updateConfig);\n  const handleDeletion = () => {\n    updateConfig(\n      configName,\n      (prev) => ({\n        ...prev,\n        widgets: prev.widgets.filter((w) => w.id !== innerProps.widgetId),\n      }),\n      true\n    );\n    context.closeModal(id);\n  };\n\n  return (\n    <Stack>\n      <Trans\n        i18nKey=\"common:removeConfirm\"\n        components={[<Text weight={500} />]}\n        values={{ item: innerProps.widgetType }}\n      />\n      <Group position=\"right\">\n        <Button onClick={() => context.closeModal(id)} variant=\"light\">\n          {t('common:cancel')}\n        </Button>\n        <Button onClick={() => handleDeletion()}>{t('common:ok')}</Button>\n      </Group>\n    </Stack>\n  );\n};\n"
  },
  {
    "path": "src/components/Dashboard/Tiles/type.ts",
    "content": "export interface BaseTileProps {\n  className?: string;\n}\n"
  },
  {
    "path": "src/components/Dashboard/Views/DashboardView.tsx",
    "content": "import { Group, Stack } from '@mantine/core';\nimport { useEffect, useMemo, useRef } from 'react';\nimport { useConfigContext } from '~/config/provider';\nimport { useResize } from '~/hooks/use-resize';\nimport { useScreenLargerThan } from '~/hooks/useScreenLargerThan';\nimport { CategoryType } from '~/types/category';\nimport { WrapperType } from '~/types/wrapper';\n\nimport { DashboardCategory } from '../Wrappers/Category/Category';\nimport { DashboardSidebar } from '../Wrappers/Sidebar/Sidebar';\nimport { DashboardWrapper } from '../Wrappers/Wrapper/Wrapper';\nimport { useGridstackStore } from '../Wrappers/gridstack/store';\n\nexport const DashboardView = () => {\n  const wrappers = useWrapperItems();\n  const sidebarsVisible = useSidebarVisibility();\n  const { isReady, mainAreaRef } = usePrepareGridstack();\n\n  return (\n    <Group align=\"top\" h=\"100%\" spacing=\"xs\">\n      {sidebarsVisible.left ? (\n        <DashboardSidebar location=\"left\" isGridstackReady={isReady} />\n      ) : null}\n\n      <Stack ref={mainAreaRef} mx={-10} style={{ flexGrow: 1 }}>\n        {isReady &&\n          wrappers.map((item) =>\n            item.type === 'category' ? (\n              <DashboardCategory key={item.id} category={item as unknown as CategoryType} />\n            ) : (\n              <DashboardWrapper key={item.id} wrapper={item as WrapperType} />\n            )\n          )}\n      </Stack>\n\n      {sidebarsVisible.right ? (\n        <DashboardSidebar location=\"right\" isGridstackReady={isReady} />\n      ) : null}\n    </Group>\n  );\n};\n\nconst usePrepareGridstack = () => {\n  const mainAreaRef = useRef<HTMLDivElement>(null);\n  const { width } = useResize(mainAreaRef, []);\n  const setMainAreaWidth = useGridstackStore((x) => x.setMainAreaWidth);\n  const mainAreaWidth = useGridstackStore((x) => x.mainAreaWidth);\n\n  useEffect(() => {\n    if (width === 0) return;\n    setMainAreaWidth(width);\n  }, [width]);\n\n  return {\n    isReady: Boolean(mainAreaWidth),\n    mainAreaRef,\n  };\n};\n\nconst useSidebarVisibility = () => {\n  const layoutSettings = useConfigContext()?.config?.settings.customization.layout;\n  const screenLargerThanMd = useScreenLargerThan('md'); // For smaller screens mobile ribbons are displayed with drawers\n\n  const isScreenSizeUnknown = typeof screenLargerThanMd === 'undefined';\n\n  return {\n    right: layoutSettings?.enabledRightSidebar && screenLargerThanMd,\n    left: layoutSettings?.enabledLeftSidebar && screenLargerThanMd,\n    isLoading: isScreenSizeUnknown,\n  };\n};\n\nconst useWrapperItems = () => {\n  const { config } = useConfigContext();\n\n  return useMemo(\n    () =>\n      config\n        ? [\n            ...config.categories.map((c) => ({ ...c, type: 'category' })),\n            ...config.wrappers.map((w) => ({ ...w, type: 'wrapper' })),\n          ].sort((a, b) => a.position - b.position)\n        : [],\n    [config?.categories, config?.wrappers]\n  );\n};\n"
  },
  {
    "path": "src/components/Dashboard/Views/DetailView.tsx",
    "content": "import { DashboardView } from './DashboardView';\n\nexport const DashboardDetailView = () => <DashboardView />;\n"
  },
  {
    "path": "src/components/Dashboard/Views/EditView.tsx",
    "content": "import { DashboardView } from './DashboardView';\n\nexport const DashboardEditView = () => <DashboardView />;\n"
  },
  {
    "path": "src/components/Dashboard/Views/ViewToggleButton.tsx",
    "content": "import { ActionIcon, Button, Text, Tooltip } from '@mantine/core';\nimport { IconEdit, IconEditOff } from '@tabler/icons-react';\nimport { useTranslation } from 'next-i18next';\nimport { useScreenLargerThan } from '~/hooks/useScreenLargerThan';\n\nimport { useEditModeStore } from './useEditModeStore';\n\nexport const ViewToggleButton = () => {\n  const screenLargerThanMd = useScreenLargerThan('md');\n  const { enabled: isEditMode, toggleEditMode } = useEditModeStore();\n  const { t } = useTranslation('layout/header/actions/toggle-edit-mode');\n\n  return (\n    <Tooltip width={100} label={<Text align=\"center\">{t('description')}</Text>}>\n      {screenLargerThanMd ? (\n        <Button\n          variant={isEditMode ? 'filled' : 'default'}\n          h={44}\n          w={180}\n          leftIcon={isEditMode ? <IconEditOff /> : <IconEdit />}\n          onClick={() => toggleEditMode()}\n          color={isEditMode ? 'red' : undefined}\n          radius=\"md\"\n        >\n          <Text>{isEditMode ? t('button.enabled') : t('button.disabled')}</Text>\n        </Button>\n      ) : (\n        <ActionIcon\n          onClick={() => toggleEditMode()}\n          variant=\"default\"\n          radius=\"md\"\n          size=\"xl\"\n          color=\"blue\"\n        >\n          {isEditMode ? <IconEditOff /> : <IconEdit />}\n        </ActionIcon>\n      )}\n    </Tooltip>\n  );\n};\n"
  },
  {
    "path": "src/components/Dashboard/Views/useEditModeStore.ts",
    "content": "import { createWithEqualityFn } from 'zustand/traditional';\n\ninterface EditModeState {\n  enabled: boolean;\n  toggleEditMode: () => void;\n}\n\nexport const useEditModeStore = createWithEqualityFn<EditModeState>(\n  (set) => ({\n    enabled: false,\n    toggleEditMode: () => set((state) => ({ enabled: !state.enabled })),\n  }),\n  Object.is\n);\n"
  },
  {
    "path": "src/components/Dashboard/Wrappers/Category/Category.tsx",
    "content": "import {\n  Accordion,\n  ActionIcon,\n  Box,\n  List,\n  Menu,\n  Stack,\n  Text,\n  Title,\n  createStyles,\n} from '@mantine/core';\nimport { useLocalStorage } from '@mantine/hooks';\nimport { modals } from '@mantine/modals';\nimport { IconDotsVertical, IconShare3 } from '@tabler/icons-react';\nimport { useTranslation } from 'next-i18next';\nimport { useConfigContext } from '~/config/provider';\nimport { useGetExternalUrl } from '~/hooks/useExternalUrl';\nimport { CategoryType } from '~/types/category';\n\nimport { useCardStyles } from '../../../layout/Common/useCardStyles';\nimport { useEditModeStore } from '../../Views/useEditModeStore';\nimport { WrapperContent } from '../WrapperContent';\nimport { useGridstack } from '../gridstack/use-gridstack';\nimport { CategoryEditMenu } from './CategoryEditMenu';\n\ninterface DashboardCategoryProps {\n  category: CategoryType;\n}\n\nexport const DashboardCategory = ({ category }: DashboardCategoryProps) => {\n  const { refs, apps, widgets } = useGridstack('category', category.id);\n  const isEditMode = useEditModeStore((x) => x.enabled);\n  const { config } = useConfigContext();\n  const { classes: cardClasses, cx } = useCardStyles(true);\n  const { classes } = useStyles();\n  const { t } = useTranslation(['layout/common', 'common']);\n  const getAppUrl = useGetExternalUrl();\n\n  const categoryList = config?.categories.map((x) => x.name) ?? [];\n  const [toggledCategories, setToggledCategories] = useLocalStorage({\n    key: `${config?.configProperties.name}-app-shelf-toggled`,\n    // This is a bit of a hack to toggle the categories on the first load, return a string[] of the categories\n    defaultValue: categoryList,\n  });\n\n  const handleMenuClick = () => {\n    for (let i = 0; i < apps.length; i += 1) {\n      const app = apps[i];\n      const appUrl = getAppUrl(app);\n      const popUp = window.open(appUrl, app.id);\n\n      if (popUp === null) {\n        modals.openConfirmModal({\n          title: <Text weight=\"bold\">{t('modals.blockedPopups.title')}</Text>,\n          children: (\n            <Stack maw=\"100%\">\n              <Text>{t('modals.blockedPopups.text')}</Text>\n              <List>\n                <List.Item className={classes.listItem}>\n                  {t('modals.blockedPopups.list.browserPermission')}\n                </List.Item>\n                <List.Item className={classes.listItem}>\n                  {t('modals.blockedPopups.list.adBlockers')}\n                </List.Item>\n                <List.Item className={classes.listItem}>\n                  {t('modals.blockedPopups.list.otherBrowser')}\n                </List.Item>\n              </List>\n            </Stack>\n          ),\n          labels: {\n            confirm: t('common:close'),\n            cancel: '',\n          },\n          cancelProps: {\n            display: 'none',\n          },\n          closeOnClickOutside: false,\n        });\n        break;\n      }\n    }\n  };\n\n  return (\n    <Accordion\n      classNames={{\n        item: cx(cardClasses.card, 'dashboard-gs-category'),\n      }}\n      mx={10}\n      chevronPosition=\"left\"\n      multiple\n      value={isEditMode ? categoryList : toggledCategories}\n      variant=\"separated\"\n      radius=\"lg\"\n      onChange={(state) => {\n        // Cancel if edit mode is on\n        if (isEditMode) return;\n        setToggledCategories([...state]);\n      }}\n    >\n      <Accordion.Item value={category.name}>\n        <Box sx={{ display: 'flex', alignItems: 'center' }}>\n          <Accordion.Control>\n            <Title order={3}>{category.name}</Title>\n          </Accordion.Control>\n          {!isEditMode ? (\n            <Menu withArrow withinPortal>\n              <Menu.Target>\n                <ActionIcon variant=\"light\" mr=\"md\">\n                  <IconDotsVertical />\n                </ActionIcon>\n              </Menu.Target>\n              <Menu.Dropdown>\n                <Menu.Item onClick={handleMenuClick} icon={<IconShare3 size=\"1rem\" />}>\n                  {t('actions.category.openAllInNewTab')}\n                </Menu.Item>\n              </Menu.Dropdown>\n            </Menu>\n          ) : (\n            <CategoryEditMenu category={category} />\n          )}\n        </Box>\n        <Accordion.Panel>\n          <div\n            className=\"grid-stack grid-stack-category\"\n            data-category={category.id}\n            ref={refs.wrapper}\n          >\n            <WrapperContent apps={apps} refs={refs} widgets={widgets} />\n          </div>\n        </Accordion.Panel>\n      </Accordion.Item>\n    </Accordion>\n  );\n};\n\nconst useStyles = createStyles(() => ({\n  listItem: {\n    '& div': {\n      maxWidth: 'calc(100% - 23px)',\n    },\n  },\n}));\n"
  },
  {
    "path": "src/components/Dashboard/Wrappers/Category/CategoryEditMenu.tsx",
    "content": "import { ActionIcon, Menu } from '@mantine/core';\nimport {\n  IconEdit,\n  IconRowInsertBottom,\n  IconRowInsertTop,\n  IconSettings,\n  IconTransitionBottom,\n  IconTransitionTop,\n  IconTrash,\n} from '@tabler/icons-react';\nimport { useTranslation } from 'next-i18next';\nimport { useConfigContext } from '~/config/provider';\nimport { CategoryType } from '~/types/category';\n\nimport { useCategoryActions } from './useCategoryActions';\n\ninterface CategoryEditMenuProps {\n  category: CategoryType;\n}\n\nexport const CategoryEditMenu = ({ category }: CategoryEditMenuProps) => {\n  const { name: configName } = useConfigContext();\n  const { addCategoryAbove, addCategoryBelow, moveCategoryUp, moveCategoryDown, edit, remove } =\n    useCategoryActions(configName, category);\n  const { t } = useTranslation(['layout/common', 'common']);\n\n  return (\n    <Menu withinPortal withArrow>\n      <Menu.Target>\n        <ActionIcon>\n          <IconSettings />\n        </ActionIcon>\n      </Menu.Target>\n      <Menu.Dropdown>\n        <Menu.Item icon={<IconEdit size={20} />} onClick={edit}>\n          {t('common:edit')}\n        </Menu.Item>\n        <Menu.Item icon={<IconTrash size={20} />} onClick={remove}>\n          {t('common:remove')}\n        </Menu.Item>\n        <Menu.Label>{t('common:changePosition')}</Menu.Label>\n        <Menu.Item icon={<IconTransitionTop size={20} />} onClick={moveCategoryUp}>\n          {t('menu.moveUp')}\n        </Menu.Item>\n        <Menu.Item icon={<IconTransitionBottom size={20} />} onClick={moveCategoryDown}>\n          {t('menu.moveDown')}\n        </Menu.Item>\n        <Menu.Label>{t('menu.addCategory', { location: '' })}</Menu.Label>\n        <Menu.Item icon={<IconRowInsertTop size={20} />} onClick={addCategoryAbove}>\n          {t('menu.addCategory', { location: t('menu.addAbove') })}\n        </Menu.Item>\n        <Menu.Item icon={<IconRowInsertBottom size={20} />} onClick={addCategoryBelow}>\n          {t('menu.addCategory', { location: t('menu.addBelow') })}\n        </Menu.Item>\n      </Menu.Dropdown>\n    </Menu>\n  );\n};\n"
  },
  {
    "path": "src/components/Dashboard/Wrappers/Category/CategoryEditModal.tsx",
    "content": "import { Button, Group, TextInput } from '@mantine/core';\nimport { useForm } from '@mantine/form';\nimport { ContextModalProps } from '@mantine/modals';\nimport { useTranslation } from 'next-i18next';\nimport { useConfigContext } from '~/config/provider';\nimport { useConfigStore } from '~/config/store';\nimport { CategoryType } from '~/types/category';\n\nexport type CategoryEditModalInnerProps = {\n  category: CategoryType;\n  onSuccess: (category: CategoryType) => Promise<void>;\n};\n\nexport const CategoryEditModal = ({\n  context,\n  innerProps,\n  id,\n}: ContextModalProps<CategoryEditModalInnerProps>) => {\n  const { name: configName } = useConfigContext();\n  const updateConfig = useConfigStore((x) => x.updateConfig);\n  const form = useForm<FormType>({\n    initialValues: {\n      name: innerProps.category.name,\n    },\n    validate: {\n      name: (val: string) => (!val || val.trim().length === 0 ? 'Name is required' : null),\n    },\n  });\n\n  const handleSubmit = async (values: FormType) => {\n    await innerProps.onSuccess({ ...innerProps.category, name: values.name });\n    context.closeModal(id);\n  };\n\n  const { t } = useTranslation('common');\n\n  return (\n    <form onSubmit={form.onSubmit(handleSubmit)}>\n      <TextInput data-autoFocus {...form.getInputProps('name')} autoFocus />\n\n      <Group mt=\"md\" grow>\n        <Button onClick={() => context.closeModal(id)} variant=\"filled\" color=\"gray\">\n          {t('cancel')}\n        </Button>\n        <Button type=\"submit\">{t('save')}</Button>\n      </Group>\n    </form>\n  );\n};\n\ntype FormType = {\n  name: string;\n};\n"
  },
  {
    "path": "src/components/Dashboard/Wrappers/Category/useCategoryActions.tsx",
    "content": "import { v4 as uuidv4 } from 'uuid';\nimport { useConfigStore } from '~/config/store';\nimport { openContextModalGeneric } from '~/tools/mantineModalManagerExtensions';\nimport { AppType } from '~/types/app';\nimport { CategoryType } from '~/types/category';\nimport { WrapperType } from '~/types/wrapper';\nimport { IWidget } from '~/widgets/widgets';\n\nimport { CategoryEditModalInnerProps } from './CategoryEditModal';\n\nexport const useCategoryActions = (configName: string | undefined, category: CategoryType) => {\n  const updateConfig = useConfigStore((x) => x.updateConfig);\n\n  // creates a new category above the current\n  const addCategoryAbove = () => {\n    const abovePosition = category.position - 1;\n\n    openContextModalGeneric<CategoryEditModalInnerProps>({\n      modal: 'categoryEditModal',\n      innerProps: {\n        category: {\n          id: uuidv4(),\n          name: 'New category',\n          position: abovePosition + 1,\n        },\n        onSuccess: async (category) => {\n          if (!configName) return;\n\n          const newWrapper: WrapperType = {\n            id: uuidv4(),\n            position: abovePosition + 2,\n          };\n\n          // Adding category and wrapper and moving other items down\n          await updateConfig(\n            configName,\n            (previous) => {\n              const aboveWrappers = previous.wrappers.filter((x) => x.position <= abovePosition);\n              const aboveCategories = previous.categories.filter(\n                (x) => x.position <= abovePosition\n              );\n\n              const belowWrappers = previous.wrappers.filter((x) => x.position > abovePosition);\n              const belowCategories = previous.categories.filter((x) => x.position > abovePosition);\n\n              return {\n                ...previous,\n                categories: [\n                  ...aboveCategories,\n                  category,\n                  // Move categories below down\n                  ...belowCategories.map((x) => ({ ...x, position: x.position + 1 })),\n                ],\n                wrappers: [\n                  ...aboveWrappers,\n                  newWrapper,\n                  // Move wrappers below down\n                  ...belowWrappers.map((x) => ({ ...x, position: x.position + 1 })),\n                ],\n              };\n            },\n            true\n          );\n        },\n      },\n    });\n  };\n\n  // creates a new category below the current\n  const addCategoryBelow = () => {\n    const belowPosition = category.position + 1;\n\n    openContextModalGeneric<CategoryEditModalInnerProps>({\n      modal: 'categoryEditModal',\n      innerProps: {\n        category: {\n          id: uuidv4(),\n          name: 'New category',\n          position: belowPosition + 1,\n        },\n        onSuccess: async (category) => {\n          if (!configName) return;\n\n          const newWrapper: WrapperType = {\n            id: uuidv4(),\n            position: belowPosition,\n          };\n\n          // Adding category and wrapper and moving other items down\n          await updateConfig(\n            configName,\n            (previous) => {\n              const aboveWrappers = previous.wrappers.filter((x) => x.position < belowPosition);\n              const aboveCategories = previous.categories.filter((x) => x.position < belowPosition);\n\n              const belowWrappers = previous.wrappers.filter((x) => x.position >= belowPosition);\n              const belowCategories = previous.categories.filter(\n                (x) => x.position >= belowPosition\n              );\n\n              return {\n                ...previous,\n                categories: [\n                  ...aboveCategories,\n                  category,\n                  // Move categories below down\n                  ...belowCategories.map((x) => ({ ...x, position: x.position + 2 })),\n                ],\n                wrappers: [\n                  ...aboveWrappers,\n                  newWrapper,\n                  // Move wrappers below down\n                  ...belowWrappers.map((x) => ({ ...x, position: x.position + 2 })),\n                ],\n              };\n            },\n            true\n          );\n        },\n      },\n    });\n  };\n\n  const moveCategoryUp = () => {\n    if (!configName) return;\n\n    updateConfig(\n      configName,\n      (previous) => {\n        const currentItem = previous.categories.find((x) => x.id === category.id);\n        if (!currentItem) return previous;\n\n        const upperItem = previous.categories.find((x) => x.position === currentItem.position - 1);\n\n        if (!upperItem) return previous;\n\n        currentItem.position -= 1;\n        upperItem.position += 1;\n\n        return {\n          ...previous,\n          categories: [\n            ...previous.categories.filter((c) => ![currentItem.id, upperItem.id].includes(c.id)),\n            { ...upperItem },\n            { ...currentItem },\n          ],\n        };\n      },\n      true\n    );\n  };\n\n  const moveCategoryDown = () => {\n    if (!configName) return;\n\n    updateConfig(\n      configName,\n      (previous) => {\n        const currentItem = previous.categories.find((x) => x.id === category.id);\n        if (!currentItem) return previous;\n\n        const belowItem = previous.categories.find((x) => x.position === currentItem.position + 1);\n\n        if (!belowItem) return previous;\n\n        currentItem.position += 1;\n        belowItem.position -= 1;\n\n        return {\n          ...previous,\n          categories: [\n            ...previous.categories.filter((c) => ![currentItem.id, belowItem.id].includes(c.id)),\n            { ...currentItem },\n            { ...belowItem },\n          ],\n        };\n      },\n      true\n    );\n  };\n\n  // Removes the current category\n  const remove = () => {\n    if (!configName) return;\n    updateConfig(\n      configName,\n      (previous) => {\n        const currentItem = previous.categories.find(\n          (previousCategory) => previousCategory.id === category.id\n        );\n        if (!currentItem) return previous;\n\n        const currentWrapper = previous.wrappers.find(\n          (previousWrapper) => previousWrapper.position === currentItem?.position\n        );\n        if (!currentWrapper) return previous;\n\n        // Find the main wrapper\n        const mainWrapper = previous.wrappers.find(\n          (previousWrapper) => previousWrapper.position === 0\n        );\n        const mainWrapperId = mainWrapper?.id ?? 'default';\n\n        const isAppAffectedFilter = (app: AppType): boolean => {\n          if (!app.area) {\n            return false;\n          }\n\n          if (app.area.type === 'sidebar') {\n            return false;\n          }\n\n          if (app.area.properties.id === mainWrapperId) {\n            return false;\n          }\n\n          return (\n            app.area.properties.id === currentItem.id ||\n            app.area.properties.id === currentWrapper.id\n          );\n        };\n\n        const isWidgetAffectedFilter = (widget: IWidget<string, any>): boolean => {\n          if (!widget.area) {\n            return false;\n          }\n\n          if (widget.area.type === 'sidebar') {\n            return false;\n          }\n\n          if (widget.area.properties.id === mainWrapperId) {\n            return false;\n          }\n\n          return (\n            widget.area.properties.id === currentItem.id ||\n            widget.area.properties.id === currentWrapper.id\n          );\n        };\n\n        return {\n          ...previous,\n          apps: [\n            ...previous.apps.filter((x) => !isAppAffectedFilter(x)),\n            ...previous.apps\n              .filter((x) => isAppAffectedFilter(x))\n              .map(\n                (app): AppType => ({\n                  ...app,\n                  area: {\n                    ...app.area,\n                    type: 'wrapper',\n                    properties: {\n                      ...app.area.properties,\n                      id: mainWrapperId,\n                    },\n                  },\n                })\n              ),\n          ],\n          widgets: [\n            ...previous.widgets.filter((widget) => !isWidgetAffectedFilter(widget)),\n            ...previous.widgets\n              .filter((widget) => isWidgetAffectedFilter(widget))\n              .map(\n                (widget): IWidget<string, any> => ({\n                  ...widget,\n                  area: {\n                    ...widget.area,\n                    type: 'wrapper',\n                    properties: {\n                      ...widget.area.properties,\n                      id: mainWrapperId,\n                    },\n                  },\n                })\n              ),\n          ],\n          categories: previous.categories.filter(\n            (previousCategory) => previousCategory.id !== category.id\n          ),\n          wrappers: previous.wrappers.filter(\n            (previousWrapper) => previousWrapper.position !== currentItem.position\n          ),\n        };\n      },\n      true\n    );\n  };\n\n  const edit = async () => {\n    openContextModalGeneric<CategoryEditModalInnerProps>({\n      modal: 'categoryEditModal',\n      withCloseButton: false,\n      innerProps: {\n        category,\n        onSuccess: async (category) => {\n          if (!configName) return;\n          await updateConfig(configName, (prev) => {\n            const currentCategory = prev.categories.find((c) => c.id === category.id);\n            if (!currentCategory) return prev;\n            return {\n              ...prev,\n              categories: [...prev.categories.filter((c) => c.id !== category.id), { ...category }],\n            };\n          });\n        },\n      },\n    });\n  };\n\n  return {\n    addCategoryAbove,\n    addCategoryBelow,\n    moveCategoryUp,\n    moveCategoryDown,\n    remove,\n    edit,\n  };\n};\n"
  },
  {
    "path": "src/components/Dashboard/Wrappers/Sidebar/Sidebar.tsx",
    "content": "import { Card } from '@mantine/core';\nimport { RefObject } from 'react';\n\nimport { useCardStyles } from '../../../layout/Common/useCardStyles';\nimport { WrapperContent } from '../WrapperContent';\nimport { useGridstack } from '../gridstack/use-gridstack';\n\ninterface DashboardSidebarProps extends DashboardSidebarInnerProps {\n  location: 'right' | 'left';\n  isGridstackReady: boolean;\n}\n\nexport const DashboardSidebar = ({ location, isGridstackReady }: DashboardSidebarProps) => {\n  const {\n    cx,\n    classes: { card: cardClass },\n  } = useCardStyles(true);\n\n  return (\n    <Card p={0} m={0} radius=\"lg\" className={cardClass} withBorder>\n      {isGridstackReady && <SidebarInner location={location} />}\n    </Card>\n  );\n};\n\ninterface DashboardSidebarInnerProps {\n  location: 'right' | 'left';\n}\n\n// Is Required because of the gridstack main area width.\nconst SidebarInner = ({ location }: DashboardSidebarInnerProps) => {\n  const { refs, apps, widgets } = useGridstack('sidebar', location);\n\n  const minRow = useMinRowForFullHeight(refs.wrapper);\n\n  return (\n    <div\n      ref={refs.wrapper}\n      className=\"grid-stack grid-stack-sidebar\"\n      style={{\n        transitionDuration: '0s',\n        minWidth: 256,\n        height: '100%',\n        width: '100%',\n      }}\n      data-sidebar={location}\n      // eslint-disable-next-line react/no-unknown-property\n      gs-min-row={minRow}\n    >\n      <WrapperContent apps={apps} refs={refs} widgets={widgets} />\n    </div>\n  );\n};\n\nconst useMinRowForFullHeight = (wrapperRef: RefObject<HTMLDivElement>) =>\n  wrapperRef.current ? Math.floor(wrapperRef.current!.offsetHeight / 128) : 2;\n"
  },
  {
    "path": "src/components/Dashboard/Wrappers/Wrapper/Wrapper.tsx",
    "content": "import { WrapperType } from '~/types/wrapper';\n\nimport { useEditModeStore } from '../../Views/useEditModeStore';\nimport { WrapperContent } from '../WrapperContent';\nimport { useGridstack } from '../gridstack/use-gridstack';\n\ninterface DashboardWrapperProps {\n  wrapper: WrapperType;\n}\n\nexport const DashboardWrapper = ({ wrapper }: DashboardWrapperProps) => {\n  const { refs, apps, widgets } = useGridstack('wrapper', wrapper.id);\n  const isEditMode = useEditModeStore((x) => x.enabled);\n  const defaultClasses = 'grid-stack grid-stack-wrapper min-row';\n\n  return (\n    <div\n      className={\n        apps.length > 0 || widgets.length > 0 || isEditMode\n          ? defaultClasses\n          : `${defaultClasses} gridstack-empty-wrapper`\n      }\n      style={{ transitionDuration: '0s' }}\n      data-wrapper={wrapper.id}\n      ref={refs.wrapper}\n    >\n      <WrapperContent apps={apps} refs={refs} widgets={widgets} />\n    </div>\n  );\n};\n"
  },
  {
    "path": "src/components/Dashboard/Wrappers/WrapperContent.tsx",
    "content": "import { GridStack } from 'fily-publish-gridstack';\nimport { MutableRefObject, RefObject } from 'react';\nimport { AppType } from '~/types/app';\nimport { WidgetWrapper } from '~/widgets/WidgetWrapper';\nimport { IWidget, IWidgetDefinition } from '~/widgets/widgets';\n\nimport Widgets from '../../../widgets';\nimport { appTileDefinition } from '../Tiles/Apps/AppTile';\nimport { GridstackTileWrapper } from '../Tiles/TileWrapper';\nimport { useGridstackStore } from './gridstack/store';\n\ninterface WrapperContentProps {\n  apps: AppType[];\n  widgets: IWidget<string, any>[];\n  refs: {\n    wrapper: RefObject<HTMLDivElement>;\n    items: MutableRefObject<Record<string, RefObject<HTMLDivElement>>>;\n    gridstack: MutableRefObject<GridStack | undefined>;\n  };\n}\n\nexport function WrapperContent({ apps, refs, widgets }: WrapperContentProps) {\n  const shapeSize = useGridstackStore((x) => x.currentShapeSize);\n\n  if (!shapeSize) return null;\n\n  return (\n    <>\n      {apps?.map((app) => {\n        const { component: TileComponent, ...tile } = appTileDefinition;\n        return (\n          <GridstackTileWrapper\n            id={app.id}\n            type=\"app\"\n            key={app.id}\n            itemRef={refs.items.current[app.id]}\n            {...tile}\n            {...(app.shape[shapeSize]?.location ?? {})}\n            {...(app.shape[shapeSize]?.size ?? {})}\n          >\n            <TileComponent className=\"grid-stack-item-content\" app={app} />\n          </GridstackTileWrapper>\n        );\n      })}\n      {widgets.map((widget) => {\n        const definition = Widgets[widget.type as keyof typeof Widgets] as\n          | IWidgetDefinition\n          | undefined;\n        if (!definition) return null;\n\n        return (\n          <GridstackTileWrapper\n            type=\"widget\"\n            key={widget.id}\n            itemRef={refs.items.current[widget.id]}\n            id={widget.id}\n            {...definition.gridstack}\n            {...widget.shape[shapeSize]?.location}\n            {...widget.shape[shapeSize]?.size}\n          >\n            <WidgetWrapper\n              className=\"grid-stack-item-content\"\n              widget={widget}\n              widgetType={widget.type}\n              WidgetComponent={definition.component}\n            />\n          </GridstackTileWrapper>\n        );\n      })}\n    </>\n  );\n}\n"
  },
  {
    "path": "src/components/Dashboard/Wrappers/gridstack/init-gridstack.ts",
    "content": "import { GridItemHTMLElement, GridStack, GridStackNode } from 'fily-publish-gridstack';\nimport { MutableRefObject, RefObject } from 'react';\nimport { AppType } from '~/types/app';\nimport { ShapeType } from '~/types/shape';\nimport { IWidget } from '~/widgets/widgets';\n\nexport const initializeGridstack = (\n  areaType: 'wrapper' | 'category' | 'sidebar',\n  wrapperRef: RefObject<HTMLDivElement>,\n  gridRef: MutableRefObject<GridStack | undefined>,\n  itemRefs: MutableRefObject<Record<string, RefObject<HTMLDivElement>>>,\n  areaId: string,\n  items: AppType[],\n  widgets: IWidget<string, any>[],\n  isEditMode: boolean,\n  wrapperColumnCount: number,\n  shapeSize: 'sm' | 'md' | 'lg',\n  tilesWithUnknownLocation: TileWithUnknownLocation[],\n  events: {\n    onChange: (changedNode: GridStackNode) => void;\n    onAdd: (addedNode: GridStackNode) => void;\n  }\n) => {\n  if (!wrapperRef.current) return;\n  // calculates the currently available count of columns\n  const columnCount = areaType === 'sidebar' ? 2 : wrapperColumnCount;\n  const minRow = areaType !== 'sidebar' ? 1 : Math.floor(wrapperRef.current.offsetHeight / 128);\n  // initialize gridstack\n  const newGrid = gridRef;\n  newGrid.current = GridStack.init(\n    {\n      column: columnCount,\n      margin: areaType === 'sidebar' ? 5 : 10,\n      cellHeight: 128,\n      float: true,\n      alwaysShowResizeHandle: 'mobile',\n      acceptWidgets: true,\n      disableOneColumnMode: true,\n      staticGrid: !isEditMode,\n      minRow,\n      animate: false,\n    },\n    // selector of the gridstack item (it's eather category or wrapper)\n    `.grid-stack-${areaType}[data-${areaType}='${areaId}']`\n  );\n  const grid = newGrid.current;\n  // Must be used to update the column count after the initialization\n  grid.column(columnCount, 'none');\n\n  // Add listener for moving items around in a wrapper\n  grid.on('change', (_, el) => {\n    const nodes = el as GridStackNode[];\n    if (!nodes) return;\n    const firstNode = nodes.at(0);\n    if (!firstNode) return;\n    events.onChange(firstNode);\n  });\n\n  // Add listener for moving items in config from one wrapper to another\n  grid.on('added', (_, el) => {\n    const nodes = el as GridStackNode[];\n    if (!nodes) return;\n    const firstNode = nodes.at(0);\n    if (!firstNode) return;\n    events.onAdd(firstNode);\n  });\n\n  grid.batchUpdate();\n  grid.removeAll(false);\n  items.forEach(({ id, shape }) => {\n    const item = itemRefs.current[id]?.current;\n    setAttributesFromShape(item, shape[shapeSize]);\n    item && grid.makeWidget(item as HTMLDivElement);\n    if (!shape[shapeSize] && item) {\n      const gridItemElement = item as GridItemHTMLElement;\n      if (gridItemElement.gridstackNode) {\n        const { x, y, w, h } = gridItemElement.gridstackNode;\n        tilesWithUnknownLocation.push({ x, y, w, h, type: 'app', id });\n      }\n    }\n  });\n  widgets.forEach(({ id, shape }) => {\n    const item = itemRefs.current[id]?.current;\n    setAttributesFromShape(item, shape[shapeSize]);\n    item && grid.makeWidget(item as HTMLDivElement);\n    if (!shape[shapeSize] && item) {\n      const gridItemElement = item as GridItemHTMLElement;\n      if (gridItemElement.gridstackNode) {\n        const { x, y, w, h } = gridItemElement.gridstackNode;\n        tilesWithUnknownLocation.push({ x, y, w, h, type: 'widget', id });\n      }\n    }\n  });\n  grid.batchUpdate(false);\n};\n\nfunction setAttributesFromShape(ref: HTMLDivElement | null, sizedShape: ShapeType['lg']) {\n  if (!sizedShape || !ref) return;\n  ref.setAttribute('gs-x', sizedShape.location.x.toString());\n  ref.setAttribute('gs-y', sizedShape.location.y.toString());\n  ref.setAttribute('gs-w', sizedShape.size.width.toString());\n  ref.setAttribute('gs-h', sizedShape.size.height.toString());\n}\n\nexport type TileWithUnknownLocation = {\n  x?: number;\n  y?: number;\n  w?: number;\n  h?: number;\n  type: 'app' | 'widget';\n  id: string;\n};\n"
  },
  {
    "path": "src/components/Dashboard/Wrappers/gridstack/store.tsx",
    "content": "import { createWithEqualityFn } from 'zustand/traditional';\nimport { useConfigContext } from '~/config/provider';\nimport { GridstackBreakpoints } from '~/constants/gridstack-breakpoints';\n\nexport const useGridstackStore = createWithEqualityFn<GridstackStoreType>(\n  (set, get) => ({\n    mainAreaWidth: null,\n    currentShapeSize: null,\n    setMainAreaWidth: (w: number) =>\n      set((v) => ({ ...v, mainAreaWidth: w, currentShapeSize: getCurrentShapeSize(w) })),\n  }),\n  Object.is\n);\n\ninterface GridstackStoreType {\n  mainAreaWidth: null | number;\n  currentShapeSize: null | 'sm' | 'md' | 'lg';\n  setMainAreaWidth: (width: number) => void;\n}\n\nexport const useNamedWrapperColumnCount = (): 'small' | 'medium' | 'large' | null => {\n  const mainAreaWidth = useGridstackStore((x) => x.mainAreaWidth);\n  if (!mainAreaWidth) return null;\n\n  if (mainAreaWidth >= 1400) return 'large';\n\n  if (mainAreaWidth >= 800) return 'medium';\n\n  return 'small';\n};\n\nexport const useWrapperColumnCount = () => {\n  const { config } = useConfigContext();\n\n  if (!config) {\n    return null;\n  }\n\n  switch (useNamedWrapperColumnCount()) {\n    case 'large':\n      return config.settings.customization.gridstack?.columnCountLarge ?? 12;\n    case 'medium':\n      return config.settings.customization.gridstack?.columnCountMedium ?? 6;\n    case 'small':\n      return config.settings.customization.gridstack?.columnCountSmall ?? 3;\n    default:\n      return null;\n  }\n};\n\nfunction getCurrentShapeSize(size: number) {\n  return size >= GridstackBreakpoints.large\n    ? 'lg'\n    : size >= GridstackBreakpoints.medium\n    ? 'md'\n    : 'sm';\n}\n"
  },
  {
    "path": "src/components/Dashboard/Wrappers/gridstack/use-gridstack.ts",
    "content": "import { GridStack, GridStackNode } from 'fily-publish-gridstack';\nimport { MutableRefObject, RefObject, createRef, useEffect, useMemo, useRef } from 'react';\nimport { useConfigContext } from '~/config/provider';\nimport { useConfigStore } from '~/config/store';\nimport { AppType } from '~/types/app';\nimport { AreaType } from '~/types/area';\nimport { IWidget } from '~/widgets/widgets';\n\nimport { useEditModeStore } from '../../Views/useEditModeStore';\nimport { TileWithUnknownLocation, initializeGridstack } from './init-gridstack';\nimport { useGridstackStore, useWrapperColumnCount } from './store';\n\ninterface UseGristackReturnType {\n  apps: AppType[];\n  widgets: IWidget<string, any>[];\n  refs: {\n    wrapper: RefObject<HTMLDivElement>;\n    items: MutableRefObject<Record<string, RefObject<HTMLDivElement>>>;\n    gridstack: MutableRefObject<GridStack | undefined>;\n  };\n}\n\nexport const useGridstack = (\n  areaType: 'wrapper' | 'category' | 'sidebar',\n  areaId: string\n): UseGristackReturnType => {\n  const isEditMode = useEditModeStore((x) => x.enabled);\n  const { config, configVersion, name: configName } = useConfigContext();\n  const updateConfig = useConfigStore((x) => x.updateConfig);\n  // define reference for wrapper - is used to calculate the width of the wrapper\n  const wrapperRef = useRef<HTMLDivElement>(null);\n  // references to the diffrent items contained in the gridstack\n  const itemRefs = useRef<Record<string, RefObject<HTMLDivElement>>>({});\n  // reference of the gridstack object for modifications after initialization\n  const gridRef = useRef<GridStack>();\n  const wrapperColumnCount = useWrapperColumnCount();\n  const shapeSize = useGridstackStore((x) => x.currentShapeSize);\n  const mainAreaWidth = useGridstackStore((x) => x.mainAreaWidth);\n  // width of the wrapper (updating on page resize)\n  const root: HTMLHtmlElement = useMemo(() => document.querySelector(':root')!, []);\n\n  if (!mainAreaWidth || !shapeSize || !wrapperColumnCount) {\n    throw new Error('UseGridstack should not be executed before mainAreaWidth has been set!');\n  }\n\n  const items = useMemo(\n    () =>\n      config?.apps.filter(\n        (x) =>\n          x.area.type === areaType &&\n          (x.area.type === 'sidebar'\n            ? x.area.properties.location === areaId\n            : x.area.properties.id === areaId)\n      ) ?? [],\n    [configVersion, config?.apps.length]\n  );\n  const widgets = useMemo(() => {\n    if (!config) return [];\n    return config.widgets.filter(\n      (w) =>\n        w.area.type === areaType &&\n        (w.area.type === 'sidebar'\n          ? w.area.properties.location === areaId\n          : w.area.properties.id === areaId)\n    );\n  }, [configVersion, config?.widgets.length]);\n\n  // define items in itemRefs for easy access and reference to items\n  if (Object.keys(itemRefs.current).length !== items.length + (widgets ?? []).length) {\n    items.forEach(({ id }: { id: keyof typeof itemRefs.current }) => {\n      itemRefs.current[id] = itemRefs.current[id] || createRef();\n    });\n    (widgets ?? []).forEach(({ id }) => {\n      itemRefs.current[id] = itemRefs.current[id] || createRef();\n    });\n  }\n\n  useEffect(() => {\n    if (areaType === 'sidebar') return;\n    const widgetWidth = mainAreaWidth / wrapperColumnCount;\n    // widget width is used to define sizes of gridstack items within global.scss\n    root.style.setProperty('--gridstack-widget-width', widgetWidth.toString());\n    gridRef.current?.cellHeight(widgetWidth);\n  }, [mainAreaWidth, wrapperColumnCount, gridRef.current]);\n\n  useEffect(() => {\n    // column count is used to define count of columns of gridstack within global.scss\n    root.style.setProperty('--gridstack-column-count', wrapperColumnCount.toString());\n  }, [wrapperColumnCount]);\n\n  const onChange = isEditMode\n    ? (changedNode: GridStackNode) => {\n        if (!configName) return;\n\n        const itemType = changedNode.el?.getAttribute('data-type');\n        const itemId = changedNode.el?.getAttribute('data-id');\n        if (!itemType || !itemId) return;\n\n        // Updates the config and defines the new position of the item\n        updateConfig(configName, (previous) => {\n          const currentItem =\n            itemType === 'app'\n              ? previous.apps.find((x) => x.id === itemId)\n              : previous.widgets.find((x) => x.id === itemId);\n          if (!currentItem) return previous;\n\n          currentItem.shape[shapeSize] = {\n            location: {\n              x: changedNode.x!,\n              y: changedNode.y!,\n            },\n            size: {\n              width: changedNode.w!,\n              height: changedNode.h!,\n            },\n          };\n\n          if (itemType === 'app') {\n            return {\n              ...previous,\n              apps: [\n                ...previous.apps.filter((x) => x.id !== itemId),\n                { ...(currentItem as AppType) },\n              ],\n            };\n          }\n\n          return {\n            ...previous,\n            widgets: [\n              ...previous.widgets.filter((x) => x.id !== itemId),\n              { ...(currentItem as IWidget<string, any>) },\n            ],\n          };\n        });\n      }\n    : () => {};\n\n  const onAdd = isEditMode\n    ? (addedNode: GridStackNode) => {\n        if (!configName) return;\n\n        const itemType = addedNode.el?.getAttribute('data-type');\n        const itemId = addedNode.el?.getAttribute('data-id');\n        if (!itemType || !itemId) return;\n\n        // Updates the config and defines the new position and wrapper of the item\n        updateConfig(\n          configName,\n          (previous) => {\n            const currentItem =\n              itemType === 'app'\n                ? previous.apps.find((x) => x.id === itemId)\n                : previous.widgets.find((x) => x.id === itemId);\n            if (!currentItem) return previous;\n\n            if (areaType === 'sidebar') {\n              currentItem.area = {\n                type: areaType,\n                properties: {\n                  location: areaId as 'right' | 'left',\n                },\n              };\n            } else {\n              currentItem.area = {\n                type: areaType,\n                properties: {\n                  id: areaId,\n                },\n              };\n            }\n\n            currentItem.shape[shapeSize] = {\n              location: {\n                x: addedNode.x!,\n                y: addedNode.y!,\n              },\n              size: {\n                width: addedNode.w!,\n                height: addedNode.h!,\n              },\n            };\n\n            if (itemType === 'app') {\n              return {\n                ...previous,\n                apps: [\n                  ...previous.apps.filter((x) => x.id !== itemId),\n                  { ...(currentItem as AppType) },\n                ],\n              };\n            }\n\n            return {\n              ...previous,\n              widgets: [\n                ...previous.widgets.filter((x) => x.id !== itemId),\n                { ...(currentItem as IWidget<string, any>) },\n              ],\n            };\n          },\n          (prev, curr) => {\n            const isApp = itemType === 'app';\n\n            if (isApp) {\n              const currItem = curr.apps.find((x) => x.id === itemId);\n              const prevItem = prev.apps.find((x) => x.id === itemId);\n              if (!currItem || !prevItem) return false;\n\n              return (\n                currItem.area.type !== prevItem.area.type ||\n                Object.entries(currItem.area.properties).some(\n                  ([key, value]) =>\n                    prevItem.area.properties[key as keyof AreaType['properties']] !== value\n                )\n              );\n            }\n\n            const currItem = curr.widgets.find((x) => x.id === itemId);\n            const prevItem = prev.widgets.find((x) => x.id === itemId);\n            if (!currItem || !prevItem) return false;\n\n            return (\n              currItem.area.type !== prevItem.area.type ||\n              Object.entries(currItem.area.properties).some(\n                ([key, value]) =>\n                  prevItem.area.properties[key as keyof AreaType['properties']] !== value\n              )\n            );\n          }\n        );\n      }\n    : () => {};\n\n  // initialize the gridstack\n  useEffect(() => {\n    const removeEventHandlers = () => {\n      gridRef.current?.off('change');\n      gridRef.current?.off('added');\n    };\n\n    const tilesWithUnknownLocation: TileWithUnknownLocation[] = [];\n    initializeGridstack(\n      areaType,\n      wrapperRef,\n      gridRef,\n      itemRefs,\n      areaId,\n      items,\n      widgets ?? [],\n      isEditMode,\n      wrapperColumnCount,\n      shapeSize,\n      tilesWithUnknownLocation,\n      {\n        onChange,\n        onAdd,\n      }\n    );\n    if (!configName) return removeEventHandlers;\n    updateConfig(configName, (prev) => ({\n      ...prev,\n      apps: prev.apps.map((app) => {\n        const currentUnknownLocation = tilesWithUnknownLocation.find(\n          (x) => x.type === 'app' && x.id === app.id\n        );\n        if (!currentUnknownLocation) return app;\n\n        return {\n          ...app,\n          shape: {\n            ...app.shape,\n            [shapeSize]: {\n              location: {\n                x: currentUnknownLocation.x,\n                y: currentUnknownLocation.y,\n              },\n              size: {\n                width: currentUnknownLocation.w,\n                height: currentUnknownLocation.h,\n              },\n            },\n          },\n        };\n      }),\n      widgets: prev.widgets.map((widget) => {\n        const currentUnknownLocation = tilesWithUnknownLocation.find(\n          (x) => x.type === 'widget' && x.id === widget.id\n        );\n        if (!currentUnknownLocation) return widget;\n\n        return {\n          ...widget,\n          shape: {\n            ...widget.shape,\n            [shapeSize]: {\n              location: {\n                x: currentUnknownLocation.x,\n                y: currentUnknownLocation.y,\n              },\n              size: {\n                width: currentUnknownLocation.w,\n                height: currentUnknownLocation.h,\n              },\n            },\n          },\n        };\n      }),\n    }));\n    return removeEventHandlers;\n  }, [items, wrapperRef.current, widgets, wrapperColumnCount]);\n\n  return {\n    apps: items,\n    widgets: widgets ?? [],\n    refs: {\n      items: itemRefs,\n      wrapper: wrapperRef,\n      gridstack: gridRef,\n    },\n  };\n};\n"
  },
  {
    "path": "src/components/IconSelector/DebouncedImage.tsx",
    "content": "import { Image, Loader, createStyles } from '@mantine/core';\nimport { useDebouncedValue } from '@mantine/hooks';\nimport { IconPhotoOff } from '@tabler/icons-react';\n\ninterface DebouncedImageProps {\n  width: number;\n  height: number;\n  src: string;\n  debouncedWaitPeriod?: number;\n}\n\nexport const DebouncedImage = ({\n  src,\n  width,\n  height,\n  debouncedWaitPeriod = 1000,\n}: DebouncedImageProps) => {\n  const { classes } = useStyles();\n  const [debouncedIconImageUrl] = useDebouncedValue(src, debouncedWaitPeriod);\n\n  if (debouncedIconImageUrl !== src) {\n    return <Loader width={width} height={height} />;\n  }\n\n  if (debouncedIconImageUrl.length > 0) {\n    return (\n      <Image\n        placeholder={<IconPhotoOff />}\n        className={classes.iconImage}\n        src={debouncedIconImageUrl}\n        width={width}\n        height={height}\n        fit=\"contain\"\n        alt=\"\"\n        withPlaceholder\n      />\n    );\n  }\n\n  return (\n    <Image\n      className={classes.iconImage}\n      src=\"/imgs/logo/logo.png\"\n      width={width}\n      height={height}\n      fit=\"contain\"\n      alt=\"\"\n      withPlaceholder\n    />\n  );\n};\n\nconst useStyles = createStyles(() => ({\n  iconImage: {\n    objectFit: 'contain',\n  },\n}));\n"
  },
  {
    "path": "src/components/IconSelector/IconSelector.tsx",
    "content": "import {\n  Autocomplete,\n  Box,\n  CloseButton,\n  Group,\n  Image,\n  Loader,\n  ScrollArea,\n  SelectItemProps,\n  Stack,\n  Text,\n  Title,\n  createStyles,\n} from '@mantine/core';\nimport { IconSearch } from '@tabler/icons-react';\nimport { useTranslation } from 'next-i18next';\nimport { forwardRef, useImperativeHandle, useState } from 'react';\nimport { humanFileSize } from '~/tools/humanFileSize';\nimport { api } from '~/utils/api';\n\nimport { DebouncedImage } from './DebouncedImage';\n\nexport const IconSelector = forwardRef(\n  (\n    {\n      defaultValue,\n      value,\n      onChange,\n    }: {\n      defaultValue: string;\n      value?: string;\n      onChange: (debouncedValue: string | undefined) => void;\n    },\n    ref\n  ) => {\n    const { t } = useTranslation('layout/modals/add-app');\n    const { classes } = useStyles();\n\n    const { data, isLoading } = useGetDashboardIcons();\n    const [currentValue, setValue] = useState(value ?? defaultValue);\n\n    const flatIcons =\n      data === undefined\n        ? []\n        : data.flatMap((repository) =>\n            repository.entries.map((entry) => ({\n              url: entry.url,\n              label: entry.name,\n              size: entry.size,\n              value: entry.url,\n              group: repository.name,\n              copyright: repository.copyright,\n            }))\n          );\n\n    useImperativeHandle(ref, () => ({\n      chooseFirstOrDefault(searchTerm: string) {\n        const match = flatIcons.find((icon) =>\n          icon.label.toLowerCase().includes(searchTerm.toLowerCase())\n        );\n\n        if (!match) {\n          return;\n        }\n\n        onChange(match.url);\n      },\n    }));\n\n    return (\n      <Stack w=\"100%\">\n        <Autocomplete\n          nothingFound={\n            <Stack align=\"center\" spacing=\"xs\" my=\"lg\">\n              <IconSearch />\n              <Title order={6} align=\"center\">\n                {t('appearance.icon.autocomplete.title')}\n              </Title>\n              <Text align=\"center\" maw={350}>\n                {t('appearance.icon.autocomplete.text')}\n              </Text>\n            </Stack>\n          }\n          icon={<DebouncedImage src={value ?? currentValue} width={20} height={20} />}\n          rightSection={\n            (value ?? currentValue).length > 0 ? <CloseButton onClick={() => onChange('')} /> : null\n          }\n          itemComponent={AutoCompleteItem}\n          className={classes.textInput}\n          data={flatIcons}\n          limit={25}\n          label={t('appearance.icon.label')}\n          description={t('appearance.icon.description', {\n            suggestionsCount: data?.reduce((a, b) => a + b.count, 0) ?? 0,\n          })}\n          filter={(search, item) =>\n            item.value\n              .toLowerCase()\n              .replaceAll('_', '')\n              .replaceAll(' ', '-')\n              .includes(search.toLowerCase().replaceAll('_', '').replaceAll(' ', '-'))\n          }\n          dropdownComponent={(props: any) => <ScrollArea {...props} mah={250} />}\n          onChange={(event) => {\n            onChange(event);\n            setValue(event);\n          }}\n          dropdownPosition=\"bottom\"\n          variant=\"default\"\n          value={value}\n          withAsterisk\n          withinPortal\n          required\n        />\n        {(!data || isLoading) && (\n          <Group>\n            <Loader variant=\"oval\" size=\"sm\" />\n            <Stack spacing={0}>\n              <Text size=\"xs\" weight=\"bold\">\n                {t('appearance.icon.noItems.title')}\n              </Text>\n              <Text color=\"dimmed\" size=\"xs\">\n                {t('appearance.icon.noItems.text')}\n              </Text>\n            </Stack>\n          </Group>\n        )}\n      </Stack>\n    );\n  }\n);\n\nconst useStyles = createStyles(() => ({\n  textInput: {\n    flexGrow: 1,\n  },\n}));\n\nconst AutoCompleteItem = forwardRef<HTMLDivElement, ItemProps>(\n  ({ label, size, copyright, url, ...others }: ItemProps, ref) => (\n    <div ref={ref} {...others}>\n      <Group noWrap>\n        <Box\n          sx={(theme) => ({\n            backgroundColor:\n              theme.colorScheme === 'dark' ? theme.colors.dark[5] : theme.colors.gray[2],\n            borderRadius: theme.radius.md,\n          })}\n          p={2}\n        >\n          <Image src={url} width={30} height={30} fit=\"contain\" />\n        </Box>\n        <Stack spacing={0}>\n          <Text>{label}</Text>\n          <Group>\n            <Text color=\"dimmed\" size=\"xs\">\n              {humanFileSize(size, false)}\n            </Text>\n            {copyright && (\n              <Text color=\"dimmed\" size=\"xs\">\n                © {copyright}\n              </Text>\n            )}\n          </Group>\n        </Stack>\n      </Group>\n    </div>\n  )\n);\n\ninterface ItemProps extends SelectItemProps {\n  url: string;\n  group: string;\n  size: number;\n  copyright: string | undefined;\n}\n\nconst useGetDashboardIcons = () =>\n  api.icon.all.useQuery(undefined, {\n    refetchOnMount: false,\n    // Cache for infinity, refetch every so often.\n    cacheTime: Infinity,\n    staleTime: 1000 * 60 * 5, // 5 minutes\n    refetchOnWindowFocus: false,\n  });\n"
  },
  {
    "path": "src/components/InfoCard/InfoCard.tsx",
    "content": "import {\n  DefaultMantineColor,\n  HoverCard,\n  HoverCardProps,\n  SystemProp,\n  useMantineTheme,\n} from '@mantine/core';\nimport { Link, RichTextEditor, RichTextEditorProps } from '@mantine/tiptap';\nimport { IconInfoCircle } from '@tabler/icons-react';\nimport { useEditor } from '@tiptap/react';\nimport StarterKit from '@tiptap/starter-kit';\nimport { useTranslation } from 'next-i18next';\n\ninterface InfoCardProps {\n  bg?: SystemProp<DefaultMantineColor>;\n  cardProp?: Partial<RichTextEditorProps>;\n  message: string;\n  link?: string;\n  hoverProp?: Partial<HoverCardProps>;\n  position?: HoverCardProps['position'];\n}\n\nexport const InfoCard = ({ bg, cardProp, message, link, hoverProp, position }: InfoCardProps) => {\n  const { colorScheme } = useMantineTheme();\n  const { t } = useTranslation('common');\n  const content = link\n    ? message + ` <a href=\\\"${link}\\\" target=\\\"_blank\\\">${t('seeMore')}</a>`\n    : message;\n  const editor = useEditor({\n    content,\n    editable: false,\n    editorProps: { attributes: { style: 'padding: 0;' } },\n    extensions: [StarterKit, Link],\n  });\n\n  return (\n    <HoverCard position={position ?? 'top'} radius=\"md\" withArrow withinPortal {...hoverProp}>\n      <HoverCard.Target>\n        <IconInfoCircle size=\"1.25rem\" style={{ display: 'block', opacity: 0.5 }} />\n      </HoverCard.Target>\n      <HoverCard.Dropdown\n        bg={bg ?? colorScheme === 'light' ? 'gray.2' : 'dark.8'}\n        maw={400}\n        px=\"10px\"\n        py=\"5px\"\n      >\n        <RichTextEditor editor={editor} style={{ border: '0' }} {...cardProp}>\n          <RichTextEditor.Content bg=\"transparent\" />\n        </RichTextEditor>\n      </HoverCard.Dropdown>\n    </HoverCard>\n  );\n};\n"
  },
  {
    "path": "src/components/Manage/Board/create-board.modal.tsx",
    "content": "import { Button, Group, Stack, Text, TextInput } from '@mantine/core';\nimport { useForm } from '@mantine/form';\nimport { ContextModalProps, modals } from '@mantine/modals';\nimport { Trans, useTranslation } from 'next-i18next';\nimport { getStaticFallbackConfig } from '~/tools/config/getFallbackConfig';\nimport { api } from '~/utils/api';\nimport { useI18nZodResolver } from '~/utils/i18n-zod-resolver';\nimport { createBoardSchemaValidation } from '~/validations/boards';\n\nexport const CreateBoardModal = ({ id }: ContextModalProps<{}>) => {\n  const { t } = useTranslation('manage/boards');\n  const utils = api.useUtils();\n  const { isLoading, mutate } = api.config.save.useMutation({\n    onSuccess: async () => {\n      await utils.boards.all.invalidate();\n      modals.close(id);\n    },\n    onError: async (error) => {\n      form.setFieldError('name', error.message);\n    },\n  });\n\n  const { i18nZodResolver } = useI18nZodResolver();\n\n  const form = useForm({\n    initialValues: {\n      name: '',\n    },\n    validate: i18nZodResolver(createBoardSchemaValidation),\n  });\n\n  const handleSubmit = () => {\n    const fallbackConfig = getStaticFallbackConfig(form.values.name);\n    mutate({\n      name: form.values.name,\n      config: fallbackConfig,\n      create: true,\n    });\n  };\n\n  return (\n    <form onSubmit={form.onSubmit(handleSubmit)}>\n      <Stack>\n        <Text>{t('modals.create.text')}</Text>\n\n        <TextInput\n          label={t('modals.create.form.name.label')}\n          withAsterisk\n          {...form.getInputProps('name')}\n        />\n\n        <Group grow>\n          <Button\n            onClick={() => {\n              modals.close(id);\n            }}\n            variant=\"light\"\n            color=\"gray\"\n            type=\"button\"\n          >\n            {t('common:cancel')}\n          </Button>\n          <Button\n            type=\"submit\"\n            onClick={async () => {\n              umami.track('Create new board');\n            }}\n            disabled={isLoading}\n            variant=\"light\"\n            color=\"green\"\n          >\n            {t('modals.create.form.submit')}\n          </Button>\n        </Group>\n      </Stack>\n    </form>\n  );\n};\n\nexport const openCreateBoardModal = () => {\n  modals.openContextModal({\n    modal: 'createBoardModal',\n    title: <Trans i18nKey=\"manage/boards:modals.create.title\" />,\n    innerProps: {},\n  });\n};\n"
  },
  {
    "path": "src/components/Manage/Board/delete-board.modal.tsx",
    "content": "import { Button, Group, Stack, Text } from '@mantine/core';\nimport { ContextModalProps, modals } from '@mantine/modals';\nimport { Trans, useTranslation } from 'next-i18next';\nimport { api } from '~/utils/api';\n\ntype InnerProps = { boardName: string; onConfirm: () => Promise<void> };\n\nexport const DeleteBoardModal = ({ id, innerProps }: ContextModalProps<InnerProps>) => {\n  const { t } = useTranslation('manage/boards');\n  const utils = api.useContext();\n  const { isLoading, mutateAsync } = api.config.delete.useMutation({\n    onSuccess: async () => {\n      await utils.boards.all.invalidate();\n      modals.close(id);\n    },\n  });\n\n  return (\n    <Stack>\n      <Text>{t('modals.delete.text')}</Text>\n\n      <Group grow>\n        <Button\n          onClick={() => {\n            modals.close(id);\n          }}\n          variant=\"light\"\n          color=\"gray\"\n        >\n          {t('common:cancel')}\n        </Button>\n        <Button\n          onClick={async () => {\n            modals.close(id);\n            await innerProps.onConfirm();\n            await mutateAsync({\n              name: innerProps.boardName,\n            });\n          }}\n          disabled={isLoading}\n          variant=\"light\"\n          color=\"red\"\n        >\n          {t('common:delete')}\n        </Button>\n      </Group>\n    </Stack>\n  );\n};\n\nexport const openDeleteBoardModal = (innerProps: InnerProps) => {\n  modals.openContextModal({\n    modal: 'deleteBoardModal',\n    title: <Trans i18nKey=\"manage/boards:modals.delete.title\" />,\n    innerProps,\n  });\n};\n"
  },
  {
    "path": "src/components/Manage/Tools/Docker/ContainerActionBar.tsx",
    "content": "import { Button, Group } from '@mantine/core';\nimport { notifications } from '@mantine/notifications';\nimport {\n  IconCheck,\n  IconPlayerPlay,\n  IconPlayerStop,\n  IconPlus,\n  IconRefresh,\n  IconRotateClockwise,\n  IconTrash,\n} from '@tabler/icons-react';\nimport Dockerode from 'dockerode';\nimport { useTranslation } from 'next-i18next';\nimport { RouterInputs, api } from '~/utils/api';\n\nimport { openDockerSelectBoardModal } from './docker-select-board.modal';\n\nexport interface ContainerActionBarProps {\n  selected: (Dockerode.ContainerInfo & { icon?: string })[];\n  reload: () => void;\n  isLoading: boolean;\n}\n\nexport default function ContainerActionBar({\n  selected,\n  reload,\n  isLoading,\n}: ContainerActionBarProps) {\n  const { t } = useTranslation('modules/docker');\n  const sendDockerCommand = useDockerActionMutation();\n\n  return (\n    <Group spacing=\"xs\">\n      <Button\n        leftIcon={<IconRefresh />}\n        onClick={reload}\n        variant=\"light\"\n        color=\"violet\"\n        loading={isLoading}\n        radius=\"md\"\n      >\n        {t('actionBar.refreshData.title')}\n      </Button>\n      <Button\n        leftIcon={<IconRotateClockwise />}\n        onClick={async () =>\n          await Promise.all(selected.map((container) => sendDockerCommand(container, 'restart')))\n        }\n        variant=\"light\"\n        color=\"orange\"\n        radius=\"md\"\n        disabled={selected.length === 0}\n      >\n        {t('actionBar.restart.title')}\n      </Button>\n      <Button\n        leftIcon={<IconPlayerStop />}\n        onClick={async () =>\n          await Promise.all(selected.map((container) => sendDockerCommand(container, 'stop')))\n        }\n        variant=\"light\"\n        color=\"red\"\n        radius=\"md\"\n        disabled={selected.length === 0}\n      >\n        {t('actionBar.stop.title')}\n      </Button>\n      <Button\n        leftIcon={<IconPlayerPlay />}\n        onClick={async () =>\n          await Promise.all(selected.map((container) => sendDockerCommand(container, 'start')))\n        }\n        variant=\"light\"\n        color=\"green\"\n        radius=\"md\"\n        disabled={selected.length === 0}\n      >\n        {t('actionBar.start.title')}\n      </Button>\n      <Button\n        leftIcon={<IconTrash />}\n        color=\"red\"\n        variant=\"light\"\n        radius=\"md\"\n        onClick={async () =>\n          await Promise.all(selected.map((container) => sendDockerCommand(container, 'remove')))\n        }\n        disabled={selected.length === 0}\n      >\n        {t('actionBar.remove.title')}\n      </Button>\n      <Button\n        leftIcon={<IconPlus />}\n        color=\"indigo\"\n        variant=\"light\"\n        radius=\"md\"\n        disabled={selected.length < 1}\n        onClick={() => openDockerSelectBoardModal({ containers: selected })}\n      >\n        {t('actionBar.addToHomarr.title')}\n      </Button>\n    </Group>\n  );\n}\n\nconst useDockerActionMutation = () => {\n  const { t } = useTranslation('modules/docker');\n  const utils = api.useContext();\n  const mutation = api.docker.action.useMutation();\n\n  return async (\n    container: Dockerode.ContainerInfo,\n    action: RouterInputs['docker']['action']['action']\n  ) => {\n    const containerName = container.Names[0].substring(1);\n\n    notifications.show({\n      id: container.Id,\n      loading: true,\n      title: `${t(`actions.${action}.start`)} ${containerName}`,\n      message: undefined,\n      autoClose: false,\n      withCloseButton: false,\n    });\n\n    await mutation.mutateAsync(\n      { action, id: container.Id },\n      {\n        onSuccess: () => {\n          notifications.cleanQueue();\n        },\n        onError: (err) => {\n          notifications.update({\n            id: container.Id,\n            color: 'red',\n            title: t('errors.unknownError.title'),\n            message: err.message,\n            autoClose: 2000,\n          });\n        },\n        onSettled: () => {\n          utils.docker.containers.invalidate();\n        },\n      }\n    );\n  };\n};\n"
  },
  {
    "path": "src/components/Manage/Tools/Docker/ContainerState.tsx",
    "content": "import { Badge, BadgeProps, MantineSize } from '@mantine/core';\nimport Dockerode from 'dockerode';\nimport { useTranslation } from 'next-i18next';\n\nexport interface ContainerStateProps {\n  state: Dockerode.ContainerInfo['State'];\n}\n\nexport default function ContainerState(props: ContainerStateProps) {\n  const { state } = props;\n\n  const { t } = useTranslation('modules/docker');\n\n  const options: {\n    size: MantineSize;\n    radius: MantineSize;\n    variant: BadgeProps['variant'];\n  } = {\n    size: 'md',\n    radius: 'md',\n    variant: 'outline',\n  };\n  switch (state) {\n    case 'running': {\n      return (\n        <Badge color=\"green\" {...options}>\n          {t('table.states.running')}\n        </Badge>\n      );\n    }\n    case 'created': {\n      return (\n        <Badge color=\"cyan\" {...options}>\n          {t('table.states.created')}\n        </Badge>\n      );\n    }\n    case 'exited': {\n      return (\n        <Badge color=\"red\" {...options}>\n          {t('table.states.stopped')}\n        </Badge>\n      );\n    }\n    default: {\n      return (\n        <Badge color=\"purple\" {...options}>\n          {t('table.states.unknown')}\n        </Badge>\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "src/components/Manage/Tools/Docker/ContainerTable.tsx",
    "content": "import {\n  Badge,\n  Checkbox,\n  Group,\n  Image,\n  ScrollArea,\n  Table,\n  Text,\n  TextInput,\n  createStyles,\n} from '@mantine/core';\nimport { useElementSize } from '@mantine/hooks';\nimport { IconSearch } from '@tabler/icons-react';\nimport Dockerode, { ContainerInfo } from 'dockerode';\nimport { useTranslation } from 'next-i18next';\nimport { Dispatch, SetStateAction, useMemo, useState } from 'react';\n\nimport { MIN_WIDTH_MOBILE } from '../../../../constants/constants';\nimport ContainerState from './ContainerState';\n\nconst useStyles = createStyles((theme) => ({\n  rowSelected: {\n    backgroundColor:\n      theme.colorScheme === 'dark'\n        ? theme.fn.rgba(theme.colors[theme.primaryColor][7], 0.2)\n        : theme.colors[theme.primaryColor][0],\n  },\n}));\n\nexport default function ContainerTable({\n  containers,\n  selection,\n  setSelection,\n}: {\n  setSelection: Dispatch<SetStateAction<ContainerInfo[]>>;\n  containers: ContainerInfo[];\n  selection: ContainerInfo[];\n}) {\n  const { t } = useTranslation('modules/docker');\n  const [search, setSearch] = useState('');\n  const { ref, width } = useElementSize();\n\n  const filteredContainers = useMemo(\n    () => filterContainers(containers, search),\n    [containers, search]\n  );\n\n  const handleSearchChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n    setSearch(event.currentTarget.value);\n  };\n\n  const toggleRow = (container: ContainerInfo) =>\n    setSelection((selected: ContainerInfo[]) =>\n      selected.includes(container)\n        ? selected.filter((c) => c !== container)\n        : [...selected, container]\n    );\n  const toggleAll = () =>\n    setSelection((selected: ContainerInfo[]) =>\n      selected.length === filteredContainers.length ? [] : filteredContainers.map((c) => c)\n    );\n\n  return (\n    <ScrollArea style={{ height: '100%' }} offsetScrollbars>\n      <TextInput\n        placeholder={t('search.placeholder') ?? undefined}\n        mr=\"md\"\n        icon={<IconSearch size={14} />}\n        value={search}\n        autoFocus\n        onChange={handleSearchChange}\n      />\n      <Table ref={ref} captionSide=\"bottom\" highlightOnHover verticalSpacing=\"sm\">\n        <thead>\n          <tr>\n            <th style={{ width: 40 }}>\n              <Checkbox\n                onChange={toggleAll}\n                checked={selection.length === filteredContainers.length && selection.length > 0}\n                indeterminate={\n                  selection.length > 0 && selection.length !== filteredContainers.length\n                }\n                transitionDuration={0}\n                disabled={filteredContainers.length === 0}\n              />\n            </th>\n            <th>{t('table.header.name')}</th>\n            {width > MIN_WIDTH_MOBILE ? <th>{t('table.header.image')}</th> : null}\n            {width > MIN_WIDTH_MOBILE ? <th>{t('table.header.ports')}</th> : null}\n            <th>{t('table.header.state')}</th>\n          </tr>\n        </thead>\n        <tbody>\n          {filteredContainers.map((container) => {\n            const selected = selection.includes(container);\n            return (\n              <Row\n                key={container.Id}\n                container={container}\n                icon={(container as any).icon ?? undefined}\n                selected={selected}\n                toggleRow={toggleRow}\n                width={width}\n              />\n            );\n          })}\n        </tbody>\n      </Table>\n    </ScrollArea>\n  );\n}\n\ntype RowProps = {\n  container: ContainerInfo;\n  selected: boolean;\n  toggleRow: (container: ContainerInfo) => void;\n  width: number;\n  icon?: string;\n};\nconst Row = ({ icon, container, selected, toggleRow, width }: RowProps) => {\n  const { t } = useTranslation('modules/docker');\n  const { classes, cx } = useStyles();\n  const containerName = container.Names[0].replace('/', '');\n\n  return (\n    <tr className={cx({ [classes.rowSelected]: selected })}>\n      <td>\n        <Checkbox checked={selected} onChange={() => toggleRow(container)} transitionDuration={0} />\n      </td>\n      <td>\n        <Group noWrap>\n          <Image withPlaceholder src={icon} width={30} height={30} />\n          <Text size=\"lg\" weight={600}>\n            {containerName}\n          </Text>\n        </Group>\n      </td>\n      {width > MIN_WIDTH_MOBILE && (\n        <td>\n          <Text size=\"lg\">{container.Image.slice(0, 25)}</Text>\n        </td>\n      )}\n      {width > MIN_WIDTH_MOBILE && (\n        <td>\n          <Group>\n            {container.Ports.sort((a, b) => a.PrivatePort - b.PrivatePort)\n              // Remove duplicates with filter function\n              .filter(\n                (port, index, self) =>\n                  index === self.findIndex((t) => t.PrivatePort === port.PrivatePort)\n              )\n              .slice(-3)\n              .map((port) => (\n                <Badge key={port.PrivatePort} variant=\"outline\">\n                  {port.PrivatePort}:{port.PublicPort}\n                </Badge>\n              ))}\n            {container.Ports.length > 3 && (\n              <Badge variant=\"filled\">\n                {t('table.body.portCollapse', { ports: container.Ports.length - 3 })}\n              </Badge>\n            )}\n          </Group>\n        </td>\n      )}\n      <td>\n        <ContainerState state={container.State} />\n      </td>\n    </tr>\n  );\n};\n\nfunction filterContainers(data: Dockerode.ContainerInfo[], search: string) {\n  const query = search.toLowerCase().trim();\n  return data.filter((item) =>\n    item.Names.some((name) => name.toLowerCase().includes(query) || item.Image.includes(query))\n  );\n}\n"
  },
  {
    "path": "src/components/Manage/Tools/Docker/docker-select-board.modal.tsx",
    "content": "import { Button, Group, Select, Stack, Text } from '@mantine/core';\nimport { useForm } from '@mantine/form';\nimport { ContextModalProps, modals } from '@mantine/modals';\nimport { showNotification } from '@mantine/notifications';\nimport { IconCheck, IconX } from '@tabler/icons-react';\nimport { ContainerInfo } from 'dockerode';\nimport { Trans, useTranslation } from 'next-i18next';\nimport { z } from 'zod';\nimport { useConfigContext } from '~/config/provider';\nimport { useConfigStore } from '~/config/store';\nimport { generateDefaultApp } from '~/tools/shared/app';\nimport { api } from '~/utils/api';\nimport { useI18nZodResolver } from '~/utils/i18n-zod-resolver';\n\nconst dockerSelectBoardSchema = z.object({\n  board: z.string().nonempty(),\n});\n\ntype InnerProps = {\n  containers: (ContainerInfo & { icon?: string })[];\n};\ntype FormType = z.infer<typeof dockerSelectBoardSchema>;\n\nexport const DockerSelectBoardModal = ({ id, innerProps }: ContextModalProps<InnerProps>) => {\n  const { t } = useTranslation('tools/docker');\n  const { mutateAsync, isLoading } = api.boards.addAppsForContainers.useMutation();\n  const { i18nZodResolver } = useI18nZodResolver();\n  const { name: configName } = useConfigContext();\n\n  const updateConfig = useConfigStore((store) => store.updateConfig);\n  const handleSubmit = async (values: FormType) => {\n    const newApps = innerProps.containers.map((container) => ({\n      name: (container.Names.at(0) ?? 'App').replace('/', ''),\n      port: container.Ports.at(0)?.PublicPort,\n      icon: container.icon,\n    }));\n    await mutateAsync(\n      {\n        apps: newApps,\n        boardName: values.board,\n      },\n      {\n        onSuccess: () => {\n          showNotification({\n            title: t('notifications.selectBoard.success.title'),\n            message: t('notifications.selectBoard.success.message'),\n            icon: <IconCheck />,\n            color: 'green',\n          });\n          updateConfig(configName!, (config) => {\n            const lowestWrapper = config?.wrappers.sort((a, b) => a.position - b.position)[0];\n            const defaultApp = generateDefaultApp(lowestWrapper.id);\n            return {\n              ...config,\n              apps: [\n                ...config.apps,\n                ...newApps.map((app) => ({\n                  ...defaultApp,\n                  ...app,\n                  wrapperId: lowestWrapper.id,\n                })),\n              ],\n            };\n          });\n          modals.close(id);\n        },\n        onError: () => {\n          showNotification({\n            title: t('notifications.selectBoard.error.title'),\n            message: t('notifications.selectBoard.error.message'),\n            icon: <IconX />,\n            color: 'red',\n          });\n        },\n      }\n    );\n  };\n\n  const form = useForm<FormType>({\n    initialValues: {\n      board: '',\n    },\n    validate: i18nZodResolver(dockerSelectBoardSchema),\n  });\n\n  const { data: boards } = api.boards.all.useQuery();\n\n  return (\n    <form onSubmit={form.onSubmit(handleSubmit)}>\n      <Stack>\n        <Text>{t('modals.selectBoard.text')}</Text>\n\n        <Select\n          label={t('modals.selectBoard.form.board.label')}\n          withAsterisk\n          withinPortal\n          data={\n            boards?.map((board) => ({\n              value: board.name,\n              label: board.name,\n            })) ?? []\n          }\n          {...form.getInputProps('board')}\n        />\n\n        <Group grow>\n          <Button\n            onClick={() => {\n              modals.close(id);\n            }}\n            variant=\"light\"\n            color=\"gray\"\n            type=\"button\"\n          >\n            {t('common:cancel')}\n          </Button>\n          <Button\n            type=\"submit\"\n            onClick={async () => {}}\n            disabled={isLoading}\n            variant=\"light\"\n            color=\"green\"\n          >\n            {t('modals.selectBoard.form.submit')}\n          </Button>\n        </Group>\n      </Stack>\n    </form>\n  );\n};\n\nexport const openDockerSelectBoardModal = (innerProps: InnerProps) => {\n  modals.openContextModal({\n    modal: 'dockerSelectBoardModal',\n    title: <Trans i18nKey=\"tools/docker:modals.selectBoard.title\" />,\n    innerProps,\n  });\n  umami.track('Add to homarr modal');\n};\n"
  },
  {
    "path": "src/components/Manage/User/Create/create-account-step.tsx",
    "content": "import { Button, Card, Flex, TextInput } from '@mantine/core';\nimport { useForm } from '@mantine/form';\nimport { IconArrowRight, IconAt, IconUser } from '@tabler/icons-react';\nimport { useTranslation } from 'next-i18next';\nimport { z } from 'zod';\nimport { useI18nZodResolver } from '~/utils/i18n-zod-resolver';\n\ninterface CreateAccountStepProps {\n  nextStep: ({ eMail, username }: { username: string; eMail: string }) => void;\n  defaultUsername: string;\n  defaultEmail: string;\n}\n\nexport const CreateAccountStep = ({\n  defaultEmail,\n  defaultUsername,\n  nextStep,\n}: CreateAccountStepProps) => {\n  const { t } = useTranslation('manage/users/create');\n\n  const { i18nZodResolver } = useI18nZodResolver();\n  const form = useForm({\n    initialValues: {\n      username: defaultUsername,\n      eMail: defaultEmail,\n    },\n    validateInputOnBlur: true,\n    validateInputOnChange: true,\n    validate: i18nZodResolver(createAccountStepValidationSchema),\n  });\n\n  return (\n    <Card mih={400}>\n      <TextInput\n        icon={<IconUser size=\"0.8rem\" />}\n        label={t('steps.account.username.label')}\n        variant=\"filled\"\n        mb=\"md\"\n        withAsterisk\n        {...form.getInputProps('username')}\n      />\n      <TextInput\n        icon={<IconAt size=\"0.8rem\" />}\n        label={t('steps.account.email.label')}\n        variant=\"filled\"\n        mb=\"md\"\n        {...form.getInputProps('eMail')}\n      />\n\n      <Flex justify=\"end\" wrap=\"nowrap\">\n        <Button\n          rightIcon={<IconArrowRight size=\"1rem\" />}\n          disabled={!form.isValid()}\n          onClick={() => {\n            nextStep({\n              username: form.values.username,\n              eMail: form.values.eMail,\n            });\n          }}\n          variant=\"light\"\n          px=\"xl\"\n        >\n          {t('common:next')}\n        </Button>\n      </Flex>\n    </Card>\n  );\n};\n\nexport const createAccountStepValidationSchema = z.object({\n  username: z.string().min(1).max(100),\n  eMail: z.string().email().or(z.literal('')),\n});\n"
  },
  {
    "path": "src/components/Manage/User/Create/review-input-step.tsx",
    "content": "import { Alert, Button, Card, Group, Table, Text, Title } from '@mantine/core';\nimport {\n  IconAlertTriangle,\n  IconAlertTriangleFilled,\n  IconArrowLeft,\n  IconCheck,\n  IconInfoCircle,\n  IconKey,\n  IconMail,\n  IconUser,\n} from '@tabler/icons-react';\nimport { useTranslation } from 'next-i18next';\nimport { CreateAccountSchema } from '~/pages/manage/users/create';\nimport { api } from '~/utils/api';\n\ntype ReviewInputStepProps = {\n  values: CreateAccountSchema;\n  prevStep: () => void;\n  nextStep: () => void;\n};\n\nexport const ReviewInputStep = ({ values, prevStep, nextStep }: ReviewInputStepProps) => {\n  const { t } = useTranslation('manage/users/create');\n\n  const utils = api.useContext();\n  const {\n    mutateAsync: createAsync,\n    isLoading,\n    isError,\n    error,\n  } = api.user.create.useMutation({\n    onSettled: () => {\n      void utils.user.all.invalidate();\n    },\n    onSuccess: () => {\n      nextStep();\n    },\n  });\n\n  return (\n    <Card mih={400}>\n      <Title order={5}>{t('steps.finish.card.title')}</Title>\n      <Text mb=\"xl\">{t('steps.finish.card.text')}</Text>\n\n      <Table mb=\"lg\" withBorder highlightOnHover>\n        <thead>\n          <tr>\n            <th>{t('steps.finish.table.header.property')}</th>\n            <th>{t('steps.finish.table.header.value')}</th>\n          </tr>\n        </thead>\n        <tbody>\n          <tr>\n            <td>\n              <Group spacing=\"xs\">\n                <IconUser size=\"1rem\" />\n                <Text>{t('steps.finish.table.header.username')}</Text>\n              </Group>\n            </td>\n            <td>{values.account.username}</td>\n          </tr>\n          <tr>\n            <td>\n              <Group spacing=\"xs\">\n                <IconMail size=\"1rem\" />\n                <Text>{t('steps.finish.table.header.email')}</Text>\n              </Group>\n            </td>\n            <td>\n              {values.account.eMail ? (\n                <Text>{values.account.eMail}</Text>\n              ) : (\n                <Group spacing=\"xs\">\n                  <IconInfoCircle size=\"1rem\" color=\"orange\" />\n                  <Text color=\"orange\">{t('steps.finish.table.notSet')}</Text>\n                </Group>\n              )}\n            </td>\n          </tr>\n          <tr>\n            <td>\n              <Group spacing=\"xs\">\n                <IconKey size=\"1rem\" />\n                <Text>{t('steps.finish.table.header.password')}</Text>\n              </Group>\n            </td>\n            <td>\n              <Group spacing=\"xs\">\n                <IconCheck size=\"1rem\" color=\"green\" />\n                <Text color=\"green\">{t('steps.finish.table.valid')}</Text>\n              </Group>\n            </td>\n          </tr>\n        </tbody>\n      </Table>\n\n      {isError && (\n        <Alert color=\"red\" icon={<IconAlertTriangleFilled size=\"0.9rem\" />} mb=\"lg\">\n          <Text color=\"red\">{t('steps.finish.failed', { error: error.message })}</Text>\n        </Alert>\n      )}\n\n      <Group position=\"apart\" noWrap>\n        <Button leftIcon={<IconArrowLeft size=\"1rem\" />} onClick={prevStep} variant=\"light\" px=\"xl\">\n          {t('common:previous')}\n        </Button>\n        <Button\n          onClick={async () => {\n            await createAsync({\n              username: values.account.username,\n              password: values.security.password,\n              email: values.account.eMail === '' ? undefined : values.account.eMail,\n            });\n            umami.track('Create user', { username: values.account.username });\n          }}\n          loading={isLoading}\n          rightIcon={<IconCheck size=\"1rem\" />}\n          variant=\"light\"\n          px=\"xl\"\n        >\n          {t('common:confirm')}\n        </Button>\n      </Group>\n    </Card>\n  );\n};\n"
  },
  {
    "path": "src/components/Manage/User/Create/security-step.tsx",
    "content": "import { Button, Card, Flex, Group, PasswordInput, Popover } from '@mantine/core';\nimport { useForm } from '@mantine/form';\nimport { IconArrowLeft, IconArrowRight, IconDice, IconKey } from '@tabler/icons-react';\nimport { useTranslation } from 'next-i18next';\nimport { useState } from 'react';\nimport { z } from 'zod';\nimport { PasswordRequirements } from '~/components/Password/password-requirements';\nimport { api } from '~/utils/api';\nimport { useI18nZodResolver } from '~/utils/i18n-zod-resolver';\nimport { passwordSchema } from '~/validations/user';\n\ninterface CreateAccountSecurityStepProps {\n  defaultPassword: string;\n  nextStep: ({ password }: { password: string }) => void;\n  prevStep: () => void;\n}\n\nexport const CreateAccountSecurityStep = ({\n  defaultPassword,\n  nextStep,\n  prevStep,\n}: CreateAccountSecurityStepProps) => {\n  const { t } = useTranslation('manage/users/create');\n\n  const { i18nZodResolver } = useI18nZodResolver();\n  const form = useForm({\n    initialValues: {\n      password: defaultPassword,\n    },\n    validateInputOnBlur: true,\n    validateInputOnChange: true,\n    validate: i18nZodResolver(createAccountSecurityStepValidationSchema),\n  });\n\n  const { mutateAsync, isLoading } = api.password.generate.useMutation();\n\n  const [popoverOpened, setPopoverOpened] = useState(false);\n\n  return (\n    <Card mih={400}>\n      <Popover\n        opened={popoverOpened}\n        position=\"bottom\"\n        width=\"target\"\n        transitionProps={{ transition: 'pop' }}\n      >\n        <Popover.Target>\n          <div\n            onFocusCapture={() => setPopoverOpened(true)}\n            onBlurCapture={() => setPopoverOpened(false)}\n          >\n            <Flex columnGap={10} align=\"start\">\n              <PasswordInput\n                icon={<IconKey size=\"0.8rem\" />}\n                style={{\n                  flexGrow: 1,\n                }}\n                label={t('steps.security.password.label')}\n                variant=\"filled\"\n                mb=\"md\"\n                withAsterisk\n                {...form.getInputProps('password')}\n              />\n              <Button\n                leftIcon={<IconDice size=\"1rem\" />}\n                onClick={async () => {\n                  const randomPassword = await mutateAsync();\n                  form.setFieldValue('password', randomPassword);\n                  umami.track('Generate random password');\n                }}\n                loading={isLoading}\n                variant=\"default\"\n                mt=\"xl\"\n              >\n                {t('buttons.generateRandomPassword')}\n              </Button>\n            </Flex>\n          </div>\n        </Popover.Target>\n        <Popover.Dropdown>\n          <PasswordRequirements value={form.values.password} />\n        </Popover.Dropdown>\n      </Popover>\n\n      <Group position=\"apart\" noWrap>\n        <Button leftIcon={<IconArrowLeft size=\"1rem\" />} onClick={prevStep} variant=\"light\" px=\"xl\">\n          {t('common:previous')}\n        </Button>\n        <Button\n          rightIcon={<IconArrowRight size=\"1rem\" />}\n          onClick={() => {\n            nextStep({\n              password: form.values.password,\n            });\n          }}\n          variant=\"light\"\n          px=\"xl\"\n          disabled={!form.isValid()}\n        >\n          {t('common:next')}\n        </Button>\n      </Group>\n    </Card>\n  );\n};\n\nexport const createAccountSecurityStepValidationSchema = z.object({\n  password: passwordSchema,\n});\n"
  },
  {
    "path": "src/components/Manage/User/Edit/GeneralForm.tsx",
    "content": "import { Box, Button, Group, TextInput, Title } from '@mantine/core';\nimport { useForm, zodResolver } from '@mantine/form';\nimport { IconAt, IconCheck, IconLetterCase } from '@tabler/icons-react';\nimport { useTranslation } from 'next-i18next';\nimport { z } from 'zod';\nimport { api } from '~/utils/api';\n\nexport const ManageUserGeneralForm = ({\n  userId,\n  defaultUsername,\n  defaultEmail,\n}: {\n  userId: string;\n  defaultUsername: string;\n  defaultEmail: string;\n}) => {\n  const form = useForm({\n    initialValues: {\n      username: defaultUsername,\n      eMail: defaultEmail,\n    },\n    validate: zodResolver(\n      z.object({\n        username: z.string(),\n        eMail: z.string().email().or(z.literal('')),\n      })\n    ),\n    validateInputOnBlur: true,\n    validateInputOnChange: true,\n  });\n  const { t } = useTranslation(['manage/users/edit', 'common']);\n\n  const utils = api.useUtils();\n\n  const { mutate, isLoading } = api.user.updateDetails.useMutation({\n    onSettled: async () => {\n      await utils.user.invalidate();\n      form.resetDirty();\n    },\n  });\n\n  function handleSubmit() {\n    mutate({\n      userId: userId,\n      username: form.values.username,\n      eMail: form.values.eMail,\n    });\n  }\n\n  return (\n    <Box maw={500}>\n      <Title order={3}>{t('sections.general.title')}</Title>\n      <form onSubmit={form.onSubmit(handleSubmit)}>\n        <TextInput\n          icon={<IconLetterCase size=\"1rem\" />}\n          label={t('sections.general.inputs.username.label')}\n          mb=\"md\"\n          withAsterisk\n          {...form.getInputProps('username')}\n        />\n        <TextInput\n          icon={<IconAt size=\"1rem\" />}\n          label={t('sections.general.inputs.eMail.label')}\n          {...form.getInputProps('eMail')}\n        />\n        <Group position=\"right\" mt=\"md\">\n          <Button\n            disabled={!form.isDirty() || !form.isValid() || isLoading}\n            loading={isLoading}\n            leftIcon={<IconCheck size=\"1rem\" />}\n            color=\"green\"\n            variant=\"light\"\n            type=\"submit\"\n          >\n            {t('common:save')}\n          </Button>\n        </Group>\n      </form>\n    </Box>\n  );\n};\n"
  },
  {
    "path": "src/components/Manage/User/Edit/ManageUserDanger.tsx",
    "content": "import { Box, Button, Checkbox, Group, LoadingOverlay, PasswordInput, Title } from '@mantine/core';\nimport { useForm, zodResolver } from '@mantine/form';\nimport { IconTextSize, IconTrash } from '@tabler/icons-react';\nimport { useTranslation } from 'next-i18next';\nimport { z } from 'zod';\nimport { api } from '~/utils/api';\n\nexport const ManageUserDanger = ({\n  userId,\n  username,\n}: {\n  userId: string;\n  username: string | null;\n}) => {\n  const form = useForm({\n    initialValues: {\n      username: '',\n      confirm: false,\n    },\n    validate: zodResolver(\n      z.object({\n        username: z.literal(username),\n        confirm: z.literal(true),\n      })\n    ),\n    validateInputOnBlur: true,\n    validateInputOnChange: true,\n  });\n\n  const apiUtils = api.useUtils();\n\n  const { mutate, isLoading } = api.user.deleteUser.useMutation({\n    onSuccess: () => {\n      window.location.href = '/manage/users';\n    },\n    onSettled: () => {\n      void apiUtils.user.details.invalidate();\n      form.reset();\n    },\n  });\n\n  const { t } = useTranslation(['manage/users/edit', 'common']);\n\n  const handleSubmit = () => {\n    mutate({\n      id: userId,\n    });\n  };\n\n  return (\n    <Box maw={500}>\n      <LoadingOverlay visible={isLoading} />\n      <Title order={3}>{t('sections.deletion.title')}</Title>\n      <form onSubmit={form.onSubmit(handleSubmit)}>\n        <PasswordInput\n          icon={<IconTextSize size=\"1rem\" />}\n          label={t('sections.deletion.inputs.confirmUsername.label')}\n          description={t('sections.deletion.inputs.confirmUsername.description')}\n          mb=\"md\"\n          withAsterisk\n          {...form.getInputProps('username')}\n        />\n        <Checkbox\n          label={t('sections.deletion.inputs.confirm.label')}\n          description={t('sections.deletion.inputs.confirm.description')}\n          {...form.getInputProps('confirm')}\n        />\n        <Group position=\"right\" mt=\"md\">\n          <Button\n            disabled={!form.isDirty() || !form.isValid()}\n            leftIcon={<IconTrash size=\"1rem\" />}\n            loading={isLoading}\n            color=\"red\"\n            variant=\"light\"\n            type=\"submit\"\n          >\n            {t('common:delete')}\n          </Button>\n        </Group>\n      </form>\n    </Box>\n  );\n};\n"
  },
  {
    "path": "src/components/Manage/User/Edit/ManageUserRoles.tsx",
    "content": "import { Badge, Box, Button, Group, Text, Title } from '@mantine/core';\nimport { openRoleChangeModal } from '~/components/Manage/User/change-user-role.modal';\nimport { IconUserDown, IconUserUp } from '@tabler/icons-react';\nimport { useTranslation } from 'next-i18next';\nimport { useSession } from 'next-auth/react';\nimport { createSelectSchema } from 'drizzle-zod';\nimport { users } from '~/server/db/schema';\nimport { z } from 'zod';\n\nconst userWithoutSecrets = createSelectSchema(users).omit({\n  password: true,\n  salt: true,\n});\n\nexport const ManageUserRoles = ({ user }: {\n  user: z.infer<typeof userWithoutSecrets>\n}) => {\n  const { t } = useTranslation(['manage/users/edit', 'manage/users']);\n  const { data: sessionData } = useSession();\n\n  return (\n    <Box maw={500}>\n      <Title order={3}>\n        {t('sections.roles.title')}\n      </Title>\n\n      <Group mb={'md'}>\n        <Text>{t('sections.roles.currentRole')}</Text>\n        {user.isOwner ? (<Badge>{t('sections.roles.badges.owner')}</Badge>) : user.isAdmin ? (\n          <Badge>{t('sections.roles.badges.admin')}</Badge>) : (<Badge>{t('sections.roles.badges.normal')}</Badge>)}\n      </Group>\n\n      {user.isAdmin ? (\n        <Button\n          leftIcon={<IconUserDown size=\"1rem\" />}\n          disabled={user.id === sessionData?.user?.id || user.isOwner}\n          onClick={() => {\n            openRoleChangeModal({\n              name: user.name as string,\n              id: user.id,\n              type: 'demote',\n            });\n          }}\n        >\n          {t('manage/users:tooltips.demoteAdmin')}\n        </Button>\n      ) : (\n        <Button\n          leftIcon={<IconUserUp size=\"1rem\" />}\n          onClick={() => {\n            openRoleChangeModal({\n              name: user.name as string,\n              id: user.id,\n              type: 'promote',\n            });\n          }}\n        >\n\n          {t('manage/users:tooltips.promoteToAdmin')}\n        </Button>\n      )}\n    </Box>\n  );\n};"
  },
  {
    "path": "src/components/Manage/User/Edit/ManageUserSecurityForm.tsx",
    "content": "import { Box, Button, Checkbox, Group, LoadingOverlay, PasswordInput, Title } from '@mantine/core';\nimport { useForm, zodResolver } from '@mantine/form';\nimport { useInputState } from '@mantine/hooks';\nimport { IconAlertTriangle, IconPassword } from '@tabler/icons-react';\nimport { useTranslation } from 'next-i18next';\nimport { z } from 'zod';\nimport { api } from '~/utils/api';\n\nexport const ManageUserSecurityForm = ({ userId }: { userId: string }) => {\n  const form = useForm({\n    initialValues: {\n      password: '',\n      terminateExistingSessions: false,\n      confirm: false,\n    },\n    validate: zodResolver(\n      z.object({\n        password: z.string().min(3),\n        terminateExistingSessions: z.boolean(),\n        confirm: z.literal(true),\n      })\n    ),\n    validateInputOnBlur: true,\n    validateInputOnChange: true,\n  });\n\n  const [checked, setChecked] = useInputState(false);\n\n  const { t } = useTranslation(['manage/users/edit', 'common']);\n\n  const apiUtils = api.useUtils();\n\n  const { mutate, isLoading } = api.user.updatePassword.useMutation({\n    onSettled: () => {\n      void apiUtils.user.details.invalidate();\n      form.reset();\n    },\n  });\n\n  const handleSubmit = (values: { password: string; terminateExistingSessions: boolean }) => {\n    mutate({\n      newPassword: values.password,\n      terminateExistingSessions: values.terminateExistingSessions,\n      userId: userId,\n    });\n    setChecked(false);\n  };\n\n  return (\n    <Box maw={500}>\n      <LoadingOverlay visible={isLoading} />\n      <Title order={3}>{t('sections.security.title')}</Title>\n      <form onSubmit={form.onSubmit(handleSubmit)}>\n        <PasswordInput\n          icon={<IconPassword size=\"1rem\" />}\n          label={t('sections.security.inputs.password.label')}\n          mb=\"md\"\n          withAsterisk\n          {...form.getInputProps('password')}\n        />\n        <Checkbox\n          label={t('sections.security.inputs.terminateExistingSessions.label')}\n          description={t('sections.security.inputs.terminateExistingSessions.description')}\n          mb=\"md\"\n          {...form.getInputProps('terminateExistingSessions')}\n        />\n        <Checkbox\n          label={t('sections.security.inputs.confirm.label')}\n          description={t('sections.security.inputs.confirm.description')}\n          checked={checked}\n          onClick={(event) => {\n            setChecked(event.currentTarget.checked);\n          }}\n          {...form.getInputProps('confirm')}\n        />\n        <Group position=\"right\" mt=\"md\">\n          <Button\n            disabled={!form.isDirty() || !form.isValid()}\n            leftIcon={<IconAlertTriangle size=\"1rem\" />}\n            loading={isLoading}\n            color=\"red\"\n            variant=\"light\"\n            type=\"submit\"\n          >\n            {t('common:save')}\n          </Button>\n        </Group>\n      </form>\n    </Box>\n  );\n};\n"
  },
  {
    "path": "src/components/Manage/User/Invite/copy-invite.modal.tsx",
    "content": "import { Button, CopyButton, Mark, Stack, Text } from '@mantine/core';\nimport { ContextModalProps, modals } from '@mantine/modals';\nimport { Trans, useTranslation } from 'next-i18next';\nimport Link from 'next/link';\nimport { useRouter } from 'next/router';\nimport { RouterOutputs } from '~/utils/api';\n\ntype InnerProps = RouterOutputs['invites']['create'];\n\nexport const CopyInviteModal = ({ id, innerProps }: ContextModalProps<InnerProps>) => {\n  const { t } = useTranslation('manage/users/invites');\n  const inviteUrl = useInviteUrl(innerProps.id, innerProps.token);\n\n  return (\n    <Stack>\n      <Text>\n        <Trans\n          i18nKey=\"manage/users/invites:modals.copy.description\"\n          components={{\n            b: <b />,\n          }}\n        />\n      </Text>\n\n      <Link href={`/auth/invite/${innerProps.id}?token=${innerProps.token}`}>\n        {t('modals.copy.invitationLink')}\n      </Link>\n\n      <Stack spacing=\"xs\">\n        <Text weight=\"bold\">{t('modals.copy.details.id')}:</Text>\n        <Mark style={{ borderRadius: 4 }} color=\"gray\" px={5}>\n          {innerProps.id}\n        </Mark>\n\n        <Text weight=\"bold\">{t('modals.copy.details.token')}:</Text>\n        <Mark style={{ borderRadius: 4 }} color=\"gray\" px={5}>\n          {innerProps.token}\n        </Mark>\n      </Stack>\n\n      <CopyButton value={inviteUrl}>\n        {({ copy }) => (\n          <Button\n            onClick={() => {\n              copy();\n              modals.close(id);\n            }}\n            variant=\"default\"\n            fullWidth\n          >\n            {t('modals.copy.button.close')}\n          </Button>\n        )}\n      </CopyButton>\n    </Stack>\n  );\n};\n\nconst useInviteUrl = (id: string, token: string) => {\n  const router = useRouter();\n\n  return `${window.location.href.replace(router.pathname, `/auth/invite/${id}?token=${token}`)}`;\n};\n\nexport const openCopyInviteModal = (data: InnerProps) => {\n  modals.openContextModal({\n    modal: 'copyInviteModal',\n    title: <Trans i18nKey=\"manage/users/invites:modals.copy.title\" />,\n    innerProps: data,\n  });\n};\n"
  },
  {
    "path": "src/components/Manage/User/Invite/create-invite.modal.tsx",
    "content": "import { Button, Group, Stack, Text } from '@mantine/core';\nimport { DateTimePicker } from '@mantine/dates';\nimport { useForm } from '@mantine/form';\nimport { ContextModalProps, modals } from '@mantine/modals';\nimport dayjs from 'dayjs';\nimport { Trans, useTranslation } from 'next-i18next';\nimport { api } from '~/utils/api';\nimport { useI18nZodResolver } from '~/utils/i18n-zod-resolver';\nimport { createInviteSchema } from '~/validations/invite';\n\nimport { openCopyInviteModal } from './copy-invite.modal';\n\nexport const CreateInviteModal = ({ id }: ContextModalProps<{}>) => {\n  const { t } = useTranslation('manage/users/invites');\n  const utils = api.useContext();\n  const { isLoading, mutateAsync } = api.invites.create.useMutation({\n    onSuccess: async (data) => {\n      await utils.invites.all.invalidate();\n      modals.close(id);\n\n      openCopyInviteModal(data);\n    },\n  });\n\n  const { i18nZodResolver } = useI18nZodResolver();\n\n  const minDate = dayjs().add(5, 'minutes').toDate();\n  const maxDate = dayjs().add(6, 'months').toDate();\n\n  const form = useForm({\n    initialValues: {\n      expirationDate: dayjs().add(7, 'days').toDate(),\n    },\n    validate: i18nZodResolver(createInviteSchema),\n  });\n\n  return (\n    <Stack>\n      <Text>{t('modals.create.description')}</Text>\n\n      <DateTimePicker\n        popoverProps={{ withinPortal: true }}\n        minDate={minDate}\n        maxDate={maxDate}\n        withAsterisk\n        valueFormat=\"DD MMM YYYY HH:mm\"\n        label={t('modals.create.form.expires')}\n        variant=\"filled\"\n        {...form.getInputProps('expirationDate')}\n      />\n\n      <Group grow>\n        <Button\n          onClick={() => {\n            modals.close(id);\n          }}\n          variant=\"light\"\n          color=\"gray\"\n        >\n          {t('common:cancel')}\n        </Button>\n        <Button\n          onClick={async () => {\n            await mutateAsync({\n              expiration: form.values.expirationDate,\n            });\n          }}\n          disabled={isLoading}\n          variant=\"light\"\n          color=\"green\"\n        >\n          {t('modals.create.form.submit')}\n        </Button>\n      </Group>\n    </Stack>\n  );\n};\n\nexport const openCreateInviteModal = () => {\n  modals.openContextModal({\n    modal: 'createInviteModal',\n    title: <Trans i18nKey=\"manage/users/invites:modals.create.title\" />,\n    innerProps: {},\n  });\n};\n"
  },
  {
    "path": "src/components/Manage/User/Invite/delete-invite.modal.tsx",
    "content": "import { Button, Group, Stack, Text } from '@mantine/core';\nimport { ContextModalProps, modals } from '@mantine/modals';\nimport { useTranslation } from 'next-i18next';\nimport { api } from '~/utils/api';\n\nexport const DeleteInviteModal = ({ id, innerProps }: ContextModalProps<{ tokenId: string }>) => {\n  const { t } = useTranslation('manage/users/invites');\n  const utils = api.useContext();\n  const { isLoading, mutateAsync: deleteAsync } = api.invites.delete.useMutation({\n    onSuccess: async () => {\n      await utils.invites.all.invalidate();\n      modals.close(id);\n    },\n  });\n  return (\n    <Stack>\n      <Text>{t('modals.delete.description')}</Text>\n\n      <Group grow>\n        <Button\n          onClick={() => {\n            modals.close(id);\n          }}\n          variant=\"light\"\n          color=\"gray\"\n        >\n          {t('common:cancel')}\n        </Button>\n        <Button\n          onClick={async () => {\n            await deleteAsync({\n              id: innerProps.tokenId,\n            });\n          }}\n          disabled={isLoading}\n          variant=\"light\"\n          color=\"red\"\n        >\n          {t('common:delete')}\n        </Button>\n      </Group>\n    </Stack>\n  );\n};\n"
  },
  {
    "path": "src/components/Manage/User/change-user-role.modal.tsx",
    "content": "import { Button, Group, Stack, Text } from '@mantine/core';\nimport { ContextModalProps, modals } from '@mantine/modals';\nimport { Trans, useTranslation } from 'next-i18next';\nimport { api } from '~/utils/api';\n\ntype InnerProps = { id: string; name: string; type: 'promote' | 'demote' };\n\nexport const ChangeUserRoleModal = ({ id, innerProps }: ContextModalProps<InnerProps>) => {\n  const { t } = useTranslation('manage/users');\n  const utils = api.useContext();\n  const { isLoading, mutateAsync } = api.user.changeRole.useMutation({\n    onSuccess: async () => {\n      await utils.user.all.invalidate();\n      await utils.user.details.invalidate();\n      modals.close(id);\n    },\n  });\n  return (\n    <Stack>\n      <Text>{t(`modals.change-role.${innerProps.type}.text`, innerProps)} </Text>\n\n      <Group grow>\n        <Button\n          onClick={() => {\n            modals.close(id);\n          }}\n          variant=\"light\"\n          color=\"gray\"\n        >\n          {t('common:cancel')}\n        </Button>\n        <Button\n          onClick={async () => {\n            await mutateAsync(innerProps);\n          }}\n          disabled={isLoading}\n          variant=\"light\"\n          color=\"red\"\n        >\n          {t('modals.change-role.confirm')}\n        </Button>\n      </Group>\n    </Stack>\n  );\n};\n\nexport const openRoleChangeModal = (user: InnerProps) => {\n  modals.openContextModal({\n    modal: 'changeUserRoleModal',\n    title: (\n      <Trans\n        i18nKey={`manage/users:modals.change-role.${user.type}.title`}\n        values={{ name: user.name }}\n      />\n    ),\n    innerProps: user,\n  });\n};\n"
  },
  {
    "path": "src/components/Manage/User/delete-user.modal.tsx",
    "content": "import { Button, Group, Stack, Text } from '@mantine/core';\nimport { ContextModalProps, modals } from '@mantine/modals';\nimport { Trans, useTranslation } from 'next-i18next';\nimport { api } from '~/utils/api';\n\ntype InnerProps = { id: string; name: string };\n\nexport const DeleteUserModal = ({ id, innerProps }: ContextModalProps<InnerProps>) => {\n  const { t } = useTranslation('manage/users');\n  const utils = api.useContext();\n  const { isLoading, mutateAsync } = api.user.deleteUser.useMutation({\n    onSuccess: async () => {\n      await utils.user.all.invalidate();\n      modals.close(id);\n    },\n  });\n  return (\n    <Stack>\n      <Text>{t('modals.delete.text', innerProps)} </Text>\n\n      <Group grow>\n        <Button\n          onClick={() => {\n            modals.close(id);\n          }}\n          variant=\"light\"\n          color=\"gray\"\n        >\n          {t('common:cancel')}\n        </Button>\n        <Button\n          onClick={async () => {\n            await mutateAsync(innerProps);\n          }}\n          disabled={isLoading}\n          variant=\"light\"\n          color=\"red\"\n        >\n          {t('common:delete')}\n        </Button>\n      </Group>\n    </Stack>\n  );\n};\n\nexport const openDeleteUserModal = (user: InnerProps) => {\n  modals.openContextModal({\n    modal: 'deleteUserModal',\n    title: <Trans i18nKey=\"manage/users:modals.delete.title\" values={{ name: user.name }} />,\n    innerProps: user,\n  });\n};\n"
  },
  {
    "path": "src/components/Onboarding/common-wrapper.tsx",
    "content": "import { Card } from '@mantine/core';\nimport { ReactNode } from 'react';\n\nexport const OnboardingStepWrapper = ({ children }: { children: ReactNode }) => {\n  return (\n    <Card shadow=\"lg\" maw={800} w=\"100%\" mx=\"auto\" display=\"block\" withBorder>\n      {children}\n    </Card>\n  );\n};\n"
  },
  {
    "path": "src/components/Onboarding/database-not-writeable.tsx",
    "content": "import { Center, Code, List, Stack, Text, Title } from '@mantine/core';\nimport Head from 'next/head';\n\nexport const DatabaseNotWriteable = ({\n  stringifiedError,\n  errorMessage,\n}: {\n  stringifiedError: string | undefined;\n  errorMessage: string | undefined;\n}) => {\n  return (\n    <>\n      <Head>\n        <title>Onboard - Error • Homarr</title>\n      </Head>\n\n      <Center h=\"100%\">\n        <Stack align=\"center\" p=\"lg\">\n          <Title order={1} weight={800} size=\"3rem\" opacity={0.8}>\n            Critical error while starting Homarr\n          </Title>\n          <Text size=\"lg\" mb={40}>\n            We detected that Homarr is unable to write to the database. Please troubleshoot using\n            the following steps:\n          </Text>\n          <List>\n            <List.Item>\n              Ensure that you mounted the path <code>/data</code> to a writeable location with\n              enough disk space. For this, you must add the following mounting point to your docker\n              compose: <Code block>{'      - <your-path>/data:/data'}</Code>\n            </List.Item>\n            <List.Item>\n              Ensure that you followed the installation instructions at{' '}\n              <a href=\"https://homarr.dev/docs/getting-started/installation\">\n                https://homarr.dev/docs/getting-started/installation\n              </a>\n            </List.Item>\n          </List>\n          <Code block>{stringifiedError}</Code>\n\n          {errorMessage && <Code block>{errorMessage}</Code>}\n        </Stack>\n      </Center>\n    </>\n  );\n};\n"
  },
  {
    "path": "src/components/Onboarding/onboarding-steps.tsx",
    "content": "import { Stack, Stepper } from '@mantine/core';\nimport { useState } from 'react';\n\nimport { StepCreateAccount } from './step-create-account';\nimport { StepOnboardingFinished } from './step-onboarding-finished';\nimport { StepUpdatePathMappings } from './step-update-path-mappings';\nimport { api } from '~/utils/api';\n\nexport const OnboardingSteps = ({ isUpdate }: { isUpdate: boolean }) => {\n  const maximumSteps = isUpdate ? 3 : 2;\n\n  const [currentStep, setCurrentStep] = useState(0);\n\n  const nextStep = () => setCurrentStep((current) => {\n    const newValue = (current < maximumSteps ? current + 1 : current);\n\n    if (currentStep + 1 >= maximumSteps) {\n      onFinishOnboarding();\n    }\n\n    return newValue;\n  });\n\n  const prevStep = () => setCurrentStep((current) => (current > 0 ? current - 1 : current));\n\n  const { mutate: mutateConfigSchemaVersion } = api.config.updateConfigurationSchemaToLatest.useMutation();\n\n  const onFinishOnboarding = () => {\n    mutateConfigSchemaVersion();\n  };\n\n  return (\n    <Stack p=\"lg\">\n      <Stepper\n        allowNextStepsSelect={false}\n        active={currentStep}\n        onStepClick={setCurrentStep}\n        breakpoint=\"sm\"\n      >\n        {isUpdate && (\n          <Stepper.Step\n            label=\"Update your installation\"\n            description=\"Adjust path mappings and variables\"\n          >\n            <StepUpdatePathMappings next={nextStep} />\n          </Stepper.Step>\n        )}\n        <Stepper.Step label=\"Your account\" description=\"Create an account\">\n          <StepCreateAccount next={nextStep} previous={prevStep} />\n        </Stepper.Step>\n        <Stepper.Completed>\n          <StepOnboardingFinished />\n        </Stepper.Completed>\n      </Stepper>\n    </Stack>\n  );\n};\n"
  },
  {
    "path": "src/components/Onboarding/step-create-account.tsx",
    "content": "import { Button, Card, Group, PasswordInput, Stack, Text, TextInput, Title } from '@mantine/core';\nimport { useForm } from '@mantine/form';\nimport { IconArrowLeft, IconArrowRight } from '@tabler/icons-react';\nimport { signIn } from 'next-auth/react';\nimport { useState } from 'react';\nimport { z } from 'zod';\nimport { api } from '~/utils/api';\nimport { useI18nZodResolver } from '~/utils/i18n-zod-resolver';\nimport { signUpFormSchema } from '~/validations/user';\n\nimport { PasswordRequirements } from '../Password/password-requirements';\nimport { OnboardingStepWrapper } from './common-wrapper';\n\nexport const StepCreateAccount = ({\n  previous,\n  next,\n}: {\n  previous: () => void;\n  next: () => void;\n}) => {\n  const [isSigninIn, setIsSigninIn] = useState(false);\n  const { mutateAsync } = api.user.createOwnerAccount.useMutation();\n  const { i18nZodResolver } = useI18nZodResolver();\n\n  const form = useForm<z.infer<typeof signUpFormSchema>>({\n    initialValues: {\n      password: '',\n      username: '',\n      passwordConfirmation: '',\n    },\n    validate: i18nZodResolver(signUpFormSchema),\n    validateInputOnBlur: true,\n  });\n  const handleSubmit = (values: z.infer<typeof signUpFormSchema>) => {\n    setIsSigninIn(true);\n    void mutateAsync(values, {\n      onSuccess: () => {\n        signIn('credentials', {\n          redirect: false,\n          name: values.username,\n          password: values.password,\n          callbackUrl: '/',\n        }).then((response) => {\n          if (!response?.ok) {\n            setIsSigninIn(false);\n            return;\n          }\n          next();\n        });\n      },\n    });\n  };\n\n  return (\n    <OnboardingStepWrapper>\n      <Title order={2} align=\"center\" mb=\"md\">\n        Create your administrator account\n      </Title>\n      <Text>\n        Your administrator account <b>must be secure</b>, that's why we have so many rules\n        surrounding it.\n        <br />\n        Try not to make it adminadmin this time...\n        <br />\n        Note: these password requirements <b>are not forced</b>, they are just recommendations.\n      </Text>\n      <form onSubmit={form.onSubmit(handleSubmit)}>\n        <Stack>\n          <TextInput\n            size=\"md\"\n            w=\"100%\"\n            label=\"Username\"\n            variant=\"filled\"\n            withAsterisk\n            {...form.getInputProps('username')}\n          />\n\n          <PasswordInput\n            size=\"md\"\n            w=\"100%\"\n            label=\"Password\"\n            variant=\"filled\"\n            withAsterisk\n            {...form.getInputProps('password')}\n          />\n\n          <Card mb=\"lg\" withBorder>\n            <PasswordRequirements value={form.values.password} />\n          </Card>\n\n          <PasswordInput\n            size=\"md\"\n            w=\"100%\"\n            label=\"Confirm password\"\n            variant=\"filled\"\n            withAsterisk\n            {...form.getInputProps('passwordConfirmation')}\n          />\n          <Group grow>\n            <Button onClick={previous} leftIcon={<IconArrowLeft size=\"0.9rem\" />} variant=\"default\">\n              Back\n            </Button>\n            <Button\n              rightIcon={<IconArrowRight size=\"0.9rem\" />}\n              disabled={!form.isValid()}\n              type=\"submit\"\n              loading={isSigninIn}\n            >\n              Continue\n            </Button>\n          </Group>\n        </Stack>\n      </form>\n    </OnboardingStepWrapper>\n  );\n};\n"
  },
  {
    "path": "src/components/Onboarding/step-onboarding-finished.tsx",
    "content": "import { Divider, NavLink, Stack, Text, Title, createStyles } from '@mantine/core';\nimport {\n  IconChevronRight,\n  IconDashboard,\n  IconExternalLink,\n  IconFileText,\n  IconManualGearbox,\n} from '@tabler/icons-react';\nimport Image from 'next/image';\nimport Link from 'next/link';\n\nimport { OnboardingStepWrapper } from './common-wrapper';\n\nexport const StepOnboardingFinished = () => {\n  const { classes } = useStyles();\n  return (\n    <OnboardingStepWrapper>\n      <Stack align=\"center\">\n        <Image src=\"/imgs/logo/logo.svg\" alt=\"\" width={50} height={50} />\n        <Title order={2} align=\"center\">\n          Congratulations, you've set Homarr up!\n        </Title>\n        <Text>Awesome! What do you want to do next?</Text>\n\n        <Stack>\n          <Text>\n            We <b>highly recommend you</b> to take a look at the documentation before starting to\n            use Homarr if you've never used it before.\n          </Text>\n          <NavLink\n            component={Link}\n            href=\"https://homarr.dev/docs/getting-started/after-the-installation\"\n            target=\"_blank\"\n            rightSection={<IconExternalLink size=\"0.8rem\" stroke={1.5} />}\n            className={classes.link}\n            icon={<IconFileText />}\n            label=\"Check out the documentation\"\n            variant=\"light\"\n            active\n          />\n          <Divider />\n          <NavLink\n            component={Link}\n            href=\"/b\"\n            rightSection={<IconChevronRight size=\"0.8rem\" stroke={1.5} />}\n            className={classes.link}\n            icon={<IconDashboard />}\n            label=\"Go to your board\"\n            variant=\"light\"\n            active\n          />\n          <NavLink\n            component={Link}\n            href=\"/manage\"\n            rightSection={<IconChevronRight size=\"0.8rem\" stroke={1.5} />}\n            className={classes.link}\n            icon={<IconManualGearbox />}\n            label=\"Go to the management dashboard\"\n            variant=\"light\"\n            active\n          />\n        </Stack>\n      </Stack>\n    </OnboardingStepWrapper>\n  );\n};\n\nconst useStyles = createStyles((theme) => ({\n  link: {\n    borderRadius: '0.4rem',\n  },\n}));\n"
  },
  {
    "path": "src/components/Onboarding/step-update-path-mappings.tsx",
    "content": "import { Box, Button, Code, Group, List, Space, Tabs, TabsValue, Text, Title } from '@mantine/core';\nimport { Prism } from '@mantine/prism';\nimport {\n  IconArrowRight,\n  IconBrandDebian,\n  IconBrandDocker,\n  IconInfoSquareRounded,\n} from '@tabler/icons-react';\nimport Image from 'next/image';\nimport { useState } from 'react';\n\nimport { OnboardingStepWrapper } from './common-wrapper';\n\nconst dockerRunCommand = `docker run  \\\\\n--name homarr \\\\\n--restart unless-stopped \\\\\n-p 7575:7575 \\\\\n-v your-path/homarr/configs:/app/data/configs \\\\\n-v your-path/homarr/data:/data \\\\\n-v your-path/homarr/icons:/app/public/icons \\\\\n-d ghcr.io/ajnart/homarr:latest`;\n\nconst dockerComposeCommand = `version: '3'\n#---------------------------------------------------------------------#\n#     Homarr - A simple, yet powerful dashboard for your server.     #\n#---------------------------------------------------------------------#\nservices:\n  homarr:\n    container_name: homarr\n    image: ghcr.io/ajnart/homarr:latest\n    restart: unless-stopped\n    volumes:\n      - ./homarr/configs:/app/data/configs\n      - ./homarr/data:/data\n      - ./homarr/icons:/app/public/icons\n    ports:\n      - '7575:7575'`;\n\nconst added = { color: 'green', label: '+' };\n\nexport const StepUpdatePathMappings = ({ next }: { next: () => void }) => {\n  const [selectedTab, setSelectedTab] = useState<TabsValue>('standard_docker');\n  return (\n    <OnboardingStepWrapper>\n      <Title order={2} align=\"center\" mb=\"md\">\n        Update path mappings\n      </Title>\n      <Text color=\"dimmed\">\n        Homarr has updated the location of the saved data. We detected, that your instance might\n        need an update to function as expected. It is recommended, that you take a backup of your\n        .json configuration file on the file system and copy it, in case something goes wrong.\n      </Text>\n\n      <Space h={15} />\n      <Tabs value={selectedTab} onTabChange={(tab) => setSelectedTab(tab)} mt=\"xs\">\n        <Tabs.List position=\"center\">\n          <Tabs.Tab value=\"standard_docker\" icon={<IconBrandDocker size={16} />}>\n            Docker\n          </Tabs.Tab>\n          <Tabs.Tab value=\"docker_compose\" icon={<IconBrandDocker size={16} />}>\n            Docker Compose\n          </Tabs.Tab>\n          <Tabs.Tab value=\"standalone\" icon={<IconBrandDebian size={16} />}>\n            Standalone Linux / Windows\n          </Tabs.Tab>\n          <Tabs.Tab\n            value=\"unraid\"\n            icon={<Image width={16} height={16} src=\"/imgs/app-icons/unraid-alt.svg\" alt=\"\" />}\n          >\n            Unraid\n          </Tabs.Tab>\n          <Tabs.Tab value=\"others\" icon={<IconInfoSquareRounded size={16} />}>\n            Others\n          </Tabs.Tab>\n        </Tabs.List>\n\n        <Tabs.Panel value=\"standard_docker\" p=\"xs\">\n          <List type=\"ordered\">\n            <List.Item>\n              <Text>\n                <b>Back up your configuration</b>. In case you didn't mount your configuration\n                correctly, you could risk loosing your dashboard. To back up,\n                <b>go on your file system and copy the directory, containing your </b>\n                <Code>default.json</Code> to your local machine.\n              </Text>\n            </List.Item>\n            <List.Item>\n              <Text>\n                Before you continue, check that you still have the command, that you set up Homarr\n                with. Otherwise, your configuration might not be loaded correctly or icons are\n                missing.\n              </Text>\n            </List.Item>\n            <List.Item>\n              <Text>\n                Run <Code>docker rm homarr</Code>, where <Code>homarr</Code> indicates the name of\n                your container\n              </Text>\n            </List.Item>\n            <List.Item>\n              <Text>\n                Run <Code>docker run ...</Code> again, that you used to create the Homarr container.\n                Note, that you need to add a new line:\n              </Text>\n              <Prism highlightLines={{ 6: added }} language=\"bash\" withLineNumbers>\n                {dockerRunCommand}\n              </Prism>\n            </List.Item>\n            <List.Item>Refresh this page and click on \"continue\"</List.Item>\n          </List>\n        </Tabs.Panel>\n\n        <Tabs.Panel value=\"docker_compose\" p=\"xs\">\n          <List type=\"ordered\">\n            <List.Item>\n              <Text>\n                <b>Back up your configuration</b>. In case you didn't mount your configuration\n                correctly, you could risk loosing your dashboard. To back up,\n                <b>go on your file system and copy the directory, containing your </b>\n                <Code>default.json</Code> to your local machine.\n              </Text>\n            </List.Item>\n            <List.Item>\n              <Text>\n                Navigate to the directory, where the <Code>docker-compose.yml</Code> for Homarr is\n                located.\n              </Text>\n            </List.Item>\n            <List.Item>\n              <Text>\n                Run <Code>docker compose down</Code>\n              </Text>\n            </List.Item>\n            <List.Item>\n              <Text>\n                Edit <Code>docker-compose.yml</Code> using text editor. Use Notepad or VSC on GUI\n                based systems. Use <Code>nano</Code> or <Code>vim</Code> on terminal systems.\n              </Text>\n              <Prism highlightLines={{ 12: added }} language=\"bash\" withLineNumbers>\n                {dockerComposeCommand}\n              </Prism>\n            </List.Item>\n            <List.Item>\n              Run <Code>docker compose up</Code>.\n            </List.Item>\n            <List.Item>Refresh this page and click on \"continue\"</List.Item>\n          </List>\n        </Tabs.Panel>\n\n        <Tabs.Panel value=\"standalone\" p=\"xs\">\n          <Text>\n            You're lucky. For installation <b>without Docker</b> on Windows and Linux, there are no\n            additional steps required. However, be advised that your backups should start to include\n            the files located at <Code>/database</Code> too, if you run automatic backups.\n          </Text>\n        </Tabs.Panel>\n\n        <Tabs.Panel value=\"unraid\" p=\"xs\">\n          <List type=\"ordered\">\n            <List.Item>Click on your Homarr application and click \"Edit\"</List.Item>\n            <List.Item>\n              Scroll down and click on the link \"Add another path, port, variable or device\"\n            </List.Item>\n            <List.Item>\n              After the new modal has opened, make sure that \"Path\" has been selected at the top\n            </List.Item>\n            <List.Item>\n              In the container path, enter <Code>/data</Code>\n            </List.Item>\n            <List.Item>\n              In the host path, enter a new path on your host system. Choose a similar path, but the\n              innermost directory should be different, than your existing mounting points (eg.{' '}\n              <Code>/mnt/user/appdata/homarr/data</Code>)\n            </List.Item>\n            <List.Item>Click \"Apply\" and wait for the container to be restarted.</List.Item>\n            <List.Item>Refresh this page and click on \"continue\"</List.Item>\n          </List>\n        </Tabs.Panel>\n\n        <Tabs.Panel value=\"others\" p=\"xs\">\n          <Text>\n            We are sadly not able to include upgrade guides for all kind of systems. If your system\n            was not listed, you should mount this new mounting point in your container:\n          </Text>\n          <Code>/data</Code>\n        </Tabs.Panel>\n      </Tabs>\n\n      {selectedTab ? (\n        <Group align=\"end\" mt=\"lg\">\n          <Button\n            onClick={next}\n            rightIcon={<IconArrowRight size=\"0.9rem\" />}\n            color=\"green\"\n            fullWidth\n          >\n            Continue\n          </Button>\n        </Group>\n      ) : (\n        <Box w=\"100%\" p=\"xl\">\n          <Text color=\"dimmed\" align=\"center\" size=\"xs\">\n            Please select your installation method\n          </Text>\n        </Box>\n      )}\n    </OnboardingStepWrapper>\n  );\n};\n"
  },
  {
    "path": "src/components/Password/password-requirement.tsx",
    "content": "import { Box, Text } from '@mantine/core';\nimport { IconCheck, IconX } from '@tabler/icons-react';\nimport { useTranslation } from 'next-i18next';\nimport { minPasswordLength } from '~/validations/user';\n\nexport const PasswordRequirement = ({ meets, label }: { meets: boolean; label: string }) => {\n  const { t } = useTranslation('password-requirements');\n\n  return (\n    <Text\n      color={meets ? 'teal' : 'red'}\n      sx={{ display: 'flex', alignItems: 'center' }}\n      mt={7}\n      size=\"sm\"\n    >\n      {meets ? <IconCheck size=\"0.9rem\" /> : <IconX size=\"0.9rem\" />}\n      <Box ml={10}>\n        {t(`${label}`, {\n          count: minPasswordLength,\n        })}\n      </Box>\n    </Text>\n  );\n};\n"
  },
  {
    "path": "src/components/Password/password-requirements.tsx",
    "content": "import { Progress } from '@mantine/core';\nimport { minPasswordLength } from '~/validations/user';\n\nimport { PasswordRequirement } from './password-requirement';\n\nconst requirements = [\n  { re: /[0-9]/, label: 'number' },\n  { re: /[a-z]/, label: 'lowercase' },\n  { re: /[A-Z]/, label: 'uppercase' },\n  { re: /[$&+,:;=?@#|'<>.^*()%!-]/, label: 'special' },\n];\n\nfunction getStrength(password: string) {\n  let score = 0;\n  const goal = requirements.length + 1;\n\n  requirements.forEach((requirement) => {\n    if (requirement.re.test(password)) {\n      score += 1;\n    }\n  });\n  if (password.length >= minPasswordLength) {\n    score += 1;\n  }\n  return (score / goal) * 100;\n}\n\nexport const PasswordRequirements = ({ value }: { value: string }) => {\n  const checks = requirements.map((requirement, index) => (\n    <PasswordRequirement key={index} label={requirement.label} meets={requirement.re.test(value)} />\n  ));\n\n  const strength = getStrength(value);\n  const color = strength === 100 ? 'teal' : strength > 50 ? 'yellow' : 'red';\n  return (\n    <>\n      <Progress color={color} value={strength} size={5} mb=\"xs\" />\n      <PasswordRequirement label=\"length\" meets={value.length >= minPasswordLength} />\n      {checks}\n    </>\n  );\n};\n"
  },
  {
    "path": "src/components/ThemeSchemeToggle/ThemeSchemeToggle.tsx",
    "content": "import { ActionIcon, ActionIconProps } from '@mantine/core';\nimport { IconMoonStars, IconSun } from '@tabler/icons-react';\nimport { useColorScheme } from '~/hooks/use-colorscheme';\n\nexport const ThemeSchemeToggle = (props: Partial<ActionIconProps>) => {\n  const { colorScheme, toggleColorScheme } = useColorScheme();\n  const Icon = colorScheme === 'dark' ? IconSun : IconMoonStars;\n\n  return (\n    <ActionIcon size={50} variant=\"outline\" radius=\"md\" onClick={toggleColorScheme} {...props}>\n      <Icon size=\"66%\" />\n    </ActionIcon>\n  );\n};\n"
  },
  {
    "path": "src/components/UpgradeModal/CheckUpgradeModal.tsx",
    "content": "import { Anchor, Button, Group, Image, List, Modal, Text, ThemeIcon, Title } from '@mantine/core';\nimport { IconBrandAbstract, IconLock, IconPlug, IconTestPipe } from '@tabler/icons-react';\nimport { getCookie, setCookie } from 'cookies-next';\nimport localFont from 'next/font/local';\nimport { useState } from 'react';\n\nconst poetsenOne = localFont({ src: '../../../public/PoetsenOne-Regular.ttf' });\n\nexport const CheckUpgradeModal = () => {\n  const [isDismissed, setIsDismissed] = useState(getCookie('dismissed-upgrade-modal'));\n\n  const close = () => {\n    const sevenDays = 7 * 24 * 60 * 60; // 7 days in seconds\n    setCookie('dismissed-upgrade-modal', 'true', {\n      maxAge: sevenDays,\n      path: '/',\n    });\n    setIsDismissed(true);\n  };\n\n  return (\n    <Modal opened={!isDismissed} onClose={close} size={'xl'} radius={'xl'}>\n      <Image src={'/imgs/2340450-2.png'} alt={'Homarr illustration'} width={300} height={'auto'} ml={'auto'}\n             mr={'auto'} />\n      <Title order={2} align={'center'} color={'red'} weight={'bolder'} mb={'lg'} className={poetsenOne.className}>Taking\n        dashboards to<br />the next\n        level 🚀</Title>\n\n      <Text color={'#616161'}>Homarr just got the biggest update ever. It is a complete rewrite. Here's a short summary\n        of it:</Text>\n\n      <List my={'lg'} spacing={3}>\n        <List.Item\n          icon={\n            <ThemeIcon color={'red'} radius={'md'} variant={'light'}>\n              <IconPlug size={'1rem'} />\n            </ThemeIcon>}>\n          <b>Improved integrations</b> system with asynchronous fetching\n          system</List.Item>\n        <List.Item\n          icon={\n            <ThemeIcon color={'red'} radius={'md'} variant={'light'}>\n              <IconLock size={'1rem'} />\n            </ThemeIcon>}>\n          Detailed <b>permission system</b></List.Item>\n        <List.Item\n          icon={\n            <ThemeIcon color={'red'} radius={'md'} variant={'light'}>\n              <IconTestPipe size={'1rem'} />\n            </ThemeIcon>}>\n          Automatic <b>integration testing</b> and <b>centralized management</b> of apps and integrations</List.Item>\n        <List.Item\n          icon={\n            <ThemeIcon color={'red'} radius={'md'} variant={'light'}>\n              <IconBrandAbstract size={'1rem'} />\n            </ThemeIcon>}>\n          <b>Reimagined widgets</b> with better design, better UX and <b>more options</b>.</List.Item>\n      </List>\n\n\n      <Text color={'#616161'}>Since 1.0 is a <Anchor\n        href={'https://homarr.dev/blog/2024/09/23/version-1.0#breaking-changes'} target={'_blank'}>breaking\n        release</Anchor>, we require you to manually upgrade to 1.0 and migrate your data over.\n        Please read the migration guide carefully to avoid data loss. Depending in your installation method, you may\n        need to check the migration guides of them respectively. Please backup your data before attempting the\n        migration. <em>This message will not be displayed for the next 7 days, if you acknowledge and close</em>.</Text>\n\n      <Group mt={'xl'} grow>\n        <Button onClick={close} variant={'subtle'} color={'red'} radius={'xl'}>Acknowledge and close</Button>\n        <Button variant={'light'} color={'green'} component={'a'}\n                href={'https://homarr.dev/blog/2025/01/19/migration-guide-1.0'} target={'_blank'} radius={'xl'}>See 1.0\n          migration\n          guide</Button>\n      </Group>\n\n      <Text mt=\"lg\" size=\"sm\" color=\"dimmed\" align=\"center\">\n        You can permanently disable this message by setting the <b>DISABLE_UPGRADE_MODAL</b> environment variable to <b>true</b>.\n      </Text>\n    </Modal>\n  );\n};"
  },
  {
    "path": "src/components/User/Preferences/AccessibilitySettings.tsx",
    "content": "import { Stack, Switch } from '@mantine/core';\nimport { useTranslation } from 'next-i18next';\nimport { useUserPreferencesFormContext } from '~/pages/user/preferences';\n\nexport const AccessibilitySettings = () => {\n  const { t } = useTranslation('user/preferences');\n\n  const form = useUserPreferencesFormContext();\n\n  return (\n    <Stack>\n      <Switch\n        label={t('accessibility.disablePulse.label')}\n        description={t('accessibility.disablePulse.description')}\n        {...form.getInputProps('disablePingPulse', { type: 'checkbox' })}\n      />\n\n      <Switch\n        label={t('accessibility.replaceIconsWithDots.label')}\n        description={t('accessibility.replaceIconsWithDots.description')}\n        {...form.getInputProps('replaceDotsWithIcons', { type: 'checkbox' })}\n      />\n    </Stack>\n  );\n};\n"
  },
  {
    "path": "src/components/User/Preferences/SearchEngineSelector.tsx",
    "content": "import { Paper, SegmentedControl, Stack, Switch, TextInput } from '@mantine/core';\nimport { useTranslation } from 'next-i18next';\nimport { useMemo } from 'react';\nimport { useUserPreferencesFormContext } from '~/pages/user/preferences';\n\nexport const SearchEngineSettings = () => {\n  const { t } = useTranslation('user/preferences');\n  const form = useUserPreferencesFormContext();\n  const segmentData = useSegmentData();\n  const segmentValue = useMemo(\n    () =>\n      searchEngineOptions.find((x) => x.value === form.values.searchTemplate)?.value ?? 'custom',\n    [form.values.searchTemplate]\n  );\n\n  return (\n    <Stack>\n      <SegmentedControl\n        fullWidth\n        data={segmentData}\n        value={segmentValue}\n        onChange={(v: typeof segmentValue) => {\n          v === 'custom'\n            ? form.setFieldValue('searchTemplate', '')\n            : form.setFieldValue('searchTemplate', v);\n        }}\n      />\n      <Paper p=\"md\" py=\"sm\" mb=\"md\" withBorder>\n        <Stack spacing=\"sm\">\n          <Switch\n            label={t('searchEngine.newTab.label')}\n            {...form.getInputProps('openSearchInNewTab', { type: 'checkbox' })}\n          />\n          <Switch\n            label={t('searchEngine.autoFocus.label')}\n            description={t('searchEngine.autoFocus.description')}\n            {...form.getInputProps('autoFocusSearch', { type: 'checkbox' })}\n          />\n\n          <TextInput\n            label={t('searchEngine.template.label')}\n            description={t('searchEngine.template.description')}\n            inputWrapperOrder={['label', 'input', 'description', 'error']}\n            withAsterisk\n            {...form.getInputProps('searchTemplate')}\n          />\n        </Stack>\n      </Paper>\n    </Stack>\n  );\n};\n\nconst searchEngineOptions = [\n  { label: 'Google', value: 'https://google.com/search?q=%s' },\n  { label: 'DuckDuckGo', value: 'https://duckduckgo.com/?q=%s' },\n  { label: 'Bing', value: 'https://bing.com/search?q=%s' },\n  { value: 'custom' },\n] as const;\n\nconst useSegmentData = () => {\n  const { t } = useTranslation('user/preferences');\n  return searchEngineOptions.map((option) => ({\n    label: option.value === 'custom' ? t('searchEngine.custom') : option.label,\n    value: option.value,\n  }));\n};\n"
  },
  {
    "path": "src/components/layout/Background/FloatingBackground.tsx",
    "content": "import { Box, createStyles, useMantineTheme } from '@mantine/core';\nimport { useMouse } from '@mantine/hooks';\n\nimport { PolkaElement } from './PolkaElement';\n\nexport const FloatingBackground = () => {\n  const { classes } = useStyles();\n  return (\n    <Box className={classes.noOverflow} pos=\"absolute\" w=\"100%\" h=\"100%\" top={0} left={0}>\n      <MouseBackdrop />\n      <Box pos=\"relative\" h=\"100%\">\n        <PolkaElement rotation={95} top={0} left={100} />\n        <PolkaElement rotation={10} top={50} right={20} />\n        <PolkaElement rotation={-4} bottom={20} left={20} />\n        <PolkaElement rotation={-10} bottom={0} right={0} />\n      </Box>\n    </Box>\n  );\n};\n\nconst MouseBackdrop = () => {\n  const { x, y } = useMouse();\n  const radius = 40;\n  return (\n    <Box pos=\"absolute\" top={0} left={0} w=\"100%\" h=\"100%\">\n      <Box\n        sx={(theme) => {\n          const dropColor =\n            theme.colorScheme === 'dark'\n              ? theme.fn.rgba(theme.colors.red[8], 0.05)\n              : theme.fn.rgba(theme.colors.red[2], 0.4);\n          const boxShadow = `0px 0px ${radius}px ${radius}px ${dropColor}`;\n          return {\n            width: 50,\n            height: 50,\n            borderRadius: '5rem',\n            boxShadow: boxShadow,\n            backgroundColor: dropColor,\n          };\n        }}\n        top={y - 25}\n        left={x - 25}\n        pos=\"absolute\"\n      ></Box>\n    </Box>\n  );\n};\n\nconst useStyles = createStyles(() => ({\n  noOverflow: {\n    overflow: 'hidden',\n  },\n}));\n"
  },
  {
    "path": "src/components/layout/Background/PolkaElement.tsx",
    "content": "import { Box } from '@mantine/core';\n\nexport const PolkaElement = ({\n  rotation,\n  left,\n  top,\n  right,\n  bottom,\n}: {\n  rotation: number;\n  top?: number;\n  left?: number;\n  right?: number;\n  bottom?: number;\n}) => {\n  return (\n    <Box\n      style={{\n        transform: `rotate(${rotation}deg)`,\n        pointerEvents: 'none',\n      }}\n      className=\"polka\"\n      pos=\"absolute\"\n      w=\"20%\"\n      h=\"40%\"\n      top={top}\n      right={right}\n      left={left}\n      bottom={bottom}\n    />\n  );\n};\n"
  },
  {
    "path": "src/components/layout/Common/Logo.tsx",
    "content": "import { Group, Image, Text } from '@mantine/core';\nimport { useConfigContext } from '~/config/provider';\nimport { useScreenLargerThan } from '~/hooks/useScreenLargerThan';\n\nimport { usePrimaryGradient } from './useGradient';\n\ninterface LogoProps {\n  size?: 'md' | 'xs';\n  withoutText?: boolean;\n}\n\nexport function Logo({ size = 'md', withoutText = false }: LogoProps) {\n  const { config } = useConfigContext();\n  const primaryGradient = usePrimaryGradient();\n  const largerThanMd = useScreenLargerThan('md');\n\n  return (\n    <Group spacing={size === 'md' ? 'xs' : 4} noWrap>\n      <Image\n        width=\"unset\"\n        height={size === 'md' ? 38 : 12}\n        styles={{\n          image: {\n            objectFit: 'contain !important' as 'contain',\n          },\n        }}\n        src={config?.settings.customization.logoImageUrl || '/imgs/logo/logo-color.svg'}\n        alt=\"Homarr Logo\"\n        className=\"dashboard-header-logo-image\"\n      />\n      {withoutText || !largerThanMd ? null : (\n        <Text\n          size={size === 'md' ? 22 : 10}\n          weight=\"bold\"\n          variant=\"gradient\"\n          className=\"dashboard-header-logo-text\"\n          gradient={primaryGradient}\n        >\n          {config?.settings.customization.pageTitle || 'Homarr'}\n        </Text>\n      )}\n    </Group>\n  );\n}\n"
  },
  {
    "path": "src/components/layout/Common/useCardStyles.ts",
    "content": "import { createStyles } from '@mantine/core';\nimport { useConfigContext } from '~/config/provider';\n\nexport const useCardStyles = (isCategory: boolean) => {\n  const { config } = useConfigContext();\n  const appOpacity = config?.settings.customization.appOpacity;\n  return createStyles(({ colorScheme }, _params) => {\n    const opacity = (appOpacity || 100) / 100;\n\n    if (colorScheme === 'dark') {\n      if (isCategory) {\n        return {\n          card: {\n            backgroundColor: `rgba(32, 33, 35, ${opacity}) !important`,\n            borderColor: `rgba(37, 38, 43, ${opacity})`,\n          },\n        };\n      }\n\n      return {\n        card: {\n          backgroundColor: `rgba(37, 38, 43, ${opacity}) !important`,\n          borderColor: `rgba(37, 38, 43, ${opacity})`,\n        },\n      };\n    }\n\n    return {\n      card: {\n        backgroundColor: `rgba(255, 255, 255, ${opacity}) !important`,\n        borderColor: `rgba(233, 236, 239, ${opacity})`,\n      },\n    };\n  })();\n};\n"
  },
  {
    "path": "src/components/layout/Common/useGradient.tsx",
    "content": "import { MantineGradient } from '@mantine/core';\nimport { useColorTheme } from '~/tools/color';\n\nexport const usePrimaryGradient = () => {\n  const { primaryColor, secondaryColor } = useColorTheme();\n\n  return {\n    from: primaryColor,\n    to: secondaryColor,\n    deg: 145,\n  } satisfies MantineGradient;\n};\n"
  },
  {
    "path": "src/components/layout/Meta/BoardHeadOverride.tsx",
    "content": "import Head from 'next/head';\nimport { useConfigContext } from '~/config/provider';\nimport { firstUpperCase } from '~/tools/shared/strings';\n\nexport const BoardHeadOverride = () => {\n  const { config, name } = useConfigContext();\n\n  if (!config || !name) return null;\n\n  const { metaTitle, faviconUrl } = config.settings.customization;\n  const fallbackTitle = `${firstUpperCase(name)} Board • Homarr`;\n  const title = metaTitle && metaTitle.length > 0 ? metaTitle : fallbackTitle;\n\n  return (\n    <Head>\n      <title>{title}</title>\n      <meta name=\"apple-mobile-web-app-title\" content={title} />\n\n      {faviconUrl && faviconUrl.length > 0 && (\n        <>\n          <link key=\"favicon\" rel=\"shortcut icon\" href={faviconUrl} />\n\n          <link key=\"favicon-apple\" rel=\"apple-touch-icon\" href={faviconUrl} />\n        </>\n      )}\n    </Head>\n  );\n};\n"
  },
  {
    "path": "src/components/layout/Meta/CommonHead.tsx",
    "content": "import { useMantineTheme } from '@mantine/core';\nimport Head from 'next/head';\n\nexport const CommonHead = () => {\n  const { colorScheme } = useMantineTheme();\n\n  return (\n    <Head>\n      <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1\" />\n      <link key=\"favicon\" rel=\"shortcut icon\" href=\"/imgs/favicon/favicon.svg\" />\n\n      <link crossOrigin=\"use-credentials\" rel=\"manifest\" href=\"/site.webmanifest\" />\n\n      {/* configure apple splash screen & touch icon */}\n      <link key=\"favicon-apple\" rel=\"apple-touch-icon\" href=\"/imgs/favicon/favicon.svg\" />\n      <meta name=\"apple-mobile-web-app-title\" content=\"Homarr\" />\n\n      <meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n\n      <meta\n        name=\"apple-mobile-web-app-status-bar-style\"\n        content={colorScheme === 'dark' ? 'white-translucent' : 'black-translucent'}\n      />\n    </Head>\n  );\n};\n"
  },
  {
    "path": "src/components/layout/Templates/BoardLayout.tsx",
    "content": "import { Button, Global, Modal, Stack, Text, Title, Tooltip, clsx } from '@mantine/core';\nimport { useDisclosure, useHotkeys, useWindowEvent } from '@mantine/hooks';\nimport { openContextModal } from '@mantine/modals';\nimport { hideNotification, showNotification } from '@mantine/notifications';\nimport {\n  IconApps,\n  IconBrandDocker,\n  IconEditCircle,\n  IconEditCircleOff,\n  IconSettings,\n} from '@tabler/icons-react';\nimport Consola from 'consola';\nimport { ContainerInfo } from 'dockerode';\nimport { useSession } from 'next-auth/react';\nimport { Trans, useTranslation } from 'next-i18next';\nimport Link from 'next/link';\nimport { useRouter } from 'next/router';\nimport { env } from 'process';\nimport { useState } from 'react';\nimport { useEditModeStore } from '~/components/Dashboard/Views/useEditModeStore';\nimport { useNamedWrapperColumnCount } from '~/components/Dashboard/Wrappers/gridstack/store';\nimport ContainerActionBar from '~/components/Manage/Tools/Docker/ContainerActionBar';\nimport ContainerTable from '~/components/Manage/Tools/Docker/ContainerTable';\nimport { BoardHeadOverride } from '~/components/layout/Meta/BoardHeadOverride';\nimport { HeaderActionButton } from '~/components/layout/header/ActionButton';\nimport { useConfigContext } from '~/config/provider';\nimport { api } from '~/utils/api';\n\nimport { MainLayout } from './MainLayout';\n\ntype BoardLayoutProps = {\n  children: React.ReactNode;\n  isDockerEnabled?: boolean;\n};\n\nexport const BoardLayout = ({ children, isDockerEnabled = false }: BoardLayoutProps) => {\n  const { config } = useConfigContext();\n  const { data: session } = useSession();\n\n  return (\n    <MainLayout autoFocusSearch={session?.user.autoFocusSearch} headerActions={<HeaderActions isDockerEnabled={isDockerEnabled} />}>\n      <BoardHeadOverride />\n      <BackgroundImage />\n      {children}\n      <style>{clsx(config?.settings.customization.customCss)}</style>\n    </MainLayout>\n  );\n};\n\nexport const HeaderActions = ({isDockerEnabled = false} : { isDockerEnabled: boolean}) => {\n  const { data: sessionData } = useSession();\n\n  if (!sessionData?.user?.isAdmin) return null;\n\n  return (\n    <>\n      <ToggleEditModeButton />\n      {isDockerEnabled && <DockerButton />}\n      <CustomizeBoardButton />\n    </>\n  );\n};\n\nconst DockerButton = () => {\n  const [selection, setSelection] = useState<(ContainerInfo & { icon?: string })[]>([]);\n  const [opened, { open, close, toggle }] = useDisclosure(false);\n  useHotkeys([['mod+B', toggle]]);\n\n  const { data, refetch, isRefetching } = api.docker.containers.useQuery(undefined, {\n    cacheTime: 60 * 1000 * 5,\n    staleTime: 60 * 1000 * 1,\n  });\n  const { t } = useTranslation('tools/docker');\n  const reload = () => {\n    refetch();\n    setSelection([]);\n  };\n\n  return (\n    <>\n      <Tooltip label={t('title')}>\n        <HeaderActionButton onClick={open}>\n          <IconBrandDocker size={20} stroke={1.5} />\n        </HeaderActionButton>\n      </Tooltip>\n      <Modal\n        title={t('title')}\n        withCloseButton={true}\n        closeOnClickOutside={true}\n        size=\"full\"\n        opened={opened}\n        onClose={close}\n      >\n        <Stack>\n          <ContainerActionBar selected={selection} reload={reload} isLoading={isRefetching} />\n          <ContainerTable\n            containers={data ?? []}\n            selection={selection}\n            setSelection={setSelection}\n          />\n        </Stack>\n      </Modal>\n    </>\n  );\n};\n\nconst CustomizeBoardButton = () => {\n  const { name } = useConfigContext();\n  const { t } = useTranslation('boards/common');\n  const href = useBoardLink(`/board/${name}/customize`);\n\n  return (\n    <Tooltip label={t('header.customize')}>\n      <HeaderActionButton component={Link} href={href}>\n        <IconSettings size={20} stroke={1.5} />\n      </HeaderActionButton>\n    </Tooltip>\n  );\n};\n\nconst beforeUnloadEventText = 'Exit the edit mode to save your changes';\nconst editModeNotificationId = 'toggle-edit-mode';\n\nconst ToggleEditModeButton = () => {\n  const { enabled, toggleEditMode } = useEditModeStore();\n  const { config, name: configName } = useConfigContext();\n  const { mutateAsync: saveConfig } = api.config.save.useMutation();\n  const namedWrapperColumnCount = useNamedWrapperColumnCount();\n  const { t } = useTranslation(['layout/header/actions/toggle-edit-mode', 'common']);\n  const translatedSize =\n    namedWrapperColumnCount !== null\n      ? t(`common:breakPoints.${namedWrapperColumnCount}`)\n      : t('common:loading');\n\n  useHotkeys([['mod+E', toggleEditMode]]);\n\n  useWindowEvent('beforeunload', (event: BeforeUnloadEvent) => {\n    if (enabled && env.NODE_ENV === 'production') {\n      // eslint-disable-next-line no-param-reassign\n      event.returnValue = beforeUnloadEventText;\n      return beforeUnloadEventText;\n    }\n\n    return undefined;\n  });\n\n  const save = async () => {\n    toggleEditMode();\n    if (!config || !configName) return;\n    await saveConfig({ name: configName, config });\n    Consola.log('Saved config to server', configName);\n    hideNotification(editModeNotificationId);\n  };\n\n  const enableEditMode = () => {\n    toggleEditMode();\n    showNotification({\n      styles: (theme) => ({\n        root: {\n          backgroundColor: theme.colors.orange[7],\n          borderColor: theme.colors.orange[7],\n\n          '&::before': { backgroundColor: theme.white },\n        },\n        title: { color: theme.white },\n        description: { color: theme.white },\n        closeButton: {\n          color: theme.white,\n          '&:hover': { backgroundColor: theme.colors.orange[7] },\n        },\n      }),\n      radius: 'md',\n      id: 'toggle-edit-mode',\n      autoClose: 10000,\n      title: (\n        <Title order={4}>\n          <Trans\n            i18nKey=\"layout/header/actions/toggle-edit-mode:popover.title\"\n            values={{ size: translatedSize }}\n            components={{\n              1: (\n                <Text\n                  component=\"a\"\n                  style={{ color: 'inherit', textDecoration: 'underline' }}\n                  href=\"https://homarr.dev/docs/advanced/customizations/board-customization#screen-sizes\"\n                  target=\"_blank\"\n                />\n              ),\n            }}\n          />\n        </Title>\n      ),\n      message: <Trans i18nKey=\"layout/header/actions/toggle-edit-mode:popover.text\" />,\n    });\n  };\n\n  if (enabled) {\n    return (\n      <Button.Group>\n        <Tooltip label={t('button.enabled')}>\n          <HeaderActionButton onClick={save}>\n            <IconEditCircleOff size={20} stroke={1.5} />\n          </HeaderActionButton>\n        </Tooltip>\n        <AddElementButton />\n      </Button.Group>\n    );\n  }\n  return (\n    <Tooltip label={t('button.disabled')}>\n      <HeaderActionButton onClick={enableEditMode}>\n        <IconEditCircle size={20} stroke={1.5} />\n      </HeaderActionButton>\n    </Tooltip>\n  );\n};\n\nconst AddElementButton = () => {\n  const { t } = useTranslation('layout/element-selector/selector');\n\n  return (\n    <Tooltip label={t('actionIcon.tooltip')}>\n      <HeaderActionButton\n        onClick={() =>\n          openContextModal({\n            modal: 'selectElement',\n            title: t('modal.title'),\n            size: 'xl',\n            innerProps: {},\n          })\n        }\n      >\n        <IconApps size={20} stroke={1.5} />\n      </HeaderActionButton>\n    </Tooltip>\n  );\n};\n\nconst BackgroundImage = () => {\n  const { config } = useConfigContext();\n\n  if (!config?.settings.customization.backgroundImageUrl) {\n    return null;\n  }\n\n  // Check if the background image URL is a video\n  const videoFormat = getVideoFormat(config?.settings.customization.backgroundImageUrl);\n  if (videoFormat) {\n    return <BackgroundVideo videoSource={config?.settings.customization.backgroundImageUrl} videoFormat={videoFormat} />;\n  }\n\n  return (\n    <Global\n      styles={{\n        '.mantine-AppShell-root': {\n          minHeight: '100vh',\n          backgroundImage: `url('${config?.settings.customization.backgroundImageUrl}')`,\n          backgroundPosition: 'center center',\n          backgroundSize: config?.settings.customization.backgroundImageSize ?? 'cover',\n          backgroundRepeat: config?.settings.customization.backgroundImageRepeat ?? 'no-repeat',\n          backgroundAttachment: config?.settings.customization.backgroundImageAttachment ?? 'fixed',\n        },\n      }}\n    />\n  );\n};\n\n\nconst getVideoFormat = (video: string) => {\n  const supportedFormats = ['mp4', 'webm', 'ogg'];\n  for(const format of supportedFormats) {\n    if(video.endsWith(format)) return format;\n  }\n  return undefined;\n}\n\ninterface BackgroundVideoProps {\n  videoSource: string;\n  videoFormat: string;\n}\n\nconst BackgroundVideo = ({videoSource, videoFormat}: BackgroundVideoProps) => {\n    return (\n      <video\n        autoPlay\n        muted\n        loop\n        playsInline\n        style={{\n          position: 'fixed',\n          width: '100vw',\n          height: '100vh',\n          top: 0,\n          left: 0,\n          objectFit: 'cover'\n        }}\n      >\n        <source src={videoSource} type={`video/${videoFormat}`} />\n      </video>\n    );\n};\n\n\nexport const useBoardLink = (\n  link: '/board' | `/board/${string}/customize` | `/board/${string}`\n) => {\n  const router = useRouter();\n\n  return router.asPath.startsWith('/board') ? link : link.replace('/board', '/b');\n};\n"
  },
  {
    "path": "src/components/layout/Templates/MainLayout.tsx",
    "content": "import { AppShell, useMantineTheme } from '@mantine/core';\nimport { MainHeader } from '~/components/layout/header/Header';\n\ntype MainLayoutProps = {\n  showExperimental?: boolean;\n  headerActions?: React.ReactNode;\n  contentComponents?: React.ReactNode;\n  children: React.ReactNode;\n  autoFocusSearch?: boolean;\n};\n\nexport const MainLayout = ({\n  showExperimental,\n  headerActions,\n  contentComponents,\n  children,\n  autoFocusSearch,\n}: MainLayoutProps) => {\n  const theme = useMantineTheme();\n\n  return (\n    <AppShell\n      styles={{\n        root: {\n          background: theme.colorScheme === 'dark' ? theme.colors.dark[6] : theme.colors.gray[1],\n        },\n      }}\n      header={\n        <MainHeader\n          autoFocusSearch={autoFocusSearch}\n          headerActions={headerActions}\n          contentComponents={contentComponents}\n          showExperimental={showExperimental}\n        />\n      }\n      className=\"dashboard-app-shell\"\n    >\n      {children}\n    </AppShell>\n  );\n};\n"
  },
  {
    "path": "src/components/layout/Templates/ManageLayout.tsx",
    "content": "import {\n  AppShell,\n  Burger,\n  Drawer,\n  Flex,\n  Footer,\n  Group,\n  Indicator,\n  NavLink,\n  Navbar,\n  Text,\n  ThemeIcon, Alert, Anchor,\n} from '@mantine/core';\nimport { useDisclosure } from '@mantine/hooks';\nimport {\n  IconBook2,\n  IconBrandDiscord,\n  IconBrandDocker,\n  IconBrandGithub,\n  IconFileExport,\n  IconGitFork,\n  IconHome,\n  IconInfoSmall,\n  IconLayoutDashboard,\n  IconMailForward,\n  IconPlug,\n  IconQuestionMark,\n  IconTool,\n  IconUser,\n  IconUsers,\n  TablerIconsProps,\n} from '@tabler/icons-react';\nimport { useQuery } from '@tanstack/react-query';\nimport { useSession } from 'next-auth/react';\nimport { useTranslation } from 'next-i18next';\nimport Image from 'next/image';\nimport Link from 'next/link';\nimport { useRouter } from 'next/router';\nimport { ReactNode, RefObject, forwardRef } from 'react';\nimport { useScreenLargerThan } from '~/hooks/useScreenLargerThan';\nimport { usePackageAttributesStore } from '~/tools/client/zustands/usePackageAttributesStore';\nimport { ConditionalWrapper } from '~/utils/security';\n\nimport { REPO_URL } from '../../../../data/constants';\nimport { type navigation } from '../../../../public/locales/en/layout/manage.json';\nimport { MainHeader } from '../header/Header';\nimport { deleteCookie } from \"cookies-next\";\n\ninterface ManageLayoutProps {\n  children: ReactNode;\n}\n\nexport const ManageLayout = ({ children }: ManageLayoutProps) => {\n  const packageVersion = usePackageAttributesStore((x) => x.attributes.packageVersion);\n  const { data: newVersion } = useQuery({\n    queryKey: ['github/latest'],\n    cacheTime: 1000 * 60 * 60 * 24,\n    staleTime: 1000 * 60 * 60 * 5,\n    queryFn: () =>\n      fetch(`https://api.github.com/repos/${REPO_URL}/releases/latest`, {\n        cache: 'force-cache',\n      }).then((res) => res.json()),\n  });\n  const { attributes } = usePackageAttributesStore();\n  const router = useRouter();\n  const newVersionAvailable =\n    newVersion?.tag_name > `v${attributes.packageVersion}` ? newVersion?.tag_name : undefined;\n\n  const screenLargerThanMd = useScreenLargerThan('md');\n\n  const [burgerMenuOpen, { toggle: toggleBurgerMenu, close: closeBurgerMenu }] =\n    useDisclosure(false);\n\n  const data = useSession();\n  const isAdmin = data.data?.user.isAdmin ?? false;\n\n  const navigationLinks: NavigationLinks = {\n    home: {\n      icon: IconHome,\n      href: '/manage',\n    },\n    boards: {\n      icon: IconLayoutDashboard,\n      href: '/manage/boards',\n    },\n    users: {\n      icon: IconUser,\n      onlyAdmin: true,\n      items: {\n        manage: {\n          icon: IconUsers,\n          href: '/manage/users',\n        },\n        invites: {\n          icon: IconMailForward,\n          href: '/manage/users/invites',\n        },\n      },\n    },\n    tools: {\n      icon: IconTool,\n      onlyAdmin: true,\n      items: {\n        docker: {\n          icon: IconBrandDocker,\n          href: '/manage/tools/docker',\n        },\n        api: {\n          icon: IconPlug,\n          href: '/manage/tools/swagger',\n        },\n        migrate: {\n          icon: IconFileExport,\n          href: '/manage/tools/migrate',\n        },\n      },\n    },\n    help: {\n      icon: IconQuestionMark,\n      items: {\n        documentation: {\n          icon: IconBook2,\n          href: 'https://homarr.dev/about-us',\n          target: '_blank',\n        },\n        report: {\n          icon: IconBrandGithub,\n          href: 'https://github.com/ajnart/homarr/issues/new/choose',\n          target: '_blank',\n        },\n        discord: {\n          icon: IconBrandDiscord,\n          href: 'https://discord.com/invite/aCsmEV5RgA',\n          target: '_blank',\n        },\n        contribute: {\n          icon: IconGitFork,\n          href: 'https://github.com/ajnart/homarr',\n          target: '_blank',\n        },\n      },\n    },\n    about: {\n      icon: IconInfoSmall,\n      displayUpdate: newVersionAvailable !== undefined,\n      href: '/manage/about',\n    },\n  };\n\n  type CustomNavigationLinkProps = {\n    name: keyof typeof navigationLinks;\n    navigationLink: (typeof navigationLinks)[keyof typeof navigationLinks];\n  };\n\n  const CustomNavigationLink = forwardRef<\n    HTMLAnchorElement | HTMLButtonElement,\n    CustomNavigationLinkProps\n  >(({ name, navigationLink }, ref) => {\n    const { t } = useTranslation('layout/manage');\n    const router = useRouter();\n\n    const commonProps = {\n      label: t(`navigation.${name}.title`),\n      icon: (\n        <ConditionalWrapper\n          condition={navigationLink.displayUpdate === true}\n          wrapper={(children) => (\n            <Indicator withBorder offset={2} color=\"blue\" processing size={12}>\n              {children}\n            </Indicator>\n          )}\n        >\n          <ThemeIcon size=\"md\" variant=\"light\" color=\"red\">\n            <navigationLink.icon size={16} />\n          </ThemeIcon>\n        </ConditionalWrapper>\n      ),\n      defaultOpened: false,\n    };\n\n    if ('href' in navigationLink) {\n      const isActive = router.pathname.endsWith(navigationLink.href);\n      return (\n        <NavLink\n          {...commonProps}\n          ref={ref as RefObject<HTMLAnchorElement>}\n          component={Link}\n          href={navigationLink.href}\n          active={isActive}\n        />\n      );\n    }\n\n    const isAnyActive = Object.entries(navigationLink.items)\n      .map(([_, item]) => item.href)\n      .some((href) => router.pathname.endsWith(href));\n\n    return (\n      <NavLink\n        {...commonProps}\n        defaultOpened={isAnyActive}\n        ref={ref as RefObject<HTMLButtonElement>}\n      >\n        {Object.entries(navigationLink.items).map(([itemName, item], index) => {\n          const commonItemProps = {\n            label: t(`navigation.${name}.items.${itemName}`),\n            icon: <item.icon size={16} />,\n            href: item.href,\n          };\n\n          const matchesActive = router.pathname.endsWith(item.href);\n\n          return (\n            <NavLink\n              {...commonItemProps}\n              target={item.target}\n              active={matchesActive}\n              component={Link}\n              key={index}\n            />\n          );\n        })}\n      </NavLink>\n    );\n  });\n\n  type NavigationLinks = {\n    [key in keyof typeof navigation]: (typeof navigation)[key] extends {\n      items: Record<string, string>;\n    }\n      ? NavigationLinkItems<(typeof navigation)[key]['items']>\n      : NavigationLinkHref;\n  };\n\n  const navigationLinkComponents = Object.entries(navigationLinks).map(([name, navigationLink]) => {\n    if (navigationLink.onlyAdmin && !isAdmin) {\n      return null;\n    }\n\n    return (\n      <CustomNavigationLink\n        key={name}\n        name={name as keyof typeof navigationLinks}\n        navigationLink={navigationLink}\n      />\n    );\n  });\n\n  const burgerMenu = screenLargerThanMd ? undefined : (\n    <Burger opened={burgerMenuOpen} onClick={toggleBurgerMenu} />\n  );\n  \n  const showUpgradeInfo = () => {\n    deleteCookie('dismissed-upgrade-modal');\n    router.reload();\n  }\n\n  return (\n    <>\n      <AppShell\n        navbar={\n          <Navbar width={{ base: !screenLargerThanMd ? 0 : 220 }} hidden={!screenLargerThanMd}>\n            <Navbar.Section pt=\"xs\" grow>\n              {navigationLinkComponents}\n            </Navbar.Section>\n            <Navbar.Section p={\"sm\"}>\n              <Alert>\n                This old version of Homarr no longer receives updates. Migrate for updates. <Anchor onClick={showUpgradeInfo}>Click here for further details</Anchor>\n              </Alert>\n            </Navbar.Section>\n          </Navbar>\n        }\n        header={<MainHeader showExperimental={false} logoHref=\"/b/\" leftIcon={burgerMenu} />}\n        footer={\n          <Footer height={25}>\n            <Group position=\"apart\" px=\"md\">\n              <Flex gap=\"md\" align=\"center\" columnGap={5}>\n                <Image src=\"/imgs/logo/logo.svg\" width={20} height={20} alt=\"\" />\n                <Text fw=\"bold\" size={15}>\n                  Homarr\n                </Text>\n                {packageVersion && (\n                  <Text color=\"dimmed\" size={13}>\n                    {packageVersion}\n                  </Text>\n                )}\n              </Flex>\n            </Group>\n          </Footer>\n        }\n      >\n        {children}\n      </AppShell>\n      <Drawer\n        opened={burgerMenuOpen}\n        onClose={closeBurgerMenu}\n        transitionProps={{\n          transition: 'slide-right',\n        }}\n      >\n        {navigationLinkComponents}\n      </Drawer>\n    </>\n  );\n};\n\ntype Icon = (props: TablerIconsProps) => JSX.Element;\n\ntype NavigationLinkHref = {\n  icon: Icon;\n  href: string;\n  target?: '_self' | '_blank';\n  onlyAdmin?: boolean;\n  displayUpdate?: boolean;\n};\n\ntype NavigationLinkItems<TItemsObject> = {\n  icon: Icon;\n  items: Record<keyof TItemsObject, NavigationLinkHref>;\n  onlyAdmin?: boolean;\n  displayUpdate?: boolean;\n};\n"
  },
  {
    "path": "src/components/layout/header/About/Contributors.tsx",
    "content": "import {\n  Anchor,\n  Avatar,\n  Group,\n  Pagination,\n  Stack,\n  Table,\n  Text,\n  Title,\n} from '@mantine/core';\nimport { usePagination } from '@mantine/hooks';\nimport { Trans, useTranslation } from 'next-i18next';\n\n// Generated by https://quicktype.io\n\nexport interface Contributors {\n  login: string;\n  id: number;\n  node_id: string;\n  avatar_url: string;\n  gravatar_id: string;\n  url: string;\n  html_url: string;\n  followers_url: string;\n  following_url: string;\n  gists_url: string;\n  starred_url: string;\n  subscriptions_url: string;\n  organizations_url: string;\n  repos_url: string;\n  events_url: string;\n  received_events_url: string;\n  type: Type;\n  site_admin: boolean;\n  contributions: number;\n}\n\nexport enum Type {\n  Bot = 'Bot',\n  User = 'User',\n}\n\nconst PAGINATION_ITEMS = 20;\n\nexport function ContributorsTable({ contributors }: { contributors: Contributors[] }) {\n  const pagination = usePagination({\n    total: contributors.length / PAGINATION_ITEMS,\n    initialPage: 1,\n  });\n  const { t } = useTranslation(['layout/modals/about']);\n\n  const rows = contributors\n    .slice(\n      (pagination.active - 1) * PAGINATION_ITEMS,\n      (pagination.active - 1) * PAGINATION_ITEMS + PAGINATION_ITEMS\n    )\n    .map((contributor) => (\n      <tr key={contributor.id}>\n        <td>\n          <Anchor href={`https://github.com/${contributor.login}`} target=\"_blank\">\n            <Group noWrap>\n              <Avatar size={25} radius=\"lg\" src={contributor.avatar_url} alt={contributor.login} />\n              {contributor.login}\n            </Group>\n          </Anchor>\n        </td>\n        <td>{contributor.contributions}</td>\n      </tr>\n    ));\n\n  return (\n    <Stack>\n      <Title order={3}>{t('contributors', { count: contributors.length })}</Title>\n      <Text>\n        <Trans\n          i18nKey=\"layout/modals/about:contributorsDescription\"\n          components={{\n            a: <Anchor href=\"https://homarr.dev/docs/community/developer-guides\" target=\"_blank\" />,\n          }}\n        />\n      </Text>\n\n      <Table withBorder>\n        <thead>\n          <tr>\n            <th\n              style={{\n                width: 400,\n              }}\n            >\n              Contributor\n            </th>\n            <th\n              style={{\n                width: 400,\n              }}\n            >\n              Contributions\n            </th>\n          </tr>\n        </thead>\n        <tbody>{rows}</tbody>\n      </Table>\n      <Pagination\n        style={{\n          justifyContent: 'center',\n        }}\n        total={contributors.length / PAGINATION_ITEMS}\n        value={pagination.active}\n        onNextPage={() => pagination.next()}\n        onPreviousPage={() => pagination.previous()}\n        onChange={(targetPage) => pagination.setPage(targetPage)}\n      />\n    </Stack>\n  );\n}\n"
  },
  {
    "path": "src/components/layout/header/About/Credits.tsx",
    "content": "import { Anchor, Box, Button, Collapse, Container, Flex, Stack, Table, Text } from '@mantine/core';\nimport { useDisclosure } from '@mantine/hooks';\nimport { modals } from '@mantine/modals';\nimport { useTranslation } from 'next-i18next';\nimport { usePackageAttributesStore } from '~/tools/client/zustands/usePackageAttributesStore';\n\nexport default function Credits() {\n  const { t } = useTranslation('settings/common');\n\n  return (\n    <Stack>\n      <DependencyTable />\n      <Text\n        style={{\n          fontSize: '0.90rem',\n          textAlign: 'center',\n          color: 'gray',\n        }}\n      >\n        {t('credits.madeWithLove')}\n        <Anchor\n          href=\"https://github.com/ajnart\"\n          style={{ color: 'inherit', fontStyle: 'inherit', fontSize: 'inherit' }}\n        >\n          ajnart\n        </Anchor>{' '}\n        and you!\n      </Text>\n    </Stack>\n  );\n}\n\nconst DependencyTable = () => {\n  const { t } = useTranslation('settings/common');\n  const { attributes } = usePackageAttributesStore();\n  return (\n    <Button\n      style={{\n        justifyContent: 'start',\n      }}\n      variant=\"light\"\n      mx=\"auto\"\n      size=\"xs\"\n      onClick={() =>\n        modals.open({\n          title: t('credits.thirdPartyContent'),\n          size: 'xl',\n          children: (\n            <Table>\n              <thead>\n                <tr>\n                  <th>{t('credits.thirdPartyContentTable.dependencyName')}</th>\n                  <th>{t('credits.thirdPartyContentTable.dependencyVersion')}</th>\n                </tr>\n              </thead>\n              <tbody>\n                {Object.keys(attributes.dependencies).map((key, index) => (\n                  <tr>\n                    <td>{key}</td>\n                    <td>{attributes.dependencies[key]}</td>\n                  </tr>\n                ))}\n              </tbody>\n            </Table>\n          ),\n        })\n      }\n    >\n      {t('credits.thirdPartyContent')}\n    </Button>\n  );\n};\n"
  },
  {
    "path": "src/components/layout/header/About/Tip.tsx",
    "content": "import { Text } from '@mantine/core';\nimport { useTranslation } from 'next-i18next';\n\ninterface TipProps {\n  children: React.ReactNode;\n}\n\nexport default function Tip(props: TipProps) {\n  const { t } = useTranslation('common');\n\n  return (\n    <Text\n      style={{\n        fontSize: '0.75rem',\n        color: 'gray',\n        marginBottom: '0.5rem',\n      }}\n    >\n      {t('tip')}\n      {props.children}\n    </Text>\n  );\n}\n"
  },
  {
    "path": "src/components/layout/header/About/Translators.tsx",
    "content": "import {\n  Anchor,\n  Avatar,\n  Group,\n  Pagination,\n  Stack,\n  Table,\n  Text,\n  Title,\n} from '@mantine/core';\nimport { usePagination } from '@mantine/hooks';\nimport { Trans, useTranslation } from 'next-i18next';\n\nimport CrowdinReport from '../../../../../data/crowdin-report.json';\n\nconst PAGINATION_ITEMS = 20;\n\nexport function TranslatorsTable({ loadedLanguages }: { loadedLanguages: number }) {\n  const { t } = useTranslation(['layout/modals/about']);\n  const translators = CrowdinReport.data;\n  const pagination = usePagination({\n    total: translators.length / PAGINATION_ITEMS,\n    initialPage: 1,\n  });\n\n  const rows = translators\n    .slice(\n      (pagination.active - 1) * PAGINATION_ITEMS,\n      (pagination.active - 1) * PAGINATION_ITEMS + PAGINATION_ITEMS\n    )\n    .map((translator) => (\n      <tr key={translator.user.id}>\n        <td\n          style={{\n            width: 400,\n          }}\n        >\n          <Anchor href={`https://crowdin.com/profile/${translator.user.username}`} target=\"_blank\">\n            <Group noWrap>\n              <Avatar\n                size={25}\n                radius=\"lg\"\n                src={translator.user.avatarUrl}\n                alt={translator.user.username}\n              />\n              {translator.user.fullName}\n            </Group>\n          </Anchor>\n        </td>\n        <td\n          style={{\n            width: 400,\n          }}\n        >\n          {translator.translated}\n        </td>\n        <td\n          style={{\n            width: 400,\n          }}\n        >\n          {translator.approved}\n        </td>\n        <td\n          style={{\n            width: 400,\n          }}\n        >\n          {translator.target}\n        </td>\n        <td\n          style={{\n            width: 400,\n          }}\n        >\n          <Text lineClamp={1}>\n            {translator.languages.map((language, index) => (\n              <span key={language.id}>{language.name}{(index < translator.languages.length - 1 ? \", \" : \"\")}</span>\n            ))}\n          </Text>\n        </td>\n      </tr>\n    ));\n\n  return (\n    <Stack>\n      <Title order={3}>{t('translators', { count: translators.length })}</Title>\n      <Text>\n        <Trans\n          i18nKey=\"layout/modals/about:translatorsDescription\"\n          values={{\n            languages: loadedLanguages,\n          }}\n          components={{\n            a: <Anchor href=\"https://homarr.dev/docs/community/translations\" target=\"_blank\" />,\n          }}\n        />\n      </Text>\n      <Table withBorder>\n        <thead>\n          <tr>\n            <th>Name</th>\n            <th>Translated</th>\n            <th>Approved</th>\n            <th>Target</th>\n            <th>Languages</th>\n          </tr>\n        </thead>\n        <tbody>{rows}</tbody>\n      </Table>\n      <Pagination\n        style={{\n          justifyContent: 'center',\n        }}\n        total={translators.length / PAGINATION_ITEMS}\n        value={pagination.active}\n        onNextPage={() => pagination.next()}\n        onPreviousPage={() => pagination.previous()}\n        onChange={(targetPage) => pagination.setPage(targetPage)}\n      />\n    </Stack>\n  );\n}\n"
  },
  {
    "path": "src/components/layout/header/ActionButton.tsx",
    "content": "import { Button, ButtonProps } from '@mantine/core';\nimport Link from 'next/link';\nimport { ForwardedRef, forwardRef } from 'react';\n\nimport { useCardStyles } from '../Common/useCardStyles';\n\ntype SpecificLinkProps = {\n  component: typeof Link;\n  href: string;\n};\ntype SpecificButtonProps = {\n  onClick: HTMLButtonElement['onclick'];\n};\ntype HeaderActionButtonProps = Omit<ButtonProps, 'variant' | 'className' | 'h' | 'w' | 'px'> &\n  (SpecificLinkProps | SpecificButtonProps);\n\nexport const HeaderActionButton = forwardRef<\n  HTMLButtonElement | HTMLAnchorElement,\n  HeaderActionButtonProps\n>(({ children, ...props }, ref) => {\n  const { classes } = useCardStyles(true);\n\n  const buttonProps: ButtonProps = {\n    variant: 'default',\n    className: classes.card,\n    h: 38,\n    w: 38,\n    px: 0,\n    ...props,\n  };\n\n  if ('component' in props) {\n    return (\n      <Button\n        ref={ref as ForwardedRef<HTMLAnchorElement>}\n        component={props.component}\n        href={props.href}\n        {...buttonProps}\n      >\n        {children}\n      </Button>\n    );\n  }\n\n  return (\n    <Button ref={ref as ForwardedRef<HTMLButtonElement>} {...buttonProps}>\n      {children}\n    </Button>\n  );\n});\n"
  },
  {
    "path": "src/components/layout/header/AvatarMenu.tsx",
    "content": "import { Avatar, Menu, UnstyledButton, useMantineTheme } from '@mantine/core';\nimport {\n  IconDashboard,\n  IconHomeShare,\n  IconLogin,\n  IconLogout,\n  IconMoonStars,\n  IconSun,\n  IconUserCog,\n} from '@tabler/icons-react';\nimport { createHash } from 'crypto';\nimport { User } from 'next-auth';\nimport { signOut, useSession } from 'next-auth/react';\nimport { useTranslation } from 'next-i18next';\nimport Link from 'next/link';\nimport { forwardRef } from 'react';\nimport { useLogoutUrl } from '~/hooks/custom-session-provider';\nimport { useColorScheme } from '~/hooks/use-colorscheme';\n\nimport { useBoardLink } from '../Templates/BoardLayout';\n\nexport const AvatarMenu = () => {\n  const { t } = useTranslation('layout/header');\n  const { data: sessionData } = useSession();\n  const { colorScheme, toggleColorScheme } = useColorScheme();\n\n  const Icon = colorScheme === 'dark' ? IconSun : IconMoonStars;\n  const defaultBoardHref = useBoardLink('/board');\n\n  const logoutUrl = useLogoutUrl();\n\n  return (\n    <Menu width={256}>\n      <Menu.Target>\n        <UnstyledButton>\n          <CurrentUserAvatar user={sessionData?.user ?? null} />\n        </UnstyledButton>\n      </Menu.Target>\n      <Menu.Dropdown>\n        <Menu.Item closeMenuOnClick={false} icon={<Icon size=\"1rem\" />} onClick={toggleColorScheme}>\n          {t('actions.avatar.switchTheme')}\n        </Menu.Item>\n        {sessionData?.user && (\n          <>\n            <Menu.Item\n              component={Link}\n              passHref\n              href=\"/user/preferences\"\n              icon={<IconUserCog size=\"1rem\" />}\n            >\n              {t('actions.avatar.preferences')}\n            </Menu.Item>\n            <Menu.Item\n              component={Link}\n              href={defaultBoardHref}\n              icon={<IconDashboard size=\"1rem\" />}\n            >\n              {t('actions.avatar.defaultBoard')}\n            </Menu.Item>\n            <Menu.Item component={Link} href=\"/manage\" icon={<IconHomeShare size=\"1rem\" />}>\n              {t('actions.avatar.manage')}\n            </Menu.Item>\n            <Menu.Divider />\n          </>\n        )}\n        {sessionData?.user ? (\n          <Menu.Item\n            icon={<IconLogout size=\"1rem\" />}\n            color=\"red\"\n            onClick={() => {\n              signOut({\n                redirect: false,\n              }).then(() =>\n                logoutUrl ? window.location.assign(logoutUrl) : window.location.reload()\n              );\n            }}\n          >\n            {t('actions.avatar.logout', {\n              username: sessionData.user.name,\n            })}\n          </Menu.Item>\n        ) : (\n          <Menu.Item icon={<IconLogin size=\"1rem\" />} component={Link} href=\"/auth/login\">\n            {t('actions.avatar.login')}\n          </Menu.Item>\n        )}\n      </Menu.Dropdown>\n    </Menu>\n  );\n};\n\ntype CurrentUserAvatarProps = {\n  user: User | null;\n};\n\nconst getAvatarLink = (email?: string | undefined | null) => {\n  if (!email) return null;\n  const emailHash = createHash('sha256').update(email.trim().toLowerCase()).digest('hex');\n  return `https://seccdn.libravatar.org/avatar/${emailHash}?d=404`;\n};\n\nconst CurrentUserAvatar = forwardRef<HTMLDivElement, CurrentUserAvatarProps>(\n  ({ user, ...others }, ref) => {\n    const { primaryColor } = useMantineTheme();\n    const { fn } = useMantineTheme();\n    const border = fn.variant({ variant: 'default' }).border;\n\n    return (\n      <Avatar\n        ref={ref}\n        color={user == null ? undefined : primaryColor}\n        src={getAvatarLink(user?.email)}\n        alt={user?.name?.slice(0, 2).toUpperCase() ?? \"anon\"}\n        styles={{ root: { border: `1px solid ${border}` }, image: {} }}\n        {...others}\n      >\n        {user?.name?.slice(0, 2).toUpperCase()}\n      </Avatar>\n    );\n  }\n);\n"
  },
  {
    "path": "src/components/layout/header/Header.tsx",
    "content": "import {\n  Box,\n  Center,\n  Flex,\n  Group,\n  Header,\n  Text,\n  Title,\n  UnstyledButton,\n  useMantineTheme\n} from '@mantine/core';\nimport { useMediaQuery } from '@mantine/hooks';\nimport { IconAlertTriangle } from '@tabler/icons-react';\nimport { useTranslation } from 'next-i18next';\n\nimport { Logo } from '../Common/Logo';\nimport { AvatarMenu } from './AvatarMenu';\nimport { Search } from './Search';\n\ntype MainHeaderProps = {\n  logoHref?: string;\n  showExperimental?: boolean;\n  headerActions?: React.ReactNode;\n  contentComponents?: React.ReactNode;\n  leftIcon?: React.ReactNode;\n  autoFocusSearch?: boolean;\n};\n\nexport const MainHeader = ({\n  showExperimental = false,\n  logoHref = '/',\n  headerActions,\n  leftIcon,\n  contentComponents,\n  autoFocusSearch,\n}: MainHeaderProps) => {\n  const { breakpoints } = useMantineTheme();\n  const isSmallerThanMd = useMediaQuery(`(max-width: ${breakpoints.sm})`);\n  const experimentalHeaderNoteHeight = isSmallerThanMd ? 60 : 30;\n  const headerBaseHeight = isSmallerThanMd ? 60 + 46 : 60;\n  const headerHeight = showExperimental\n    ? headerBaseHeight + experimentalHeaderNoteHeight\n    : headerBaseHeight;\n\n  return (\n    <Header height={headerHeight} pb=\"sm\" pt={0} style={{ zIndex: 200 }}>\n      <Group spacing=\"xl\" mt=\"xs\" px=\"md\" position=\"apart\" noWrap>\n        <Group noWrap style={{ flex: 1 }}>\n          {leftIcon}\n          <UnstyledButton component=\"a\" href={logoHref}>\n            <Logo />\n          </UnstyledButton>\n        </Group>\n\n        {!isSmallerThanMd && <Search autoFocus={autoFocusSearch} />}\n\n        <Group noWrap style={{ flex: 1 }} position=\"right\">\n          <Group noWrap spacing={8}>\n            {contentComponents}\n            {headerActions}\n          </Group>\n          <AvatarMenu />\n        </Group>\n      </Group>\n\n      {isSmallerThanMd && (\n        <Center mt=\"xs\" px=\"md\">\n          <Search isMobile />\n        </Center>\n      )}\n    </Header>\n  );\n};\n\ntype ExperimentalHeaderNoteProps = {\n  height?: 30 | 60;\n  visible?: boolean;\n};\nconst ExperimentalHeaderNote = ({ visible = false, height = 30 }: ExperimentalHeaderNoteProps) => {\n  const { t } = useTranslation('layout/header');\n  if (!visible) return null;\n\n  return (\n    <Box bg=\"red\" h={height} p={3} px={6} style={{ overflow: 'hidden' }}>\n      <Flex h=\"100%\" align=\"center\" columnGap={7}>\n        <IconAlertTriangle color=\"white\" size=\"1rem\" style={{ minWidth: '1rem' }} />\n        <Text color=\"white\" lineClamp={height === 30 ? 1 : 2}>\n          <Title>Make an announcement here</Title>\n        </Text>\n      </Flex>\n    </Box>\n  );\n};\n"
  },
  {
    "path": "src/components/layout/header/Search/MovieModal.tsx",
    "content": "import {\n  Button,\n  Card,\n  Center,\n  Grid,\n  Group,\n  Loader,\n  Image as MantineImage,\n  Modal,\n  ScrollArea,\n  Stack,\n  Text,\n  Title,\n} from '@mantine/core';\nimport { useDisclosure } from '@mantine/hooks';\nimport { IconDownload, IconExternalLink, IconPlayerPlay } from '@tabler/icons-react';\nimport { Trans, useTranslation } from 'next-i18next';\nimport Image from 'next/image';\nimport { useRouter } from 'next/router';\nimport React, { useMemo } from 'react';\nimport { z } from 'zod';\nimport { availableIntegrations } from '~/components/Dashboard/Modals/EditAppModal/Tabs/IntegrationTab/Components/InputElements/IntegrationSelector';\nimport { useConfigContext } from '~/config/provider';\nimport { RequestModal } from '~/modules/overseerr/RequestModal';\nimport { RouterOutputs, api } from '~/utils/api';\n\ntype MovieModalProps = {\n  opened: boolean;\n  closeModal: () => void;\n};\n\nconst queryParamsSchema = z.object({\n  movie: z.literal('true'),\n  search: z.string().nonempty(),\n  type: z.enum(['jellyseerr', 'overseerr']),\n});\n\nexport const MovieModal = ({ opened, closeModal }: MovieModalProps) => {\n  const query = useRouter().query;\n  const queryParams = queryParamsSchema.safeParse(query);\n\n  if (!queryParams.success) {\n    return null;\n  }\n\n  const integration = useMemo(() => {\n    return availableIntegrations.find((x) => x.value === queryParams.data.type)!;\n  }, [queryParams.data.type]);\n\n  return (\n    <Modal\n      opened={opened}\n      onClose={closeModal}\n      size=\"100%\"\n      scrollAreaComponent={ScrollArea.Autosize}\n      title={\n        <Group>\n          <Image src={integration.image} width={30} height={30} alt={`${integration.label} icon`} />\n          <Title order={4}>{integration.label} search</Title>\n        </Group>\n      }\n    >\n      <MovieResults search={queryParams.data.search} type={queryParams.data.type} />\n    </Modal>\n  );\n};\n\ntype MovieResultsProps = Omit<z.infer<typeof queryParamsSchema>, 'movie'>;\n\nconst MovieResults = ({ search, type }: MovieResultsProps) => {\n  const { t } = useTranslation('layout/header');\n  const { name: configName } = useConfigContext();\n  const { data: movies, isLoading } = api.overseerr.search.useQuery(\n    {\n      query: search,\n      configName: configName!,\n      integration: type,\n      limit: 12,\n    },\n    {\n      refetchOnWindowFocus: false,\n      refetchOnMount: false,\n      refetchInterval: false,\n    }\n  );\n\n  if (isLoading)\n    return (\n      <Center>\n        <Loader />\n      </Center>\n    );\n\n  return (\n    <Stack>\n      <Text>\n        <Trans\n          t={t}\n          i18nKey=\"modals.movie.topResults\"\n          values={{\n            count: movies?.length ?? 0,\n            search,\n          }}\n          components={{\n            b: <b />,\n          }}\n        />\n      </Text>\n      <Grid gutter={32}>\n        {movies?.map((result, index: number) => (\n          <Grid.Col key={index} span={12} sm={6} lg={4}>\n            <MovieDisplay movie={result} type={type} />\n          </Grid.Col>\n        ))}\n      </Grid>\n    </Stack>\n  );\n};\n\ntype MovieDisplayProps = {\n  movie: RouterOutputs['overseerr']['search'][number];\n  type: 'jellyseerr' | 'overseerr';\n};\n\nconst MovieDisplay = ({ movie, type }: MovieDisplayProps) => {\n  const { t } = useTranslation('modules/common-media-cards');\n  const { config } = useConfigContext();\n  const [requestModalOpened, requestModal] = useDisclosure(false);\n\n  if (!config) {\n    return null;\n  }\n\n  const service = config.apps.find((service) => service.integration.type === type);\n  const mediaUrl = movie.mediaInfo?.plexUrl ?? movie.mediaInfo?.mediaUrl;\n  const serviceUrl = service?.behaviour.externalUrl ?? service?.url;\n  const externalUrl = new URL(\n    `${movie.mediaType}/${movie.id}`,\n    serviceUrl ?? 'https://www.themoviedb.org'\n  );\n\n  return (\n    <Card withBorder>\n      <Group noWrap style={{ maxHeight: 250 }} p={0} m={0} spacing=\"xs\" align=\"stretch\">\n        <MantineImage\n          withPlaceholder\n          src={`https://image.tmdb.org/t/p/w600_and_h900_bestv2/${\n            movie.posterPath ?? movie.backdropPath\n          }`}\n          height={200}\n          width={150}\n          radius=\"md\"\n          fit=\"cover\"\n        />\n        <Stack justify=\"space-between\">\n          <Stack spacing={4}>\n            <Title lineClamp={2} order={5}>\n              {movie.title ?? movie.name ?? movie.originalName}\n            </Title>\n            <Text color=\"dimmed\" size=\"xs\" lineClamp={4}>\n              {movie.overview}\n            </Text>\n          </Stack>\n\n          <Group spacing=\"xs\">\n            {!movie.mediaInfo?.mediaAddedAt && (\n              <>\n                <RequestModal\n                  base={movie}\n                  opened={requestModalOpened}\n                  setOpened={requestModal.toggle}\n                />\n                <Button\n                  onClick={() => {\n                    requestModal.open();\n                  }}\n                  variant=\"light\"\n                  size=\"sm\"\n                  rightIcon={<IconDownload size={15} />}\n                >\n                  {t('buttons.request')}\n                </Button>\n              </>\n            )}\n            {mediaUrl && (\n              <Button\n                component=\"a\"\n                target=\"_blank\"\n                variant=\"light\"\n                href={mediaUrl}\n                size=\"sm\"\n                rightIcon={<IconPlayerPlay size={15} />}\n              >\n                {t('buttons.play')}\n              </Button>\n            )}\n            {externalUrl && (\n              <Button\n                component=\"a\"\n                target=\"_blank\"\n                href={externalUrl.href}\n                variant=\"outline\"\n                size=\"sm\"\n                rightIcon={<IconExternalLink size={15} />}\n              >\n                {serviceUrl ? (type === 'jellyseerr' ? 'Jellyfin' : 'Overseerr') : 'TMDB'}\n              </Button>\n            )}\n          </Group>\n        </Stack>\n      </Group>\n    </Card>\n  );\n};\n"
  },
  {
    "path": "src/components/layout/header/Search.tsx",
    "content": "import { Autocomplete, Group, Text, useMantineTheme } from '@mantine/core';\nimport { useDisclosure, useHotkeys } from '@mantine/hooks';\nimport {\n  IconBrandYoutube,\n  IconDownload,\n  IconMovie,\n  IconSearch,\n  IconWorld,\n  TablerIconsProps,\n} from '@tabler/icons-react';\nimport { useSession } from 'next-auth/react';\nimport { useTranslation } from 'next-i18next';\nimport { useRouter } from 'next/router';\nimport { ReactNode, forwardRef, useMemo, useRef, useState } from 'react';\nimport { useConfigContext } from '~/config/provider';\nimport { useGetExternalUrl } from '~/hooks/useExternalUrl';\nimport { api } from '~/utils/api';\n\nimport { MovieModal } from './Search/MovieModal';\n\ntype SearchProps = {\n  isMobile?: boolean;\n  autoFocus?: boolean;\n};\n\nexport const Search = ({ isMobile, autoFocus }: SearchProps) => {\n  const { t } = useTranslation('layout/header');\n  const [search, setSearch] = useState('');\n  const ref = useRef<HTMLInputElement>(null);\n  useHotkeys([['mod+K', () => ref.current?.focus()]]);\n  const { data: sessionData } = useSession();\n  const { data: userWithSettings } = api.user.withSettings.useQuery(undefined, {\n    enabled: !!sessionData?.user,\n  });\n  const { config } = useConfigContext();\n  const { colors } = useMantineTheme();\n  const router = useRouter();\n  const [showMovieModal, movieModal] = useDisclosure(router.query.movie === 'true');\n\n  const apps = useConfigApps(search);\n  const engines = generateEngines(\n    search,\n    userWithSettings?.settings.searchTemplate ?? 'https://www.google.com/search?q=%s'\n  )\n    .filter(\n      (engine) =>\n        engine.sort !== 'movie' || config?.apps.some((app) => app.integration.type === engine.value)\n    )\n    .map((engine) => ({\n      ...engine,\n      label: t(`search.engines.${engine.sort}`, {\n        app: engine.value,\n        query: search,\n      }),\n    }));\n  const data = [...apps, ...engines];\n\n  return (\n    <>\n      <Autocomplete\n        ref={ref}\n        radius=\"xl\"\n        w={isMobile ? '100%' : 400}\n        variant=\"filled\"\n        placeholder={`${t('search.label')}...`}\n        hoverOnSearchChange\n        autoFocus={autoFocus}\n        rightSection={\n          <IconSearch\n            onClick={() => ref.current?.focus()}\n            color={colors.gray[5]}\n            size={16}\n            stroke={1.5}\n          />\n        }\n        limit={8}\n        value={search}\n        onChange={setSearch}\n        data={data}\n        itemComponent={SearchItemComponent}\n        filter={(value, item: SearchAutoCompleteItem) =>\n          engines.some((engine) => engine.sort === item.sort) ||\n          item.value.toLowerCase().includes(value.trim().toLowerCase())\n        }\n        classNames={{\n          input: 'dashboard-header-search-input',\n          root: 'dashboard-header-search-root',\n        }}\n        onItemSubmit={(item: SearchAutoCompleteItem) => {\n          setSearch('');\n          if (item.sort === 'movie') {\n            const url = new URL(`${window.location.origin}${router.asPath}`);\n            url.searchParams.set('movie', 'true');\n            url.searchParams.set('search', search);\n            url.searchParams.set('type', item.value);\n            router.push(url, undefined, { shallow: true });\n            movieModal.open();\n            return;\n          }\n          const target = userWithSettings?.settings.openSearchInNewTab ? '_blank' : '_self';\n          window.open(item.metaData.url, target);\n        }}\n        aria-label={t('search.label') as string}\n      />\n      <MovieModal\n        opened={showMovieModal}\n        closeModal={() => {\n          movieModal.close();\n          const url = new URL(`${window.location.origin}${router.asPath}`);\n          url.searchParams.delete('movie');\n          url.searchParams.delete('search');\n          url.searchParams.delete('type');\n          router.push(url, undefined, { shallow: true });\n        }}\n      />\n    </>\n  );\n};\n\nconst SearchItemComponent = forwardRef<HTMLDivElement, SearchAutoCompleteItem & { label: string }>(\n  ({ icon, label, value, sort, ...others }, ref) => {\n    let Icon = getItemComponent(icon);\n\n    return (\n      <Group ref={ref} noWrap {...others}>\n        <Icon size={20} />\n        <Text>{label}</Text>\n      </Group>\n    );\n  }\n);\n\nconst getItemComponent = (icon: SearchAutoCompleteItem['icon']) => {\n  if (typeof icon !== 'string') {\n    return icon;\n  }\n\n  return (props: TablerIconsProps) => (\n    <img src={icon} height={props.size} width={props.size} style={{ objectFit: 'contain' }} />\n  );\n};\n\nconst useConfigApps = (search: string) => {\n  const { config } = useConfigContext();\n  const getHref = useGetExternalUrl();\n  return useMemo(() => {\n    if (search.trim().length === 0) return [];\n    const apps = config?.apps.filter((app) =>\n      app.name.toLowerCase().includes(search.toLowerCase())\n    );\n    return (\n      apps?.map((app) => ({\n        icon: app.appearance.iconUrl,\n        label: app.name,\n        value: app.name,\n        sort: 'app',\n        metaData: {\n          url: getHref(app),\n        },\n      })) ?? []\n    );\n  }, [search, config]);\n};\n\ntype SearchAutoCompleteItem = {\n  icon: ((props: TablerIconsProps) => ReactNode) | string;\n  value: string;\n} & (\n  | {\n      sort: 'web' | 'torrent' | 'youtube' | 'app';\n      metaData: {\n        url: string;\n      };\n    }\n  | {\n      sort: 'movie';\n    }\n);\nconst movieApps = ['overseerr', 'jellyseerr'] as const;\nconst generateEngines = (searchValue: string, webTemplate: string) =>\n  searchValue.trim().length > 0\n    ? ([\n        {\n          icon: IconWorld,\n          value: `web`,\n          sort: 'web',\n          metaData: {\n            url: webTemplate.includes('%s')\n              ? webTemplate.replace('%s', searchValue)\n              : webTemplate + searchValue,\n          },\n        },\n        {\n          icon: IconDownload,\n          value: `torrent`,\n          sort: 'torrent',\n          metaData: {\n            url: `https://www.torrentdownloads.me/search/?search=${searchValue}`,\n          },\n        },\n        {\n          icon: IconBrandYoutube,\n          value: 'youtube',\n          sort: 'youtube',\n          metaData: {\n            url: `https://www.youtube.com/results?search_query=${searchValue}`,\n          },\n        },\n        ...movieApps.map(\n          (name) =>\n            ({\n              icon: IconMovie,\n              value: name,\n              sort: 'movie',\n            }) as const\n        ),\n      ] as const satisfies Readonly<SearchAutoCompleteItem[]>)\n    : [];\n"
  },
  {
    "path": "src/config/init.ts",
    "content": "import { useEffect } from 'react';\nimport { ConfigType } from '~/types/config';\n\nimport { useConfigContext } from './provider';\nimport { useConfigStore } from './store';\n\nexport const useInitConfig = (initialConfig: ConfigType) => {\n  const { setConfigName, increaseVersion } = useConfigContext();\n  const configName = initialConfig.configProperties?.name ?? 'default';\n  const initConfig = useConfigStore((x) => x.initConfig);\n  const removeConfig = useConfigStore((x) => x.removeConfig);\n\n  useEffect(() => {\n    setConfigName(configName);\n    initConfig(configName, initialConfig, increaseVersion);\n    return () => {\n      removeConfig(configName);\n    };\n  }, [configName]);\n};\n"
  },
  {
    "path": "src/config/provider.tsx",
    "content": "import { createContext, ReactNode, useContext, useEffect, useState } from 'react';\nimport { shallow } from 'zustand/shallow';\nimport { useColorTheme } from '~/tools/color';\nimport { ConfigType } from '~/types/config';\n\nimport { useConfigStore } from './store';\n\nexport type ConfigContextType = {\n  config: ConfigType | undefined;\n  name: string | undefined;\n  configVersion: number | undefined;\n  increaseVersion: () => void;\n  setConfigName: (name: string) => void;\n};\n\nconst ConfigContext = createContext<ConfigContextType>({\n  name: 'unknown',\n  config: undefined,\n  configVersion: undefined,\n  increaseVersion: () => {},\n  setConfigName: () => {},\n});\n\nexport const ConfigProvider = ({\n  children,\n  config: fallbackConfig,\n}: {\n  children: ReactNode;\n  config?: ConfigType;\n}) => {\n  const [configName, setConfigName] = useState<string>(\n    fallbackConfig?.configProperties.name || 'unknown'\n  );\n  const [configVersion, setConfigVersion] = useState(0);\n  const { configs } = useConfigStore((s) => ({ configs: s.configs }), shallow);\n\n  const currentConfig = configs.find((c) => c.value.configProperties.name === configName)?.value;\n  const { setPrimaryColor, setSecondaryColor, setPrimaryShade } = useColorTheme();\n\n  useEffect(() => {\n    setPrimaryColor(currentConfig?.settings.customization.colors.primary || 'red');\n    setSecondaryColor(currentConfig?.settings.customization.colors.secondary || 'orange');\n    setPrimaryShade(currentConfig?.settings.customization.colors.shade || 6);\n  }, [currentConfig]);\n\n  return (\n    <ConfigContext.Provider\n      value={{\n        name: configName,\n        config: currentConfig ?? fallbackConfig,\n        configVersion,\n        increaseVersion: () => setConfigVersion((v) => v + 1),\n        setConfigName: (name: string) => setConfigName(name),\n      }}\n    >\n      {children}\n    </ConfigContext.Provider>\n  );\n};\n\nexport const useConfigContext = () => useContext(ConfigContext);\n"
  },
  {
    "path": "src/config/store.ts",
    "content": "import { createWithEqualityFn } from 'zustand/traditional';\nimport { ConfigType } from '~/types/config';\nimport { trcpProxyClient } from '~/utils/api';\n\nexport const useConfigStore = createWithEqualityFn<UseConfigStoreType>(\n  (set, get) => ({\n    configs: [],\n    initConfig: (name, config, increaseVersion) => {\n      set((old) => ({\n        ...old,\n        configs: [\n          ...old.configs.filter((x) => x.value.configProperties?.name !== name),\n          { increaseVersion, value: config },\n        ],\n      }));\n    },\n    addConfig: async (name: string, config: ConfigType) => {\n      set((old) => ({\n        ...old,\n        configs: [\n          ...old.configs.filter((x) => x.value.configProperties.name !== name),\n          { value: config, increaseVersion: () => {} },\n        ],\n      }));\n    },\n    removeConfig: (name: string) => {\n      set((old) => ({\n        ...old,\n        configs: old.configs.filter((x) => x.value.configProperties.name !== name),\n      }));\n    },\n    updateConfig: async (\n      name,\n      updateCallback: (previous: ConfigType) => ConfigType,\n      shouldRegenerateGridstack = false,\n      shouldSaveConfigToFileSystem = false\n    ) => {\n      const { configs } = get();\n      const currentConfig = configs.find((x) => x.value.configProperties.name === name);\n      if (!currentConfig) {\n        return;\n      }\n      // copies the value of currentConfig and creates a non reference object named previousConfig\n      const previousConfig: ConfigType = JSON.parse(JSON.stringify(currentConfig.value));\n\n      const updatedConfig = updateCallback(currentConfig.value);\n\n      set((old) => ({\n        ...old,\n        configs: [\n          ...old.configs.filter((x) => x.value.configProperties.name !== name),\n          { value: updatedConfig, increaseVersion: currentConfig.increaseVersion },\n        ],\n      }));\n\n      if (\n        (typeof shouldRegenerateGridstack === 'boolean' && shouldRegenerateGridstack) ||\n        (typeof shouldRegenerateGridstack === 'function' &&\n          shouldRegenerateGridstack(previousConfig, updatedConfig))\n      ) {\n        currentConfig.increaseVersion();\n      }\n\n      if (shouldSaveConfigToFileSystem) {\n        trcpProxyClient.config.save.mutate({\n          name,\n          config: updatedConfig,\n        });\n      }\n    },\n  }),\n  Object.is\n);\n\ninterface UseConfigStoreType {\n  configs: { increaseVersion: () => void; value: ConfigType }[];\n  initConfig: (name: string, config: ConfigType, increaseVersion: () => void) => void;\n  addConfig: (name: string, config: ConfigType) => Promise<void>;\n  removeConfig: (name: string) => void;\n  updateConfig: (\n    name: string,\n    updateCallback: (previous: ConfigType) => ConfigType,\n    shouldRegenerateGridstack?:\n      | boolean\n      | ((previousConfig: ConfigType, currentConfig: ConfigType) => boolean),\n    shouldSaveConfigToFileSystem?: boolean\n  ) => Promise<void>;\n}\n"
  },
  {
    "path": "src/constants/constants.ts",
    "content": "export const MIN_WIDTH_MOBILE = 500;\n"
  },
  {
    "path": "src/constants/gridstack-breakpoints.ts",
    "content": "export const GridstackBreakpoints = {\n  large: 1400,\n  medium: 768,\n};\n"
  },
  {
    "path": "src/env.js",
    "content": "const { z } = require('zod');\nconst { createEnv } = require('@t3-oss/env-nextjs');\n\nconst trueStrings = ['1', 't', 'T', 'TRUE', 'true', 'True'];\nconst falseStrings = ['0', 'f', 'F', 'FALSE', 'false', 'False'];\n\nconst ldapSearchScope = z.enum(['base', 'one', 'sub']).default('base');\n\nconst zodParsedBoolean = () =>\n  z\n    .enum([...trueStrings, ...falseStrings])\n    .default('false')\n    .transform((value) => trueStrings.includes(value));\n\nconst numberSchema = z\n  .string()\n  .regex(/\\d*/)\n  .transform((value) => (value === undefined ? undefined : Number(value)))\n  .optional();\n\nconst portSchema = z\n  .string()\n  .regex(/\\d*/)\n  .transform((value) => (value === undefined ? undefined : Number(value)))\n  .optional();\nconst envSchema = z.enum(['development', 'test', 'production']);\n\nconst validAuthProviders = ['credentials', 'ldap', 'oidc'];\nconst authProviders = process.env.AUTH_PROVIDER?.replaceAll(' ', '').split(',') || ['credentials'];\n\nconst env = createEnv({\n  /**\n   * Specify your server-side environment variables schema here. This way you can ensure the app\n   * isn't built with invalid env vars.\n   */\n  server: {\n    DATABASE_URL: z.string().url().default('file:../database/db.sqlite'),\n    NEXTAUTH_SECRET:\n      process.env.NODE_ENV === 'production' ? z.string().min(1) : z.string().min(1).optional(),\n    DOCKER_HOST: z.string().optional(),\n    DOCKER_PORT: portSchema,\n    DEMO_MODE: z.string().optional(),\n    DISABLE_UPGRADE_MODAL: zodParsedBoolean().default('false'),\n    HOSTNAME: z.string().optional(),\n\n    //regex allows number with extra letter as time multiplier, applied with secondsFromTimeString\n    AUTH_SESSION_EXPIRY_TIME: z\n      .string()\n      .regex(/^\\d+[smhd]?$/)\n      .optional(),\n\n    // Authentication\n    AUTH_PROVIDER: z\n      .string()\n      .min(1)\n      .default('credentials')\n      .transform((providers) =>\n        providers\n          .replaceAll(' ', '')\n          .toLowerCase()\n          .split(',')\n          .filter((provider) => {\n            if (validAuthProviders.includes(provider)) return provider;\n            else if (!provider)\n              console.log(\n                `One or more of the entries for AUTH_PROVIDER could not be parsed and/or returned null.`\n              );\n            else console.log(`The value entered for AUTH_PROVIDER \"${provider}\" is incorrect.`);\n          })\n      ),\n    // LDAP\n    ...(authProviders.includes('ldap')\n      ? {\n          AUTH_LDAP_URI: z.string().url(),\n          AUTH_LDAP_BIND_DN: z.string(),\n          AUTH_LDAP_BIND_PASSWORD: z.string(),\n          AUTH_LDAP_BASE: z.string(),\n          AUTH_LDAP_SEARCH_SCOPE: z.enum(['base', 'one', 'sub']).default('base'),\n          AUTH_LDAP_USERNAME_ATTRIBUTE: z.string().default('uid'),\n          AUTH_LDAP_USER_MAIL_ATTRIBUTE: z.string().default('mail'),\n          AUTH_LDAP_USERNAME_FILTER_EXTRA_ARG: z.string().optional(),\n          AUTH_LDAP_GROUP_CLASS: z.string().default('groupOfUniqueNames'),\n          AUTH_LDAP_GROUP_MEMBER_ATTRIBUTE: z.string().default('member'),\n          AUTH_LDAP_GROUP_MEMBER_USER_ATTRIBUTE: z.string().default('dn'),\n          AUTH_LDAP_GROUP_FILTER_EXTRA_ARG: z.string().optional(),\n          AUTH_LDAP_ADMIN_GROUP: z.string().default('admin'),\n          AUTH_LDAP_OWNER_GROUP: z.string().default('admin'),\n        }\n      : {}),\n    // OIDC\n    ...(authProviders.includes('oidc')\n      ? {\n          AUTH_OIDC_CLIENT_ID: z.string(),\n          AUTH_OIDC_CLIENT_SECRET: z.string(),\n          AUTH_OIDC_URI: z.string().url(),\n          // Custom Display name, defaults to OIDC\n          AUTH_OIDC_CLIENT_NAME: z.string().default('OIDC'),\n          AUTH_OIDC_ADMIN_GROUP: z.string().default('admin'),\n          AUTH_OIDC_OWNER_GROUP: z.string().default('admin'),\n          AUTH_OIDC_AUTO_LOGIN: zodParsedBoolean(),\n          AUTH_OIDC_SCOPE_OVERWRITE: z.string().default('openid email profile groups'),\n          AUTH_OIDC_TIMEOUT: numberSchema.default('3500'),\n        }\n      : {}),\n  },\n\n  /**\n   * Specify your client-side environment variables schema here. This way you can ensure the app\n   * isn't built with invalid env vars. To expose them to the client, prefix them with\n   * `NEXT_PUBLIC_`.\n   */\n  client: {\n    // NEXT_PUBLIC_CLIENTVAR: z.string().min(1),\n    NEXT_PUBLIC_DISABLE_ANALYTICS: z.string().optional(),\n    NEXT_PUBLIC_PORT: portSchema,\n    NEXT_PUBLIC_NODE_ENV: envSchema,\n    NEXT_PUBLIC_DEFAULT_COLOR_SCHEME: z\n      .string()\n      .toLowerCase()\n      .refine((s) => s === 'light' || s === 'dark')\n      .optional()\n      .default('light'),\n    NEXT_PUBLIC_DOCKER_HOST: z.string().optional(),\n    AUTH_LOGOUT_REDIRECT_URL: z.string().optional(),\n  },\n  /**\n   * You can't destruct `process.env` as a regular object in the Next.js edge runtimes (e.g.\n   * middlewares) or client-side so we need to destruct manually.\n   */\n  runtimeEnv: {\n    DATABASE_URL: process.env.DATABASE_URL,\n    NEXTAUTH_SECRET: process.env.NEXTAUTH_SECRET,\n    NEXT_PUBLIC_DISABLE_ANALYTICS: process.env.DISABLE_ANALYTICS,\n    DOCKER_HOST: process.env.DOCKER_HOST,\n    DOCKER_PORT: process.env.DOCKER_PORT,\n    VERCEL_URL: process.env.VERCEL_URL,\n    NEXT_PUBLIC_DEFAULT_COLOR_SCHEME: process.env.DEFAULT_COLOR_SCHEME,\n    NEXT_PUBLIC_PORT: process.env.PORT,\n    NEXT_PUBLIC_NODE_ENV: process.env.NODE_ENV,\n    HOSTNAME: process.env.HOSTNAME,\n    AUTH_PROVIDER: process.env.AUTH_PROVIDER,\n    AUTH_LDAP_URI: process.env.AUTH_LDAP_URI,\n    AUTH_LDAP_BIND_DN: process.env.AUTH_LDAP_BIND_DN,\n    AUTH_LDAP_BIND_PASSWORD: process.env.AUTH_LDAP_BIND_PASSWORD,\n    AUTH_LDAP_BASE: process.env.AUTH_LDAP_BASE,\n    AUTH_LDAP_SEARCH_SCOPE: process.env.AUTH_LDAP_SEARCH_SCOPE?.toLowerCase(),\n    AUTH_LDAP_USERNAME_ATTRIBUTE: process.env.AUTH_LDAP_USERNAME_ATTRIBUTE,\n    AUTH_LDAP_USER_MAIL_ATTRIBUTE: process.env.AUTH_LDAP_USER_MAIL_ATTRIBUTE,\n    AUTH_LDAP_USERNAME_FILTER_EXTRA_ARG: process.env.AUTH_LDAP_USERNAME_FILTER_EXTRA_ARG,\n    AUTH_LDAP_GROUP_CLASS: process.env.AUTH_LDAP_GROUP_CLASS,\n    AUTH_LDAP_GROUP_MEMBER_ATTRIBUTE: process.env.AUTH_LDAP_GROUP_MEMBER_ATTRIBUTE,\n    AUTH_LDAP_GROUP_MEMBER_USER_ATTRIBUTE: process.env.AUTH_LDAP_GROUP_MEMBER_USER_ATTRIBUTE,\n    AUTH_LDAP_GROUP_FILTER_EXTRA_ARG: process.env.AUTH_LDAP_GROUP_FILTER_EXTRA_ARG,\n    AUTH_LDAP_ADMIN_GROUP: process.env.AUTH_LDAP_ADMIN_GROUP,\n    AUTH_LDAP_OWNER_GROUP: process.env.AUTH_LDAP_OWNER_GROUP,\n    AUTH_OIDC_CLIENT_ID: process.env.AUTH_OIDC_CLIENT_ID,\n    AUTH_OIDC_CLIENT_SECRET: process.env.AUTH_OIDC_CLIENT_SECRET,\n    AUTH_OIDC_URI: process.env.AUTH_OIDC_URI,\n    AUTH_OIDC_CLIENT_NAME: process.env.AUTH_OIDC_CLIENT_NAME,\n    AUTH_OIDC_GROUP_CLAIM: process.env.AUTH_OIDC_GROUP_CLAIM,\n    AUTH_OIDC_ADMIN_GROUP: process.env.AUTH_OIDC_ADMIN_GROUP,\n    AUTH_OIDC_OWNER_GROUP: process.env.AUTH_OIDC_OWNER_GROUP,\n    AUTH_OIDC_AUTO_LOGIN: process.env.AUTH_OIDC_AUTO_LOGIN,\n    AUTH_OIDC_SCOPE_OVERWRITE: process.env.AUTH_OIDC_SCOPE_OVERWRITE,\n    AUTH_OIDC_TIMEOUT: process.env.AUTH_OIDC_TIMEOUT,\n    AUTH_LOGOUT_REDIRECT_URL: process.env.AUTH_LOGOUT_REDIRECT_URL,\n    AUTH_SESSION_EXPIRY_TIME: process.env.AUTH_SESSION_EXPIRY_TIME,\n    DEMO_MODE: process.env.DEMO_MODE,\n    DISABLE_UPGRADE_MODAL: process.env.DISABLE_UPGRADE_MODAL,\n  },\n  skipValidation: !!process.env.SKIP_ENV_VALIDATION,\n});\n\nmodule.exports = {\n  env,\n};\n"
  },
  {
    "path": "src/hooks/custom-session-provider.tsx",
    "content": "import dayjs from 'dayjs';\nimport { Session } from 'next-auth';\nimport { SessionProvider, signIn } from 'next-auth/react';\nimport { createContext, useContext, useEffect } from 'react';\n\ninterface CustomSessionProviderProps {\n  session: Session;\n  children: React.ReactNode;\n  logoutUrl?: string;\n}\n\nexport const CustomSessionProvider = ({\n  session,\n  children,\n  logoutUrl,\n}: CustomSessionProviderProps) => {\n  //Automatically redirect to the login page after a session expires or after 24 days\n  useEffect(() => {\n    if (!session) return () => {};\n    //setTimeout doesn't allow for a number higher than 2147483647 (2³¹-1 , or roughly 24 days)\n    const timeout = setTimeout(signIn, Math.min(dayjs(session.expires).diff(), 2147483647));\n    return () => clearTimeout(timeout);\n  }, [session]);\n\n  return (\n    <SessionProvider session={session} refetchOnWindowFocus={false}>\n      <SessionContext.Provider value={{ logoutUrl }}>{children}</SessionContext.Provider>\n    </SessionProvider>\n  );\n};\n\ninterface SessionContextProps {\n  logoutUrl?: string;\n}\n\nconst SessionContext = createContext<SessionContextProps | null>(null);\n\nexport function useLogoutUrl() {\n  const context = useContext(SessionContext);\n  if (!context) {\n    throw new Error('You cannot use logoutUrl outside of session context.');\n  }\n  return context.logoutUrl;\n}\n"
  },
  {
    "path": "src/hooks/use-colorscheme.tsx",
    "content": "import { ColorScheme as MantineColorScheme } from '@mantine/core';\nimport { useHotkeys } from '@mantine/hooks';\nimport { setCookie } from 'cookies-next';\nimport { Session } from 'next-auth';\nimport { createContext, useContext, useState } from 'react';\nimport { api } from '~/utils/api';\n\nimport { COOKIE_COLOR_SCHEME_KEY } from '../../data/constants';\n\nexport type ColorScheme = 'dark' | 'light' | 'environment';\n\nexport const ColorSchemeContext = createContext<{\n  colorScheme: MantineColorScheme;\n  settings: ColorScheme;\n  toggleColorScheme: () => Promise<void>;\n  setColorScheme: (colorScheme: ColorScheme) => void;\n} | null>(null);\n\ntype ColorSchemeProviderProps = {\n  activeColorScheme: ColorScheme;\n  environmentColorScheme: MantineColorScheme;\n  session: Session;\n  children: (colorScheme: MantineColorScheme) => React.ReactNode;\n};\n\nexport const ColorSchemeProvider = ({\n  activeColorScheme,\n  environmentColorScheme,\n  session,\n  children,\n}: ColorSchemeProviderProps) => {\n  const [colorScheme, setColorScheme] = useState(activeColorScheme);\n  const { mutateAsync } = api.user.changeColorScheme.useMutation();\n\n  const toggleColorScheme = async () => {\n    const newColorScheme = colorScheme === 'dark' ? 'light' : 'dark';\n    setColorScheme(newColorScheme);\n    setCookie(COOKIE_COLOR_SCHEME_KEY, newColorScheme);\n    if (session && new Date(session.expires) > new Date()) {\n      await mutateAsync({ colorScheme: newColorScheme });\n    }\n  };\n\n  const changeColorScheme = (colorScheme: ColorScheme) => setColorScheme(colorScheme);\n\n  useHotkeys([['mod+J', () => void toggleColorScheme()]]);\n\n  const mantineColorScheme = colorScheme === 'environment' ? environmentColorScheme : colorScheme;\n\n  return (\n    <ColorSchemeContext.Provider\n      value={{\n        colorScheme: mantineColorScheme,\n        settings: colorScheme,\n        toggleColorScheme,\n        setColorScheme: changeColorScheme,\n      }}\n    >\n      {children(mantineColorScheme)}\n    </ColorSchemeContext.Provider>\n  );\n};\n\nexport const useColorScheme = () => {\n  const context = useContext(ColorSchemeContext);\n  if (!context) {\n    throw new Error('useColorScheme must be used within a ColorSchemeProvider');\n  }\n  return context;\n};\n"
  },
  {
    "path": "src/hooks/use-resize.ts",
    "content": "import { MutableRefObject, useCallback, useEffect, useState } from 'react';\n\nexport const useResize = (myRef: MutableRefObject<HTMLDivElement | null>, dependencies: any[]) => {\n  const [width, setWidth] = useState(0);\n  const [height, setHeight] = useState(0);\n\n  const handleResize = useCallback(() => {\n    if (!myRef.current) return;\n    setWidth(myRef.current.offsetWidth);\n    setHeight(myRef.current.offsetHeight);\n  }, [myRef]);\n\n  useEffect(() => {\n    window.addEventListener('load', handleResize);\n    window.addEventListener('resize', handleResize);\n\n    return () => {\n      window.removeEventListener('load', handleResize);\n      window.removeEventListener('resize', handleResize);\n    };\n  }, [myRef, handleResize]);\n\n  useEffect(() => {\n    handleResize();\n  }, [myRef, dependencies]);\n\n  return { width, height };\n};\n"
  },
  {
    "path": "src/hooks/useExternalUrl.ts",
    "content": "import { useCallback, useMemo } from 'react';\nimport * as tldts from 'tldts';\nimport { AppType } from '~/types/app';\n\nexport const useGetExternalUrl = () => {\n  if (typeof window === 'undefined') {\n    return (appType: AppType) => appType.behaviour.externalUrl || appType.url;\n  }\n\n  const parsedUrl = useMemo(() => {\n    try {\n      return tldts.parse(window.location.toString());\n    } catch {\n      return null;\n    }\n  }, [window.location]);\n\n  const getHref = useCallback(\n    (appType: AppType) => {\n      if (appType.behaviour.externalUrl.length > 0) {\n        return appType.behaviour.externalUrl\n          .replace('[homarr_base]', `${window.location.protocol}//${window.location.hostname}`)\n          .replace('[homarr_hostname]', parsedUrl?.hostname ?? '')\n          .replace('[homarr_domain]', parsedUrl?.domain ?? '')\n          .replace('[homarr_protocol]', window.location.protocol.replace(':', ''));\n      }\n      return appType.url;\n    },\n    [parsedUrl]\n  );\n\n  return getHref;\n};\n\nexport const useExternalUrl = (app: AppType) => {\n  const getHref = useGetExternalUrl();\n\n  const href = useMemo(() => {\n    return getHref(app);\n  }, [app, getHref]);\n\n  return href;\n};\n"
  },
  {
    "path": "src/hooks/useScreenLargerThan.ts",
    "content": "import { MantineSize, useMantineTheme } from '@mantine/core';\nimport { useMediaQuery } from '@mantine/hooks';\n\nexport const useScreenLargerThan = (size: MantineSize | number) => {\n  const { breakpoints } = useMantineTheme();\n  const pixelCount = typeof size === 'string' ? breakpoints[size] : size;\n  return useMediaQuery(`(min-width: ${pixelCount})`);\n};\n"
  },
  {
    "path": "src/hooks/useScreenSmallerThan.ts",
    "content": "import { MantineSize, useMantineTheme } from '@mantine/core';\nimport { useMediaQuery } from '@mantine/hooks';\n\nexport const useScreenSmallerThan = (size: MantineSize | number) => {\n  const { breakpoints } = useMantineTheme();\n  const pixelCount = typeof size === 'string' ? breakpoints[size] : size;\n  return useMediaQuery(`(max-width: ${pixelCount}px)`);\n};\n"
  },
  {
    "path": "src/hooks/useSetSafeInterval.tsx",
    "content": "import { useEffect, useRef } from 'react';\n\nexport function useSetSafeInterval() {\n  const timers = useRef<NodeJS.Timeout[]>([]);\n\n  function setSafeInterval(callback: () => void, delay: number) {\n    const newInterval = setInterval(callback, delay);\n    timers.current.push(newInterval);\n    return newInterval;\n  }\n\n  useEffect(\n    () => () => {\n      timers.current.forEach((t) => {\n        clearInterval(t);\n      });\n    },\n    []\n  );\n\n  return setSafeInterval;\n}\n"
  },
  {
    "path": "src/middleware.ts",
    "content": "import { NextRequest, NextResponse } from 'next/server';\n\nimport { getUrl } from './tools/server/url';\nimport { client } from './utils/api';\n\nconst skippedUrls = [\n  '/onboard',\n  '/api/',\n  '/_next/',\n  '/favicon.ico',\n  '/404',\n  '/pages/_app',\n  '/auth/login',\n  '/imgs/',\n];\n\nlet cachedUserCount = 0;\n\nexport async function middleware(req: NextRequest) {\n  const url = req.nextUrl.clone();\n\n  // Do not redirect if the url is in the skippedUrls array\n  if (skippedUrls.some((skippedUrl) => url.pathname.startsWith(skippedUrl))) {\n    return NextResponse.next();\n  }\n\n  // Do not redirect if we are on Vercel\n  if (process.env.VERCEL) {\n    return NextResponse.next();\n  }\n\n  // Do not redirect if there are users in the database\n  if (cachedUserCount > 0 || !(await shouldRedirectToOnboard())) {\n    // redirect to login if not logged in\n    // not working, should work in next-auth 5\n    // @see https://github.com/nextauthjs/next-auth/pull/7443\n\n    // const session = await getServerSession();\n    // if (!session?.user) {\n    //   return NextResponse.redirect(getUrl(req) + '/auth/login')\n    // }\n    return NextResponse.next();\n  }\n\n  return NextResponse.redirect(getUrl(req) + '/onboard');\n}\n\nconst shouldRedirectToOnboard = async (): Promise<boolean> => {\n  const cacheAndGetUserCount = async () => {\n    cachedUserCount = await client.user.count.query();\n    return cachedUserCount === 0;\n  };\n\n  return await cacheAndGetUserCount();\n};\n"
  },
  {
    "path": "src/modals.ts",
    "content": "import { ChangeAppPositionModal } from '~/components/Dashboard/Modals/ChangePosition/ChangeAppPositionModal';\nimport { ChangeWidgetPositionModal } from '~/components/Dashboard/Modals/ChangePosition/ChangeWidgetPositionModal';\nimport { EditAppModal } from '~/components/Dashboard/Modals/EditAppModal/EditAppModal';\nimport { SelectElementModal } from '~/components/Dashboard/Modals/SelectElement/SelectElementModal';\nimport { WidgetsEditModal } from '~/components/Dashboard/Tiles/Widgets/WidgetsEditModal';\nimport { WidgetsRemoveModal } from '~/components/Dashboard/Tiles/Widgets/WidgetsRemoveModal';\nimport { CategoryEditModal } from '~/components/Dashboard/Wrappers/Category/CategoryEditModal';\n\nimport { CreateBoardModal } from './components/Manage/Board/create-board.modal';\nimport { DeleteBoardModal } from './components/Manage/Board/delete-board.modal';\nimport { DockerSelectBoardModal } from './components/Manage/Tools/Docker/docker-select-board.modal';\nimport { CopyInviteModal } from './components/Manage/User/Invite/copy-invite.modal';\nimport { CreateInviteModal } from './components/Manage/User/Invite/create-invite.modal';\nimport { DeleteInviteModal } from './components/Manage/User/Invite/delete-invite.modal';\nimport { ChangeUserRoleModal } from './components/Manage/User/change-user-role.modal';\nimport { DeleteUserModal } from './components/Manage/User/delete-user.modal';\n\nexport const modals = {\n  editApp: EditAppModal,\n  selectElement: SelectElementModal,\n  integrationOptions: WidgetsEditModal,\n  integrationRemove: WidgetsRemoveModal,\n  categoryEditModal: CategoryEditModal,\n  changeAppPositionModal: ChangeAppPositionModal,\n  changeIntegrationPositionModal: ChangeWidgetPositionModal,\n  deleteUserModal: DeleteUserModal,\n  createInviteModal: CreateInviteModal,\n  deleteInviteModal: DeleteInviteModal,\n  createBoardModal: CreateBoardModal,\n  copyInviteModal: CopyInviteModal,\n  deleteBoardModal: DeleteBoardModal,\n  changeUserRoleModal: ChangeUserRoleModal,\n  dockerSelectBoardModal: DockerSelectBoardModal\n};\n\ndeclare module '@mantine/modals' {\n  export interface MantineModalsOverride {\n    modals: typeof modals;\n  }\n}\n"
  },
  {
    "path": "src/modules/common/MediaDisplay.tsx",
    "content": "import { Badge, Button, Group, Image, Stack, Text, Title } from '@mantine/core';\nimport { IconDownload, IconExternalLink, IconPlayerPlay } from '@tabler/icons-react';\nimport { useTranslation } from 'next-i18next';\nimport { useState } from 'react';\nimport { useConfigContext } from '~/config/provider';\nimport { useColorTheme } from '~/tools/color';\n\nimport { RequestModal } from '../overseerr/RequestModal';\nimport { Result } from '../overseerr/SearchResult';\n\nexport interface IMedia {\n  overview: string;\n  imdbId?: any;\n  tmdbId?: any;\n  artist?: string;\n  title?: string;\n  type: 'movie' | 'tvshow' | 'book' | 'music' | 'overseer';\n  episodetitle?: string;\n  voteAverage?: string;\n  poster?: string;\n  altPoster?: string;\n  genres: string[];\n  seasonNumber?: number;\n  plexUrl?: string;\n  episodeNumber?: number;\n  [key: string]: any;\n}\n\nexport function OverseerrMediaDisplay(props: any) {\n  const { media }: { media: Result } = props;\n  const { config } = useConfigContext();\n\n  if (!config) {\n    return null;\n  }\n\n  const service = config.apps.find(\n    (service) =>\n      service.integration.type === 'overseerr' || service.integration.type === 'jellyseerr'\n  );\n\n  return (\n    <MediaDisplay\n      media={{\n        ...media,\n        genres: [],\n        overview: media.overview ?? '',\n        title: media.title ?? media.name ?? media.originalName,\n        poster: `https://image.tmdb.org/t/p/w600_and_h900_bestv2/${media.posterPath}`,\n        seasonNumber: media.mediaInfo?.seasons.length,\n        episodetitle: media.title,\n        plexUrl: media.mediaInfo?.plexUrl ?? media.mediaInfo?.mediaUrl,\n        voteAverage: media.voteAverage?.toString(),\n        overseerrResult: media,\n        overseerrId: `${\n          service?.behaviour.externalUrl ? service.behaviour.externalUrl : service?.url\n        }/${media.mediaType}/${media.id}`,\n        type: 'overseer',\n      }}\n    />\n  );\n}\n\nexport function ReadarrMediaDisplay(props: any) {\n  const { media }: { media: any } = props;\n  const { config } = useConfigContext();\n\n  if (!config) {\n    return null;\n  }\n\n  // Find lidarr in services\n  const readarr = config.apps.find((service) => service.integration.type === 'readarr');\n  // Find a poster CoverType\n  const poster = media.images.find((image: any) => image.coverType === 'cover');\n  if (!readarr) {\n    return null;\n  }\n  const baseUrl = readarr.behaviour.externalUrl\n    ? new URL(readarr.behaviour.externalUrl).origin\n    : new URL(readarr.url).origin;\n  // Remove '/' from the end of the lidarr url\n  const fullLink = poster ? `${baseUrl}${poster.url}` : undefined;\n  // Return a movie poster containting the title and the description\n  return (\n    <MediaDisplay\n      media={{\n        ...media,\n        title: media.title,\n        poster: fullLink,\n        artist: media.authorTitle,\n        overview: `new book release by ${media.authorTitle}`,\n        genres: media.genres ?? [],\n        voteAverage: media.ratings.value.toString(),\n        type: 'book',\n      }}\n    />\n  );\n}\n\nexport function LidarrMediaDisplay(props: any) {\n  const { media }: { media: any } = props;\n  const { config } = useConfigContext();\n\n  if (!config) {\n    return null;\n  }\n\n  // Find lidarr in services\n  const lidarr = config.apps.find((service) => service.integration.type === 'lidarr');\n  // Find a poster CoverType\n  const poster = media.images.find((image: any) => image.coverType === 'cover');\n  if (!lidarr) {\n    return null;\n  }\n  const baseUrl = lidarr.behaviour.externalUrl\n    ? new URL(lidarr.behaviour.externalUrl).origin\n    : new URL(lidarr.url).origin;\n  // Remove '/' from the end of the lidarr url\n  const fullLink = poster ? `${baseUrl}${poster.url}` : undefined;\n  // Return a movie poster containting the title and the description\n  return (\n    <MediaDisplay\n      media={{\n        type: 'music',\n        title: media.title,\n        poster: fullLink,\n        artist: media.artist.artistName,\n        overview: media.overview,\n        genres: media.genres,\n      }}\n    />\n  );\n}\n\nexport function RadarrMediaDisplay(props: any) {\n  const { media }: { media: any } = props;\n  const { config } = useConfigContext();\n  const calendar = config?.widgets.find((w) => w.type === 'calendar');\n\n  // Find a poster CoverType\n  const poster = media.images.find((image: any) => image.coverType === 'poster');\n  return (\n    <MediaDisplay\n      media={{\n        ...media,\n        title: media.title ?? media.originalTitle,\n        overview: media.overview ?? '',\n        genres: media.genres ?? [],\n        poster: poster.url,\n        altPoster: poster.remoteUrl,\n        voteAverage: media.ratings.tmdb.value.toString(),\n        imdbId: media.imdbId,\n        type: 'movie',\n      }}\n    />\n  );\n}\n\nexport function SonarrMediaDisplay(props: any) {\n  const { media }: { media: any } = props;\n  const { config } = useConfigContext();\n  const calendar = config?.widgets.find((w) => w.type === 'calendar');\n\n  // Find a poster CoverType\n  const poster = media.series.images.find((image: any) => image.coverType === 'poster');\n  // Return a movie poster containting the title and the description\n  return (\n    <MediaDisplay\n      media={{\n        ...media,\n        genres: media.series.genres ?? [],\n        overview: media.overview ?? media.series.overview ?? '',\n        title: media.series.title,\n        poster: poster.url,\n        altPoster: poster.remoteUrl,\n        episodeNumber: media.episodeNumber,\n        seasonNumber: media.seasonNumber,\n        episodetitle: media.title,\n        imdbId: media.series.imdbId,\n        voteAverage: media.series.ratings.value.toString(),\n        type: 'tvshow',\n      }}\n    />\n  );\n}\n\nexport function MediaDisplay({ media }: { media: IMedia }) {\n  const [opened, setOpened] = useState(false);\n  const { secondaryColor } = useColorTheme();\n  const { t } = useTranslation('modules/common-media-cards');\n\n  return (\n    <Group noWrap style={{ maxHeight: 250, maxWidth: 400 }} p={0} m={0} spacing=\"xs\">\n      <Image src={media.poster?? media.altPoster} height={200} width={150} radius=\"md\" fit=\"cover\" withPlaceholder/>\n      <Stack justify=\"space-around\">\n        <Stack spacing=\"sm\">\n          <Text lineClamp={2}>\n            <Title order={5}>{media.title}</Title>\n          </Text>\n          <Group\n            spacing={5}\n            style={{\n              maxWidth: 250,\n            }}\n          >\n            {media.type === 'tvshow' && (\n              <Badge variant=\"dot\" size=\"xs\" radius=\"md\" color=\"blue\" style={{ maxWidth: 200 }}>\n                s{media.seasonNumber}e{media.episodeNumber} - {media.episodetitle}\n              </Badge>\n            )}\n            {media.type === 'music' && (\n              <Badge variant=\"dot\" size=\"xs\" radius=\"md\" color=\"green\">\n                {media.artist}\n              </Badge>\n            )}\n            {media.type === 'movie' && (\n              <Badge variant=\"dot\" size=\"xs\" radius=\"md\" color=\"orange\">\n                Radarr\n              </Badge>\n            )}\n            {media.type === 'book' && (\n              <Badge variant=\"dot\" size=\"xs\" radius=\"md\" color=\"red\">\n                Readarr\n              </Badge>\n            )}\n            {media.genres.slice(0, 2).map((genre) => (\n              <Badge size=\"xs\" radius=\"md\" key={genre}>\n                {genre}\n              </Badge>\n            ))}\n          </Group>\n          <Text color=\"dimmed\" size=\"xs\" lineClamp={4}>\n            {media.overview}\n          </Text>\n        </Stack>\n        <Group spacing=\"xs\">\n          {media.plexUrl && (\n            <Button\n              component=\"a\"\n              target=\"_blank\"\n              variant=\"outline\"\n              href={media.plexUrl}\n              size=\"sm\"\n              rightIcon={<IconPlayerPlay size={15} />}\n            >\n              {t('buttons.play')}\n            </Button>\n          )}\n          {media.imdbId && (\n            <Button\n              component=\"a\"\n              target=\"_blank\"\n              href={`https://www.imdb.com/title/${media.imdbId}`}\n              variant=\"outline\"\n              size=\"sm\"\n              rightIcon={<IconExternalLink size={15} />}\n            >\n              IMDb\n            </Button>\n          )}\n          {media.overseerrId && (\n            <Button\n              component=\"a\"\n              target=\"_blank\"\n              href={media.overseerrId}\n              variant=\"outline\"\n              size=\"sm\"\n              rightIcon={<IconExternalLink size={15} />}\n            >\n              TMDb\n            </Button>\n          )}\n          {media.type === 'overseer' && !media.overseerrResult?.mediaInfo?.mediaAddedAt && (\n            <>\n              <RequestModal\n                base={media.overseerrResult as Result}\n                opened={opened}\n                setOpened={setOpened}\n              />\n              <Button\n                onClick={() => setOpened(true)}\n                color={secondaryColor}\n                size=\"sm\"\n                rightIcon={<IconDownload size={15} />}\n              >\n                {t('buttons.request')}\n              </Button>\n            </>\n          )}\n        </Group>\n      </Stack>\n    </Group>\n  );\n}\n"
  },
  {
    "path": "src/modules/common/examples/book.json",
    "content": "{\n\t\"title\": \"Mika in Real Life\",\n\t\"authorTitle\": \"jean, emiko Mika in Real Life\",\n\t\"seriesTitle\": \"\",\n\t\"disambiguation\": \"\",\n\t\"authorId\": 1,\n\t\"foreignBookId\": \"93584169\",\n\t\"titleSlug\": \"93584169\",\n\t\"monitored\": true,\n\t\"anyEditionOk\": false,\n\t\"ratings\": {\n\t\t\"votes\": 149,\n\t\t\"value\": 4.15,\n\t\t\"popularity\": 618.35\n\t},\n\t\"releaseDate\": \"2022-08-09T00:00:00Z\",\n\t\"pageCount\": 384,\n\t\"genres\": [\n\t\t\"fiction\",\n\t\t\"romance\",\n\t\t\"contemporary\",\n\t\t\"adult\",\n\t\t\"adult-fiction\",\n\t\t\"chick-lit\",\n\t\t\"womens-fiction\",\n\t\t\"asian-literature\",\n\t\t\"family\",\n\t\t\"lgbt\"\n\t],\n\t\"images\": [\n\t\t{\n\t\t\t\"url\": \"/MediaCover/Books/1/cover.jpg?lastWrite=637899714580000000\",\n\t\t\t\"coverType\": \"cover\",\n\t\t\t\"extension\": \".jpg\"\n\t\t}\n\t],\n\t\"links\": [\n\t\t{\n\t\t\t\"url\": \"https://www.goodreads.com/work/editions/93584169\",\n\t\t\t\"name\": \"Goodreads Editions\"\n\t\t},\n\t\t{\n\t\t\t\"url\": \"https://www.goodreads.com/book/show/59430548-mika-in-real-life\",\n\t\t\t\"name\": \"Goodreads Book\"\n\t\t}\n\t],\n\t\"statistics\": {\n\t\t\"bookFileCount\": 0,\n\t\t\"bookCount\": 0,\n\t\t\"totalBookCount\": 1,\n\t\t\"sizeOnDisk\": 0,\n\t\t\"percentOfBooks\": 0\n\t},\n\t\"added\": \"2022-08-07T20:48:09Z\",\n\t\"grabbed\": false,\n\t\"id\": 1\n}"
  },
  {
    "path": "src/modules/common/examples/movie.json",
    "content": "{\n\t\"title\": \"The Tunnel to Summer, the Exit of Goodbyes\",\n\t\"originalTitle\": \"夏へのトンネル、さよならの出口\",\n\t\"originalLanguage\": {\n\t\t\"id\": 8,\n\t\t\"name\": \"Japanese\"\n\t},\n\t\"alternateTitles\": [\n\t\t{\n\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\"movieId\": 1,\n\t\t\t\"title\": \"Natsu e no Tunnel, Sayonara no Deguchi\",\n\t\t\t\"sourceId\": 0,\n\t\t\t\"votes\": 0,\n\t\t\t\"voteCount\": 0,\n\t\t\t\"language\": {\n\t\t\t\t\"id\": 1,\n\t\t\t\t\"name\": \"English\"\n\t\t\t},\n\t\t\t\"id\": 1\n\t\t}\n\t],\n\t\"secondaryYearSourceId\": 0,\n\t\"sortTitle\": \"tunnel to summer exit goodbyes\",\n\t\"sizeOnDisk\": 0,\n\t\"status\": \"announced\",\n\t\"overview\": \"Tono Kaoru heard a rumor: The laws of space and time mean nothing to the Urashima Tunnel. If you find it, walk through and you'll find your heart's desire on the other side...in exchange for years of your own life. On the night Kaoru just so happens to find himself standing in front of a tunnel that looks suspiciously like the one the rumor describes, he finds himself thinking of Karen, the sister he lost in an accident five years ago. To Kaoru's surprise, he's been followed by the new transfer student Anzu Hanaki, who promises to help him experiment with the mysterious tunnel--but what does she want from Kaoru in exchange? And what will he have left to give, after the tunnel's done with him?\",\n\t\"inCinemas\": \"2022-09-09T00:00:00Z\",\n\t\"images\": [\n\t\t{\n\t\t\t\"coverType\": \"poster\",\n\t\t\t\"url\": \"https://image.tmdb.org/t/p/original/3x5gc6dHsfNqZryipu159IALEPH.jpg\"\n\t\t},\n\t\t{\n\t\t\t\"coverType\": \"fanart\",\n\t\t\t\"url\": \"https://image.tmdb.org/t/p/original/zO3QSYs858SqiapafD7iJp17KVD.jpg\"\n\t\t}\n\t],\n\t\"website\": \"https://natsuton.com/\",\n\t\"year\": 2022,\n\t\"hasFile\": false,\n\t\"youTubeTrailerId\": \"\",\n\t\"studio\": \"Pony Canyon\",\n\t\"path\": \"/data/Library/Movies/The Tunnel to Summer, the Exit of Goodbyes (2022)\",\n\t\"qualityProfileId\": 4,\n\t\"monitored\": true,\n\t\"minimumAvailability\": \"announced\",\n\t\"isAvailable\": true,\n\t\"folderName\": \"/data/Library/Movies/The Tunnel to Summer, the Exit of Goodbyes (2022)\",\n\t\"runtime\": 0,\n\t\"cleanTitle\": \"thetunneltosummerexitgoodbyes\",\n\t\"imdbId\": \"tt17382524\",\n\t\"tmdbId\": 916192,\n\t\"titleSlug\": \"916192\",\n\t\"genres\": [\n\t\t\"Animation\",\n\t\t\"Drama\",\n\t\t\"Mystery\"\n\t],\n\t\"tags\": [],\n\t\"added\": \"2022-07-05T07:50:42Z\",\n\t\"ratings\": {\n\t\t\"tmdb\": {\n\t\t\t\"votes\": 0,\n\t\t\t\"value\": 0,\n\t\t\t\"type\": \"user\"\n\t\t}\n\t},\n\t\"id\": 1\n}"
  },
  {
    "path": "src/modules/common/examples/multiplemovies.json",
    "content": "[\n\t{\n\t\t\"title\": \"Sword Art Online the Movie -Progressive- Aria of a Starless Night\",\n\t\t\"originalTitle\": \"劇場版 ソードアート・オンライン-プログレッシブ- 星なき夜のアリア\",\n\t\t\"originalLanguage\": {\n\t\t\t\"id\": 8,\n\t\t\t\"name\": \"Japanese\"\n\t\t},\n\t\t\"alternateTitles\": [\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 170,\n\t\t\t\t\"title\": \"Gekijō-ban Sword Art Online: Progressive Hoshi Naki Yoru no Aria\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1749\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 170,\n\t\t\t\t\"title\": \"SAO Progressive\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1751\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 170,\n\t\t\t\t\"title\": \"Gekijouban Sword Art Online: Progressive - Hoshinaki Yoru no Ari\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1752\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 170,\n\t\t\t\t\"title\": \"Sōdo Āto Onrain\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1753\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 170,\n\t\t\t\t\"title\": \"Sword Art Online the Movie: The Aria of the Night Without Stars\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1754\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 170,\n\t\t\t\t\"title\": \"극장판 소드 아트 온라인 -프로그레시브-: 별 없는 밤의 아리아\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1755\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 170,\n\t\t\t\t\"title\": \"소드 아트 온라인 프로그레시브\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1756\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 170,\n\t\t\t\t\"title\": \"Sword Art Online: Progressive - Aria of a Starless Night\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1757\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 170,\n\t\t\t\t\"title\": \"刀劍神域劇場版 - PROGRESSIVE - 無星夜的詠嘆調\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1758\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 170,\n\t\t\t\t\"title\": \"ซอร์ดอาร์ตออนไลน์ โปรเกรสซีฟ เดอะมูฟวี่\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 28,\n\t\t\t\t\t\"name\": \"Thai\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1759\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 170,\n\t\t\t\t\"title\": \"剧场版 刀剑神域 进击篇 无星之夜的咏叹调\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1760\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 170,\n\t\t\t\t\"title\": \"Sword Art Online Progressive: Ária de Uma Noite Sem Estrelas\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1761\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 170,\n\t\t\t\t\"title\": \"刀剑神域 进击篇 无星夜的咏叹调\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1776\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 170,\n\t\t\t\t\"title\": \"Sword Art Online Progressive Movie: Hoshi Naki Yoru no Aria\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1788\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 170,\n\t\t\t\t\"title\": \"刀剑神域：无星之夜的咏叹调\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1826\n\t\t\t}\n\t\t],\n\t\t\"secondaryYearSourceId\": 0,\n\t\t\"sortTitle\": \"sword art online movie progressive aria starless night\",\n\t\t\"sizeOnDisk\": 0,\n\t\t\"status\": \"released\",\n\t\t\"overview\": \"One month after Kayaba Akihiko's game of death began, the death toll continues to rise, two thousand players having already lost their lives to the ultra-difficult VRMMO world of Sword Art Online. On the day of the strategy meeting to plan out the first-floor boss battle, Kirito, a solo player who vows to fight alone to get stronger, runs into a rare, high-level female player. She gracefully dispatches powerful monsters with a single rapier that flashes like a shooting star in the night...\",\n\t\t\"inCinemas\": \"2021-10-30T00:00:00Z\",\n\t\t\"physicalRelease\": \"2022-07-08T00:00:00Z\",\n\t\t\"images\": [\n\t\t\t{\n\t\t\t\t\"coverType\": \"poster\",\n\t\t\t\t\"url\": \"https://image.tmdb.org/t/p/original/yD9RhgIVydQNBK7OLEbCWYcWMUd.jpg\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"coverType\": \"fanart\",\n\t\t\t\t\"url\": \"https://image.tmdb.org/t/p/original/2kvl6lcgoyAaf8cSRkzxE611u6T.jpg\"\n\t\t\t}\n\t\t],\n\t\t\"website\": \"https://sao-p.net\",\n\t\t\"year\": 2021,\n\t\t\"hasFile\": false,\n\t\t\"youTubeTrailerId\": \"Jf6RyZkuVco\",\n\t\t\"studio\": \"Aniplex\",\n\t\t\"path\": \"/movies/Sword Art Online the Movie -Progressive- Aria of a Starless Night (2021)\",\n\t\t\"qualityProfileId\": 1,\n\t\t\"monitored\": true,\n\t\t\"minimumAvailability\": \"released\",\n\t\t\"isAvailable\": true,\n\t\t\"folderName\": \"/movies/Sword Art Online the Movie -Progressive- Aria of a Starless Night (2021)\",\n\t\t\"runtime\": 97,\n\t\t\"cleanTitle\": \"swordartonlinemovieprogressiveariastarlessnight\",\n\t\t\"imdbId\": \"tt13424422\",\n\t\t\"tmdbId\": 761898,\n\t\t\"titleSlug\": \"761898\",\n\t\t\"certification\": \"PG-13\",\n\t\t\"genres\": [\n\t\t\t\"Animation\",\n\t\t\t\"Action\",\n\t\t\t\"Fantasy\"\n\t\t],\n\t\t\"tags\": [],\n\t\t\"added\": \"2022-07-04T17:05:05Z\",\n\t\t\"ratings\": {\n\t\t\t\"imdb\": {\n\t\t\t\t\"votes\": 1048,\n\t\t\t\t\"value\": 7.1,\n\t\t\t\t\"type\": \"user\"\n\t\t\t},\n\t\t\t\"tmdb\": {\n\t\t\t\t\"votes\": 82,\n\t\t\t\t\"value\": 8.341,\n\t\t\t\t\"type\": \"user\"\n\t\t\t}\n\t\t},\n\t\t\"collection\": {\n\t\t\t\"name\": \"Sword Art Online the Movie -Progressive-\",\n\t\t\t\"tmdbId\": 893713,\n\t\t\t\"images\": []\n\t\t},\n\t\t\"id\": 170\n\t},\n\t{\n\t\t\"title\": \"Jujutsu Kaisen 0\",\n\t\t\"originalTitle\": \"劇場版 呪術廻戦 0\",\n\t\t\"originalLanguage\": {\n\t\t\t\"id\": 8,\n\t\t\t\"name\": \"Japanese\"\n\t\t},\n\t\t\"alternateTitles\": [\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 164,\n\t\t\t\t\"title\": \"Gekijō-ban Jujutsu Kaisen 0\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1672\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 164,\n\t\t\t\t\"title\": \"Gekijou-ban Jujutsu Kaisen 0\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1673\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 164,\n\t\t\t\t\"title\": \"극장판 주술회전 0\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1674\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 164,\n\t\t\t\t\"title\": \"Jujutsu Kaisen 0: The Movie\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1675\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 164,\n\t\t\t\t\"title\": \"呪術廻戦 0\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1676\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 164,\n\t\t\t\t\"title\": \"JUJUTSU KAISEN 0 the Movie\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1677\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 164,\n\t\t\t\t\"title\": \"劇場版 咒術迴戰 0\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1678\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 164,\n\t\t\t\t\"title\": \"Jujutsu Kaisen 0: Film\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 12,\n\t\t\t\t\t\"name\": \"Polish\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1845\n\t\t\t}\n\t\t],\n\t\t\"secondaryYearSourceId\": 0,\n\t\t\"sortTitle\": \"jujutsu kaisen 0\",\n\t\t\"sizeOnDisk\": 0,\n\t\t\"status\": \"inCinemas\",\n\t\t\"overview\": \"Yuta Okkotsu is a nervous high school student who is suffering from a serious problem—his childhood friend Rika has turned into a curse and won't leave him alone. Since Rika is no ordinary curse, his plight is noticed by Satoru Gojo, a teacher at Jujutsu High, a school where fledgling exorcists learn how to combat curses. Gojo convinces Yuta to enroll, but can he learn enough in time to confront the curse that haunts him?\",\n\t\t\"inCinemas\": \"2021-12-24T00:00:00Z\",\n\t\t\"physicalRelease\": \"2022-09-21T00:00:00Z\",\n\t\t\"digitalRelease\": \"2022-09-21T00:00:00Z\",\n\t\t\"images\": [\n\t\t\t{\n\t\t\t\t\"coverType\": \"poster\",\n\t\t\t\t\"url\": \"https://image.tmdb.org/t/p/original/3pTwMUEavTzVOh6yLN0aEwR7uSy.jpg\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"coverType\": \"fanart\",\n\t\t\t\t\"url\": \"https://image.tmdb.org/t/p/original/t9K8ycUBCplWiICDOKRNRYcEH9e.jpg\"\n\t\t\t}\n\t\t],\n\t\t\"website\": \"\",\n\t\t\"year\": 2021,\n\t\t\"hasFile\": false,\n\t\t\"youTubeTrailerId\": \"2docezZl574\",\n\t\t\"studio\": \"Toho\",\n\t\t\"path\": \"/movies/Jujutsu Kaisen 0 (2021)\",\n\t\t\"qualityProfileId\": 1,\n\t\t\"monitored\": true,\n\t\t\"minimumAvailability\": \"released\",\n\t\t\"isAvailable\": false,\n\t\t\"folderName\": \"/movies/Jujutsu Kaisen 0 (2021)\",\n\t\t\"runtime\": 105,\n\t\t\"cleanTitle\": \"jujutsukaisen0\",\n\t\t\"imdbId\": \"tt14331144\",\n\t\t\"tmdbId\": 810693,\n\t\t\"titleSlug\": \"810693\",\n\t\t\"certification\": \"PG-13\",\n\t\t\"genres\": [\n\t\t\t\"Animation\",\n\t\t\t\"Action\",\n\t\t\t\"Fantasy\"\n\t\t],\n\t\t\"tags\": [],\n\t\t\"added\": \"2022-06-27T13:00:43Z\",\n\t\t\"ratings\": {\n\t\t\t\"imdb\": {\n\t\t\t\t\"votes\": 11063,\n\t\t\t\t\"value\": 7.9,\n\t\t\t\t\"type\": \"user\"\n\t\t\t},\n\t\t\t\"tmdb\": {\n\t\t\t\t\"votes\": 241,\n\t\t\t\t\"value\": 7.8,\n\t\t\t\t\"type\": \"user\"\n\t\t\t},\n\t\t\t\"metacritic\": {\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"value\": 72,\n\t\t\t\t\"type\": \"user\"\n\t\t\t},\n\t\t\t\"rottenTomatoes\": {\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"value\": 98,\n\t\t\t\t\"type\": \"user\"\n\t\t\t}\n\t\t},\n\t\t\"id\": 164\n\t},\n\t{\n\t\t\"title\": \"Morbius\",\n\t\t\"originalTitle\": \"Morbius\",\n\t\t\"originalLanguage\": {\n\t\t\t\"id\": 1,\n\t\t\t\"name\": \"English\"\n\t\t},\n\t\t\"alternateTitles\": [\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 113,\n\t\t\t\t\"title\": \"Morbiuss\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1484\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 113,\n\t\t\t\t\"title\": \"暗夜博士：莫比亚斯\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1600\n\t\t\t}\n\t\t],\n\t\t\"secondaryYearSourceId\": 0,\n\t\t\"sortTitle\": \"morbius\",\n\t\t\"sizeOnDisk\": 2130913775,\n\t\t\"status\": \"released\",\n\t\t\"overview\": \"Dangerously ill with a rare blood disorder, and determined to save others suffering his same fate, Dr. Michael Morbius attempts a desperate gamble. What at first appears to be a radical success soon reveals itself to be a remedy potentially worse than the disease.\",\n\t\t\"inCinemas\": \"2022-03-30T00:00:00Z\",\n\t\t\"physicalRelease\": \"2022-06-14T00:00:00Z\",\n\t\t\"digitalRelease\": \"2022-05-14T00:00:00Z\",\n\t\t\"images\": [\n\t\t\t{\n\t\t\t\t\"coverType\": \"poster\",\n\t\t\t\t\"url\": \"https://image.tmdb.org/t/p/original/6JjfSchsU6daXk2AKX8EEBjO3Fm.jpg\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"coverType\": \"fanart\",\n\t\t\t\t\"url\": \"https://image.tmdb.org/t/p/original/gG9fTyDL03fiKnOpf2tr01sncnt.jpg\"\n\t\t\t}\n\t\t],\n\t\t\"website\": \"https://www.morbius.movie/\",\n\t\t\"year\": 2022,\n\t\t\"hasFile\": true,\n\t\t\"youTubeTrailerId\": \"wG2TjtueeSU\",\n\t\t\"studio\": \"Columbia Pictures\",\n\t\t\"path\": \"/movies/Morbius (2022)\",\n\t\t\"qualityProfileId\": 1,\n\t\t\"monitored\": true,\n\t\t\"minimumAvailability\": \"released\",\n\t\t\"isAvailable\": true,\n\t\t\"folderName\": \"/movies/Morbius (2022)\",\n\t\t\"runtime\": 105,\n\t\t\"cleanTitle\": \"morbius\",\n\t\t\"imdbId\": \"tt5108870\",\n\t\t\"tmdbId\": 526896,\n\t\t\"titleSlug\": \"526896\",\n\t\t\"certification\": \"PG-13\",\n\t\t\"genres\": [\n\t\t\t\"Action\",\n\t\t\t\"Science Fiction\",\n\t\t\t\"Fantasy\"\n\t\t],\n\t\t\"tags\": [],\n\t\t\"added\": \"2022-02-11T19:39:55Z\",\n\t\t\"ratings\": {\n\t\t\t\"imdb\": {\n\t\t\t\t\"votes\": 92720,\n\t\t\t\t\"value\": 5.2,\n\t\t\t\t\"type\": \"user\"\n\t\t\t},\n\t\t\t\"tmdb\": {\n\t\t\t\t\"votes\": 2174,\n\t\t\t\t\"value\": 6.4,\n\t\t\t\t\"type\": \"user\"\n\t\t\t},\n\t\t\t\"metacritic\": {\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"value\": 35,\n\t\t\t\t\"type\": \"user\"\n\t\t\t},\n\t\t\t\"rottenTomatoes\": {\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"value\": 16,\n\t\t\t\t\"type\": \"user\"\n\t\t\t}\n\t\t},\n\t\t\"movieFile\": {\n\t\t\t\"movieId\": 113,\n\t\t\t\"relativePath\": \"Morbius (2022) WEBRip-1080p.mp4\",\n\t\t\t\"path\": \"/movies/Morbius (2022)/Morbius (2022) WEBRip-1080p.mp4\",\n\t\t\t\"size\": 2130913775,\n\t\t\t\"dateAdded\": \"2022-05-17T03:04:01Z\",\n\t\t\t\"sceneName\": \"Morbius.2022.1080p.WEBRip.x264-RARBG\",\n\t\t\t\"indexerFlags\": 1,\n\t\t\t\"quality\": {\n\t\t\t\t\"quality\": {\n\t\t\t\t\t\"id\": 15,\n\t\t\t\t\t\"name\": \"WEBRip-1080p\",\n\t\t\t\t\t\"source\": \"webrip\",\n\t\t\t\t\t\"resolution\": 1080,\n\t\t\t\t\t\"modifier\": \"none\"\n\t\t\t\t},\n\t\t\t\t\"revision\": {\n\t\t\t\t\t\"version\": 1,\n\t\t\t\t\t\"real\": 0,\n\t\t\t\t\t\"isRepack\": false\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"mediaInfo\": {\n\t\t\t\t\"audioBitrate\": 224000,\n\t\t\t\t\"audioChannels\": 5.1,\n\t\t\t\t\"audioCodec\": \"AAC\",\n\t\t\t\t\"audioLanguages\": \"eng\",\n\t\t\t\t\"audioStreamCount\": 1,\n\t\t\t\t\"videoBitDepth\": 8,\n\t\t\t\t\"videoBitrate\": 2498238,\n\t\t\t\t\"videoCodec\": \"x264\",\n\t\t\t\t\"videoDynamicRangeType\": \"\",\n\t\t\t\t\"videoFps\": 23.976,\n\t\t\t\t\"resolution\": \"1920x800\",\n\t\t\t\t\"runTime\": \"1:44:09\",\n\t\t\t\t\"scanType\": \"Progressive\",\n\t\t\t\t\"subtitles\": \"\"\n\t\t\t},\n\t\t\t\"originalFilePath\": \"Morbius.2022.1080p.WEBRip.x264-RARBG/Morbius.2022.1080p.WEBRip.x264-RARBG.mp4\",\n\t\t\t\"qualityCutoffNotMet\": false,\n\t\t\t\"languages\": [\n\t\t\t\t{\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t}\n\t\t\t],\n\t\t\t\"releaseGroup\": \"RARBG\",\n\t\t\t\"edition\": \"\",\n\t\t\t\"id\": 219\n\t\t},\n\t\t\"id\": 113\n\t},\n\t{\n\t\t\"title\": \"Rise\",\n\t\t\"originalTitle\": \"En corps\",\n\t\t\"originalLanguage\": {\n\t\t\t\"id\": 2,\n\t\t\t\"name\": \"French\"\n\t\t},\n\t\t\"alternateTitles\": [],\n\t\t\"secondaryYearSourceId\": 0,\n\t\t\"sortTitle\": \"rise\",\n\t\t\"sizeOnDisk\": 0,\n\t\t\"status\": \"released\",\n\t\t\"overview\": \"Elise thought she had the perfect life: an ideal boyfriend and a promising career as a ballet dancer. It all falls apart the day she catches him cheating on her with her stage backup; and after she suffers an injury on stage, it seems like she might not be able to dance ever again.  A heartwarming and inspiring story that tells us how sometimes, the worst thing that could happen may turn out to be the best.\",\n\t\t\"inCinemas\": \"2022-03-30T00:00:00Z\",\n\t\t\"physicalRelease\": \"2022-08-03T00:00:00Z\",\n\t\t\"digitalRelease\": \"2022-07-30T00:00:00Z\",\n\t\t\"images\": [\n\t\t\t{\n\t\t\t\t\"coverType\": \"poster\",\n\t\t\t\t\"url\": \"https://image.tmdb.org/t/p/original/9lbVcQfSfcMewo03UM7knSvN31T.jpg\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"coverType\": \"fanart\",\n\t\t\t\t\"url\": \"https://image.tmdb.org/t/p/original/duCaYLwr7LOhGTcyhcZP94rd2BS.jpg\"\n\t\t\t}\n\t\t],\n\t\t\"website\": \"\",\n\t\t\"year\": 2022,\n\t\t\"hasFile\": false,\n\t\t\"youTubeTrailerId\": \"\",\n\t\t\"studio\": \"France 2 Cinéma\",\n\t\t\"path\": \"/movies/Rise (2022)\",\n\t\t\"qualityProfileId\": 1,\n\t\t\"monitored\": true,\n\t\t\"minimumAvailability\": \"released\",\n\t\t\"isAvailable\": true,\n\t\t\"folderName\": \"/movies/Rise (2022)\",\n\t\t\"runtime\": 117,\n\t\t\"cleanTitle\": \"rise\",\n\t\t\"imdbId\": \"tt13531468\",\n\t\t\"tmdbId\": 771077,\n\t\t\"titleSlug\": \"771077\",\n\t\t\"genres\": [\n\t\t\t\"Comedy\",\n\t\t\t\"Drama\"\n\t\t],\n\t\t\"tags\": [],\n\t\t\"added\": \"2022-03-29T14:52:43Z\",\n\t\t\"ratings\": {\n\t\t\t\"imdb\": {\n\t\t\t\t\"votes\": 818,\n\t\t\t\t\"value\": 7.5,\n\t\t\t\t\"type\": \"user\"\n\t\t\t},\n\t\t\t\"tmdb\": {\n\t\t\t\t\"votes\": 167,\n\t\t\t\t\"value\": 7.913,\n\t\t\t\t\"type\": \"user\"\n\t\t\t}\n\t\t},\n\t\t\"id\": 147\n\t},\n\t{\n\t\t\"title\": \"Fantastic Beasts: The Secrets of Dumbledore\",\n\t\t\"originalTitle\": \"Fantastic Beasts: The Secrets of Dumbledore\",\n\t\t\"originalLanguage\": {\n\t\t\t\"id\": 1,\n\t\t\t\"name\": \"English\"\n\t\t},\n\t\t\"alternateTitles\": [\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 121,\n\t\t\t\t\"title\": \"Фантастические твари и где они обитают 3\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 11,\n\t\t\t\t\t\"name\": \"Russian\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1251\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 121,\n\t\t\t\t\"title\": \"Φανταστικά Ζώα και που Βρίσκονται 3\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1252\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 121,\n\t\t\t\t\"title\": \"Les Animaux fantastiques - 3e partie\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 2,\n\t\t\t\t\t\"name\": \"French\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1253\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 121,\n\t\t\t\t\"title\": \"Fantastic Beasts 3\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1255\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 121,\n\t\t\t\t\"title\": \"Fantastická zvířata 3\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1256\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 121,\n\t\t\t\t\"title\": \"Фантастичні звірі 3\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1257\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 121,\n\t\t\t\t\"title\": \"Fantastiske Skabninger: Dumbledores Hemmeligheder\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1258\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 121,\n\t\t\t\t\"title\": \"怪獸與鄧不利多的秘密\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1453\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 121,\n\t\t\t\t\"title\": \"Fantastyczne zwierzęta: Tajemnice Dumbledore'a\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 12,\n\t\t\t\t\t\"name\": \"Polish\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1482\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 121,\n\t\t\t\t\"title\": \"Fantastiskās būtnes: Dumidora noslēpumi\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1483\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 121,\n\t\t\t\t\"title\": \"Animales Fantásticos: Los Secretos de Dumbledore\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1540\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 121,\n\t\t\t\t\"title\": \"Fantastic Beasts 3 - The Secrets of Dumbledore\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1595\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 121,\n\t\t\t\t\"title\": \"Animali Fantastici - I Segreti Di Silente\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 5,\n\t\t\t\t\t\"name\": \"Italian\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1638\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 121,\n\t\t\t\t\"title\": \"Animali Fantastici 3 I Segreti Di Silente\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 5,\n\t\t\t\t\t\"name\": \"Italian\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1639\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 121,\n\t\t\t\t\"title\": \"Les Animaux fantastiques 3 - Les Secrets de Dumbledore\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 2,\n\t\t\t\t\t\"name\": \"French\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1774\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 121,\n\t\t\t\t\"title\": \"神奇动物3：邓布利多之谜\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1823\n\t\t\t}\n\t\t],\n\t\t\"secondaryYearSourceId\": 0,\n\t\t\"sortTitle\": \"fantastic beasts secrets dumbledore\",\n\t\t\"sizeOnDisk\": 9631363612,\n\t\t\"status\": \"released\",\n\t\t\"overview\": \"Professor Albus Dumbledore knows the powerful, dark wizard Gellert Grindelwald is moving to seize control of the wizarding world. Unable to stop him alone, he entrusts magizoologist Newt Scamander to lead an intrepid team of wizards and witches. They soon encounter an array of old and new beasts as they clash with Grindelwald's growing legion of followers.\",\n\t\t\"inCinemas\": \"2022-04-06T00:00:00Z\",\n\t\t\"physicalRelease\": \"2022-06-28T00:00:00Z\",\n\t\t\"digitalRelease\": \"2022-05-30T00:00:00Z\",\n\t\t\"images\": [\n\t\t\t{\n\t\t\t\t\"coverType\": \"poster\",\n\t\t\t\t\"url\": \"https://image.tmdb.org/t/p/original/3c5GNLB4yRSLBby0trHoA1DSQxQ.jpg\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"coverType\": \"fanart\",\n\t\t\t\t\"url\": \"https://image.tmdb.org/t/p/original/zGLHX92Gk96O1DJvLil7ObJTbaL.jpg\"\n\t\t\t}\n\t\t],\n\t\t\"website\": \"https://www.fantasticbeasts.com\",\n\t\t\"year\": 2022,\n\t\t\"hasFile\": true,\n\t\t\"youTubeTrailerId\": \"Fo6TfHkLW6Y\",\n\t\t\"studio\": \"Warner Bros. Pictures\",\n\t\t\"path\": \"/movies/Fantastic Beasts The Secrets of Dumbledore (2022)\",\n\t\t\"qualityProfileId\": 1,\n\t\t\"monitored\": true,\n\t\t\"minimumAvailability\": \"released\",\n\t\t\"isAvailable\": true,\n\t\t\"folderName\": \"/movies/Fantastic Beasts The Secrets of Dumbledore (2022)\",\n\t\t\"runtime\": 142,\n\t\t\"cleanTitle\": \"fantasticbeastssecretsdumbledore\",\n\t\t\"imdbId\": \"tt4123432\",\n\t\t\"tmdbId\": 338953,\n\t\t\"titleSlug\": \"338953\",\n\t\t\"certification\": \"PG-13\",\n\t\t\"genres\": [\n\t\t\t\"Fantasy\",\n\t\t\t\"Adventure\",\n\t\t\t\"Action\"\n\t\t],\n\t\t\"tags\": [],\n\t\t\"added\": \"2022-03-04T21:08:32Z\",\n\t\t\"ratings\": {\n\t\t\t\"imdb\": {\n\t\t\t\t\"votes\": 118753,\n\t\t\t\t\"value\": 6.2,\n\t\t\t\t\"type\": \"user\"\n\t\t\t},\n\t\t\t\"tmdb\": {\n\t\t\t\t\"votes\": 2455,\n\t\t\t\t\"value\": 6.864,\n\t\t\t\t\"type\": \"user\"\n\t\t\t},\n\t\t\t\"metacritic\": {\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"value\": 47,\n\t\t\t\t\"type\": \"user\"\n\t\t\t},\n\t\t\t\"rottenTomatoes\": {\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"value\": 46,\n\t\t\t\t\"type\": \"user\"\n\t\t\t}\n\t\t},\n\t\t\"movieFile\": {\n\t\t\t\"movieId\": 121,\n\t\t\t\"relativePath\": \"Fantastic Beasts The Secrets of Dumbledore (2022) WEBDL-1080p.mkv\",\n\t\t\t\"path\": \"/movies/Fantastic Beasts The Secrets of Dumbledore (2022)/Fantastic Beasts The Secrets of Dumbledore (2022) WEBDL-1080p.mkv\",\n\t\t\t\"size\": 9631363612,\n\t\t\t\"dateAdded\": \"2022-05-30T09:12:04Z\",\n\t\t\t\"sceneName\": \"Fantastic.Beasts.The.Secrets.of.Dumbledore.2022.1080p.HMAX.WEBRip.DDP5.1.Atmos.x264-SMURF\",\n\t\t\t\"indexerFlags\": 1,\n\t\t\t\"quality\": {\n\t\t\t\t\"quality\": {\n\t\t\t\t\t\"id\": 3,\n\t\t\t\t\t\"name\": \"WEBDL-1080p\",\n\t\t\t\t\t\"source\": \"webdl\",\n\t\t\t\t\t\"resolution\": 1080,\n\t\t\t\t\t\"modifier\": \"none\"\n\t\t\t\t},\n\t\t\t\t\"revision\": {\n\t\t\t\t\t\"version\": 1,\n\t\t\t\t\t\"real\": 0,\n\t\t\t\t\t\"isRepack\": false\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"mediaInfo\": {\n\t\t\t\t\"audioBitrate\": 768000,\n\t\t\t\t\"audioChannels\": 5.1,\n\t\t\t\t\"audioCodec\": \"EAC3 Atmos\",\n\t\t\t\t\"audioLanguages\": \"eng\",\n\t\t\t\t\"audioStreamCount\": 1,\n\t\t\t\t\"videoBitDepth\": 8,\n\t\t\t\t\"videoBitrate\": 0,\n\t\t\t\t\"videoCodec\": \"x264\",\n\t\t\t\t\"videoDynamicRangeType\": \"\",\n\t\t\t\t\"videoFps\": 23.976,\n\t\t\t\t\"resolution\": \"1920x816\",\n\t\t\t\t\"runTime\": \"2:22:39\",\n\t\t\t\t\"scanType\": \"Progressive\",\n\t\t\t\t\"subtitles\": \"eng/eng/bul/cze/dan/spa/spa/fin/hrv/hun/mac/dut/nor/pol/por/por/rum/slo/slv/srp/swe/spa\"\n\t\t\t},\n\t\t\t\"originalFilePath\": \"Fantastic.Beasts.The.Secrets.of.Dumbledore.2022.1080p.HMAX.WEBRip.DDP5.1.Atmos.x264-SMURF/Fantastic.Beasts.The.Secrets.of.Dumbledore.2022.1080p.HMAX.WEB-DL.DDP5.1.Atmos.H.264-SMURF.mkv\",\n\t\t\t\"qualityCutoffNotMet\": false,\n\t\t\t\"languages\": [\n\t\t\t\t{\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t}\n\t\t\t],\n\t\t\t\"releaseGroup\": \"SMURF\",\n\t\t\t\"edition\": \"\",\n\t\t\t\"id\": 223\n\t\t},\n\t\t\"collection\": {\n\t\t\t\"name\": \"Fantastic Beasts Collection\",\n\t\t\t\"tmdbId\": 435259,\n\t\t\t\"images\": []\n\t\t},\n\t\t\"id\": 121\n\t},\n\t{\n\t\t\"title\": \"Doctor Strange in the Multiverse of Madness\",\n\t\t\"originalTitle\": \"Doctor Strange in the Multiverse of Madness\",\n\t\t\"originalLanguage\": {\n\t\t\t\"id\": 1,\n\t\t\t\"name\": \"English\"\n\t\t},\n\t\t\"alternateTitles\": [\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 153,\n\t\t\t\t\"title\": \"Doctor Strange 2\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1504\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 153,\n\t\t\t\t\"title\": \"Доктор Стрэндж 2\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 11,\n\t\t\t\t\t\"name\": \"Russian\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1505\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 153,\n\t\t\t\t\"title\": \"Doutor Estranho 2\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1506\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 153,\n\t\t\t\t\"title\": \"Doctor Strange v multivesmíre šialenstva\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1507\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 153,\n\t\t\t\t\"title\": \"Doctor Strange 2: El multiverso de la locura\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 3,\n\t\t\t\t\t\"name\": \"Spanish\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1508\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 153,\n\t\t\t\t\"title\": \"মহাবিশ্বের পাগলামিতে অদ্ভুত চিকিৎসক\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1510\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 153,\n\t\t\t\t\"title\": \"จอมเวทย์มหากาฬ ในมัลติเวิร์สมหาภัย\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 28,\n\t\t\t\t\t\"name\": \"Thai\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1511\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 153,\n\t\t\t\t\"title\": \"Marvel Studios' Doctor Strange in the Multiverse of Madness\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1512\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 153,\n\t\t\t\t\"title\": \"Doctor Strange en el Multiverso de la Locura de Marvel Studios\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 3,\n\t\t\t\t\t\"name\": \"Spanish\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1513\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 153,\n\t\t\t\t\"title\": \"Doktors Streindžs neprāta multivisumā\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1514\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 153,\n\t\t\t\t\"title\": \"Doctor Strange in the Multitude of Madness 3D\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1515\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 153,\n\t\t\t\t\"title\": \"닥터 스트레인지 2\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1531\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 153,\n\t\t\t\t\"title\": \"奇異博士2: 失控多元宇宙\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1532\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 153,\n\t\t\t\t\"title\": \"Ο Δόκτωρ Στρέιντζ στο πολυσύμπαν της τρέλας\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1544\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 153,\n\t\t\t\t\"title\": \"Doktor Streync 2: Multikainatın Dəliliklərində\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1566\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 153,\n\t\t\t\t\"title\": \"Doctor Strange 2 - The Multiverse of Madness\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1664\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 153,\n\t\t\t\t\"title\": \"奇异博士2：疯狂多元宇宙\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1665\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 153,\n\t\t\t\t\"title\": \"奇異博士2：失控多重宇宙\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1667\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 153,\n\t\t\t\t\"title\": \"Doutor Estranho no Multiverso da Loucura (2022)\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1668\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 153,\n\t\t\t\t\"title\": \"Doctor Strange: Đa Vũ Trụ Hỗn Loạn\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1766\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 153,\n\t\t\t\t\"title\": \"Բժիշկ Սթրենջը Խելագարության Բազմաշխարհում\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1772\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 153,\n\t\t\t\t\"title\": \"Stellar Vortex\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1773\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 153,\n\t\t\t\t\"title\": \"Doktor Strange 2\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 17,\n\t\t\t\t\t\"name\": \"Turkish\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1777\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 153,\n\t\t\t\t\"title\": \"დოქტორი სტრეინჯი სიგიჟის მრავალსამყაროში\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1834\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 153,\n\t\t\t\t\"title\": \"დოქტორი სტრეინჯი სიგიჟის მულტისამყაროში\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1835\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 153,\n\t\t\t\t\"title\": \"마블 닥터 스트레인지: 대혼돈의 멀티버스\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1836\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 153,\n\t\t\t\t\"title\": \"닥터 스트레인지 대혼돈의 멀티버스\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1837\n\t\t\t}\n\t\t],\n\t\t\"secondaryYearSourceId\": 0,\n\t\t\"sortTitle\": \"doctor strange in multiverse madness\",\n\t\t\"sizeOnDisk\": 9961899948,\n\t\t\"status\": \"released\",\n\t\t\"overview\": \"Doctor Strange, with the help of mystical allies both old and new, traverses the mind-bending and dangerous alternate realities of the Multiverse to confront a mysterious new adversary.\",\n\t\t\"inCinemas\": \"2022-05-04T00:00:00Z\",\n\t\t\"physicalRelease\": \"2022-07-26T00:00:00Z\",\n\t\t\"digitalRelease\": \"2022-06-22T00:00:00Z\",\n\t\t\"images\": [\n\t\t\t{\n\t\t\t\t\"coverType\": \"poster\",\n\t\t\t\t\"url\": \"https://image.tmdb.org/t/p/original/9Gtg2DzBhmYamXBS1hKAhiwbBKS.jpg\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"coverType\": \"fanart\",\n\t\t\t\t\"url\": \"https://image.tmdb.org/t/p/original/wcKFYIiVDvRURrzglV9kGu7fpfY.jpg\"\n\t\t\t}\n\t\t],\n\t\t\"website\": \"https://www.marvel.com/movies/doctor-strange-in-the-multiverse-of-madness\",\n\t\t\"year\": 2022,\n\t\t\"hasFile\": true,\n\t\t\"youTubeTrailerId\": \"Rf8LAYJSOL8\",\n\t\t\"studio\": \"Marvel Studios\",\n\t\t\"path\": \"/movies/Doctor Strange in the Multiverse of Madness (2022)\",\n\t\t\"qualityProfileId\": 1,\n\t\t\"monitored\": true,\n\t\t\"minimumAvailability\": \"released\",\n\t\t\"isAvailable\": true,\n\t\t\"folderName\": \"/movies/Doctor Strange in the Multiverse of Madness (2022)\",\n\t\t\"runtime\": 126,\n\t\t\"cleanTitle\": \"doctorstrangeinmultiversemadness\",\n\t\t\"imdbId\": \"tt9419884\",\n\t\t\"tmdbId\": 453395,\n\t\t\"titleSlug\": \"453395\",\n\t\t\"certification\": \"PG-13\",\n\t\t\"genres\": [\n\t\t\t\"Fantasy\",\n\t\t\t\"Action\",\n\t\t\t\"Adventure\"\n\t\t],\n\t\t\"tags\": [],\n\t\t\"added\": \"2022-05-03T20:20:14Z\",\n\t\t\"ratings\": {\n\t\t\t\"imdb\": {\n\t\t\t\t\"votes\": 336918,\n\t\t\t\t\"value\": 7,\n\t\t\t\t\"type\": \"user\"\n\t\t\t},\n\t\t\t\"tmdb\": {\n\t\t\t\t\"votes\": 5076,\n\t\t\t\t\"value\": 7.5,\n\t\t\t\t\"type\": \"user\"\n\t\t\t},\n\t\t\t\"metacritic\": {\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"value\": 60,\n\t\t\t\t\"type\": \"user\"\n\t\t\t},\n\t\t\t\"rottenTomatoes\": {\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"value\": 74,\n\t\t\t\t\"type\": \"user\"\n\t\t\t}\n\t\t},\n\t\t\"movieFile\": {\n\t\t\t\"movieId\": 153,\n\t\t\t\"relativePath\": \"Doctor Strange in the Multiverse of Madness (2022) WEBRip-1080p.mkv\",\n\t\t\t\"path\": \"/movies/Doctor Strange in the Multiverse of Madness (2022)/Doctor Strange in the Multiverse of Madness (2022) WEBRip-1080p.mkv\",\n\t\t\t\"size\": 9961899948,\n\t\t\t\"dateAdded\": \"2022-06-22T00:45:05Z\",\n\t\t\t\"sceneName\": \"Doctor.Strange.in.the.Multiverse.of.Madness.2022.1080p.WEBRip.DDP5.1.Atmos.x264-NOGRP\",\n\t\t\t\"indexerFlags\": 1,\n\t\t\t\"quality\": {\n\t\t\t\t\"quality\": {\n\t\t\t\t\t\"id\": 15,\n\t\t\t\t\t\"name\": \"WEBRip-1080p\",\n\t\t\t\t\t\"source\": \"webrip\",\n\t\t\t\t\t\"resolution\": 1080,\n\t\t\t\t\t\"modifier\": \"none\"\n\t\t\t\t},\n\t\t\t\t\"revision\": {\n\t\t\t\t\t\"version\": 1,\n\t\t\t\t\t\"real\": 0,\n\t\t\t\t\t\"isRepack\": false\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"mediaInfo\": {\n\t\t\t\t\"audioBitrate\": 768000,\n\t\t\t\t\"audioChannels\": 5.1,\n\t\t\t\t\"audioCodec\": \"EAC3 Atmos\",\n\t\t\t\t\"audioLanguages\": \"eng\",\n\t\t\t\t\"audioStreamCount\": 1,\n\t\t\t\t\"videoBitDepth\": 8,\n\t\t\t\t\"videoBitrate\": 0,\n\t\t\t\t\"videoCodec\": \"x264\",\n\t\t\t\t\"videoDynamicRangeType\": \"\",\n\t\t\t\t\"videoFps\": 23.976,\n\t\t\t\t\"resolution\": \"1920x804\",\n\t\t\t\t\"runTime\": \"2:06:31\",\n\t\t\t\t\"scanType\": \"Progressive\",\n\t\t\t\t\"subtitles\": \"eng/eng\"\n\t\t\t},\n\t\t\t\"originalFilePath\": \"Doctor.Strange.in.the.Multiverse.of.Madness.2022.1080p.WEBRip.DDP5.1.Atmos.x264-NOGRP/Doctor.Strange.in.the.Multiverse.of.Madness.2022.1080p.WEBRip.DDP5.1.Atmos.x264-NOGRP.mkv\",\n\t\t\t\"qualityCutoffNotMet\": false,\n\t\t\t\"languages\": [\n\t\t\t\t{\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t}\n\t\t\t],\n\t\t\t\"releaseGroup\": \"NOGRP\",\n\t\t\t\"edition\": \"\",\n\t\t\t\"id\": 224\n\t\t},\n\t\t\"collection\": {\n\t\t\t\"name\": \"Doctor Strange Collection\",\n\t\t\t\"tmdbId\": 618529,\n\t\t\t\"images\": []\n\t\t},\n\t\t\"id\": 153\n\t},\n\t{\n\t\t\"title\": \"Top Gun: Maverick\",\n\t\t\"originalTitle\": \"Top Gun: Maverick\",\n\t\t\"originalLanguage\": {\n\t\t\t\"id\": 1,\n\t\t\t\"name\": \"English\"\n\t\t},\n\t\t\"alternateTitles\": [\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 160,\n\t\t\t\t\"title\": \"Лучший стрелок 2\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 11,\n\t\t\t\t\t\"name\": \"Russian\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1611\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 160,\n\t\t\t\t\"title\": \"Top Gun 2\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1612\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 160,\n\t\t\t\t\"title\": \"Кращий стрілець 2\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1614\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 160,\n\t\t\t\t\"title\": \"Top Gun 2 - Maverick\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 4,\n\t\t\t\t\t\"name\": \"German\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1615\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 160,\n\t\t\t\t\"title\": \"Phi Công Siêu Đẳng Maverick\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1621\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 160,\n\t\t\t\t\"title\": \"Кращий стрілець: Меверік\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1623\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 160,\n\t\t\t\t\"title\": \"壮志凌云2：独行侠\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1671\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 160,\n\t\t\t\t\"title\": \"Топ Ган: Мэверик\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 11,\n\t\t\t\t\t\"name\": \"Russian\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1729\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 160,\n\t\t\t\t\"title\": \"توب قن: مافريك\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1763\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 160,\n\t\t\t\t\"title\": \"Top Gun: Sayohatchi\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1764\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 160,\n\t\t\t\t\"title\": \"Топ ган: Маверик\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1765\n\t\t\t}\n\t\t],\n\t\t\"secondaryYearSourceId\": 0,\n\t\t\"sortTitle\": \"top gun maverick\",\n\t\t\"sizeOnDisk\": 0,\n\t\t\"status\": \"released\",\n\t\t\"overview\": \"After more than thirty years of service as one of the Navy’s top aviators, and dodging the advancement in rank that would ground him, Pete “Maverick” Mitchell finds himself training a detachment of TOP GUN graduates for a specialized mission the likes of which no living pilot has ever seen.\",\n\t\t\"inCinemas\": \"2022-05-24T00:00:00Z\",\n\t\t\"physicalRelease\": \"2022-10-05T00:00:00Z\",\n\t\t\"digitalRelease\": \"2022-08-08T00:00:00Z\",\n\t\t\"images\": [\n\t\t\t{\n\t\t\t\t\"coverType\": \"poster\",\n\t\t\t\t\"url\": \"https://image.tmdb.org/t/p/original/62HCnUTziyWcpDaBO2i1DX17ljH.jpg\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"coverType\": \"fanart\",\n\t\t\t\t\"url\": \"https://image.tmdb.org/t/p/original/odJ4hx6g6vBt4lBWKFD1tI8WS4x.jpg\"\n\t\t\t}\n\t\t],\n\t\t\"website\": \"https://www.topgunmovie.com\",\n\t\t\"year\": 2022,\n\t\t\"hasFile\": false,\n\t\t\"youTubeTrailerId\": \"giXco2jaZ_4\",\n\t\t\"studio\": \"Paramount\",\n\t\t\"path\": \"/movies/Top Gun Maverick (2022)\",\n\t\t\"qualityProfileId\": 1,\n\t\t\"monitored\": true,\n\t\t\"minimumAvailability\": \"released\",\n\t\t\"isAvailable\": true,\n\t\t\"folderName\": \"/movies/Top Gun Maverick (2022)\",\n\t\t\"runtime\": 131,\n\t\t\"cleanTitle\": \"topgunmaverick\",\n\t\t\"imdbId\": \"tt1745960\",\n\t\t\"tmdbId\": 361743,\n\t\t\"titleSlug\": \"361743\",\n\t\t\"certification\": \"PG-13\",\n\t\t\"genres\": [\n\t\t\t\"Action\",\n\t\t\t\"Drama\"\n\t\t],\n\t\t\"tags\": [],\n\t\t\"added\": \"2022-06-07T19:53:34Z\",\n\t\t\"ratings\": {\n\t\t\t\"imdb\": {\n\t\t\t\t\"votes\": 255677,\n\t\t\t\t\"value\": 8.6,\n\t\t\t\t\"type\": \"user\"\n\t\t\t},\n\t\t\t\"tmdb\": {\n\t\t\t\t\"votes\": 1811,\n\t\t\t\t\"value\": 8.3,\n\t\t\t\t\"type\": \"user\"\n\t\t\t},\n\t\t\t\"metacritic\": {\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"value\": 78,\n\t\t\t\t\"type\": \"user\"\n\t\t\t},\n\t\t\t\"rottenTomatoes\": {\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"value\": 97,\n\t\t\t\t\"type\": \"user\"\n\t\t\t}\n\t\t},\n\t\t\"collection\": {\n\t\t\t\"name\": \"Top Gun Collection\",\n\t\t\t\"tmdbId\": 531330,\n\t\t\t\"images\": []\n\t\t},\n\t\t\"id\": 160\n\t},\n\t{\n\t\t\"title\": \"Jurassic World Dominion\",\n\t\t\"originalTitle\": \"Jurassic World Dominion\",\n\t\t\"originalLanguage\": {\n\t\t\t\"id\": 1,\n\t\t\t\"name\": \"English\"\n\t\t},\n\t\t\"alternateTitles\": [\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 176,\n\t\t\t\t\"title\": \"Jurassic Park 6\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1872\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 176,\n\t\t\t\t\"title\": \"Jurassic World 3\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1873\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 176,\n\t\t\t\t\"title\": \"쥬라기 공원 3\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1874\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 176,\n\t\t\t\t\"title\": \"Мир Юрского периода 3\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 11,\n\t\t\t\t\t\"name\": \"Russian\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1875\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 176,\n\t\t\t\t\"title\": \"Jurassic World 3: Dominion\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1876\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 176,\n\t\t\t\t\"title\": \"Jurassic World 3: Dominio\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1877\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 176,\n\t\t\t\t\"title\": \"Світ Юрського періоду 3\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1878\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 176,\n\t\t\t\t\"title\": \"Світ Юрського періоду: Домініон\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1879\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 176,\n\t\t\t\t\"title\": \"Мир Юрского периода: Власть\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 11,\n\t\t\t\t\t\"name\": \"Russian\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1880\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 176,\n\t\t\t\t\"title\": \"จูราสสิค เวิลด์ ทวงคืนอาณาจักร\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 28,\n\t\t\t\t\t\"name\": \"Thai\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1881\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 176,\n\t\t\t\t\"title\": \"La monde jurassique : Domination\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1882\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 176,\n\t\t\t\t\"title\": \"Monde jurassique : la domination\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1883\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 176,\n\t\t\t\t\"title\": \"ジュラシックワールドドミニオン\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1884\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 176,\n\t\t\t\t\"title\": \"Thế Giới Khủng Long: Lãnh Địa\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1885\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 176,\n\t\t\t\t\"title\": \"Jurassic World 3 - Dominion (2022)\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1887\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 176,\n\t\t\t\t\"title\": \"Jurassic World\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 2,\n\t\t\t\t\t\"name\": \"French\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1888\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 176,\n\t\t\t\t\"title\": \"侏儸紀世界：統霸天下\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1891\n\t\t\t}\n\t\t],\n\t\t\"secondaryYearSourceId\": 0,\n\t\t\"sortTitle\": \"jurassic world dominion\",\n\t\t\"sizeOnDisk\": 3288297053,\n\t\t\"status\": \"released\",\n\t\t\"overview\": \"Four years after Isla Nublar was destroyed, dinosaurs now live—and hunt—alongside humans all over the world. This fragile balance will reshape the future and determine, once and for all, whether human beings are to remain the apex predators on a planet they now share with history’s most fearsome creatures.\",\n\t\t\"inCinemas\": \"2022-06-01T00:00:00Z\",\n\t\t\"physicalRelease\": \"2022-08-25T00:00:00Z\",\n\t\t\"digitalRelease\": \"2022-07-14T00:00:00Z\",\n\t\t\"images\": [\n\t\t\t{\n\t\t\t\t\"coverType\": \"poster\",\n\t\t\t\t\"url\": \"https://image.tmdb.org/t/p/original/kAVRgw7GgK1CfYEJq8ME6EvRIgU.jpg\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"coverType\": \"fanart\",\n\t\t\t\t\"url\": \"https://image.tmdb.org/t/p/original/9eAn20y26wtB3aet7w9lHjuSgZ3.jpg\"\n\t\t\t}\n\t\t],\n\t\t\"website\": \"https://www.jurassicworld.com\",\n\t\t\"year\": 2022,\n\t\t\"hasFile\": true,\n\t\t\"youTubeTrailerId\": \"DtQycgMD4HQ\",\n\t\t\"studio\": \"Universal Pictures\",\n\t\t\"path\": \"/movies/Jurassic World Dominion (2022)\",\n\t\t\"qualityProfileId\": 4,\n\t\t\"monitored\": true,\n\t\t\"minimumAvailability\": \"released\",\n\t\t\"isAvailable\": true,\n\t\t\"folderName\": \"/movies/Jurassic World Dominion (2022)\",\n\t\t\"runtime\": 147,\n\t\t\"cleanTitle\": \"jurassicworlddominion\",\n\t\t\"imdbId\": \"tt8041270\",\n\t\t\"tmdbId\": 507086,\n\t\t\"titleSlug\": \"507086\",\n\t\t\"certification\": \"PG-13\",\n\t\t\"genres\": [\n\t\t\t\"Adventure\",\n\t\t\t\"Action\",\n\t\t\t\"Science Fiction\"\n\t\t],\n\t\t\"tags\": [],\n\t\t\"added\": \"2022-08-03T22:37:52Z\",\n\t\t\"ratings\": {\n\t\t\t\"imdb\": {\n\t\t\t\t\"votes\": 105728,\n\t\t\t\t\"value\": 5.7,\n\t\t\t\t\"type\": \"user\"\n\t\t\t},\n\t\t\t\"tmdb\": {\n\t\t\t\t\"votes\": 2532,\n\t\t\t\t\"value\": 7.1,\n\t\t\t\t\"type\": \"user\"\n\t\t\t},\n\t\t\t\"metacritic\": {\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"value\": 38,\n\t\t\t\t\"type\": \"user\"\n\t\t\t},\n\t\t\t\"rottenTomatoes\": {\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"value\": 30,\n\t\t\t\t\"type\": \"user\"\n\t\t\t}\n\t\t},\n\t\t\"movieFile\": {\n\t\t\t\"movieId\": 176,\n\t\t\t\"relativePath\": \"Jurassic World Dominion (2022) Bluray-1080p.mp4\",\n\t\t\t\"path\": \"/movies/Jurassic World Dominion (2022)/Jurassic World Dominion (2022) Bluray-1080p.mp4\",\n\t\t\t\"size\": 3288297053,\n\t\t\t\"dateAdded\": \"2022-08-03T22:40:58Z\",\n\t\t\t\"sceneName\": \"Jurassic.World.3.Dominion.2022.EXTENDED.1080p.BluRay.H264.AAC-RARBG\",\n\t\t\t\"indexerFlags\": 1,\n\t\t\t\"quality\": {\n\t\t\t\t\"quality\": {\n\t\t\t\t\t\"id\": 7,\n\t\t\t\t\t\"name\": \"Bluray-1080p\",\n\t\t\t\t\t\"source\": \"bluray\",\n\t\t\t\t\t\"resolution\": 1080,\n\t\t\t\t\t\"modifier\": \"none\"\n\t\t\t\t},\n\t\t\t\t\"revision\": {\n\t\t\t\t\t\"version\": 1,\n\t\t\t\t\t\"real\": 0,\n\t\t\t\t\t\"isRepack\": false\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"mediaInfo\": {\n\t\t\t\t\"audioBitrate\": 224000,\n\t\t\t\t\"audioChannels\": 5.1,\n\t\t\t\t\"audioCodec\": \"AAC\",\n\t\t\t\t\"audioLanguages\": \"eng\",\n\t\t\t\t\"audioStreamCount\": 1,\n\t\t\t\t\"videoBitDepth\": 8,\n\t\t\t\t\"videoBitrate\": 2497768,\n\t\t\t\t\"videoCodec\": \"x264\",\n\t\t\t\t\"videoDynamicRangeType\": \"\",\n\t\t\t\t\"videoFps\": 23.976,\n\t\t\t\t\"resolution\": \"1920x960\",\n\t\t\t\t\"runTime\": \"2:40:40\",\n\t\t\t\t\"scanType\": \"Progressive\",\n\t\t\t\t\"subtitles\": \"\"\n\t\t\t},\n\t\t\t\"originalFilePath\": \"Jurassic.World.3.Dominion.2022.EXTENDED.1080p.BluRay.H264.AAC-RARBG/Jurassic.World.3.Dominion.2022.EXTENDED.1080p.BluRay.H264.AAC-RARBG.mp4\",\n\t\t\t\"qualityCutoffNotMet\": false,\n\t\t\t\"languages\": [\n\t\t\t\t{\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t}\n\t\t\t],\n\t\t\t\"releaseGroup\": \"RARBG\",\n\t\t\t\"edition\": \"EXTENDED\",\n\t\t\t\"id\": 232\n\t\t},\n\t\t\"collection\": {\n\t\t\t\"name\": \"Jurassic Park Collection\",\n\t\t\t\"tmdbId\": 328,\n\t\t\t\"images\": []\n\t\t},\n\t\t\"id\": 176\n\t},\n\t{\n\t\t\"title\": \"Lightyear\",\n\t\t\"originalTitle\": \"Lightyear\",\n\t\t\"originalLanguage\": {\n\t\t\t\"id\": 1,\n\t\t\t\"name\": \"English\"\n\t\t},\n\t\t\"alternateTitles\": [\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 157,\n\t\t\t\t\"title\": \"Баз Светлинна година\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 29,\n\t\t\t\t\t\"name\": \"Bulgarian\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1580\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 157,\n\t\t\t\t\"title\": \"Buzz Astral\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 12,\n\t\t\t\t\t\"name\": \"Polish\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1581\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 157,\n\t\t\t\t\"title\": \"Buzz Lightyear\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 18,\n\t\t\t\t\t\"name\": \"Portuguese\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1582\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 157,\n\t\t\t\t\"title\": \"Lightyear - Cảnh Sát Vũ Trụ\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1583\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 157,\n\t\t\t\t\"title\": \"Bazs Gaismasgads\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1584\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 157,\n\t\t\t\t\"title\": \"光年正傳\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1598\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 157,\n\t\t\t\t\"title\": \"บัซ ไลท์เยียร์\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 28,\n\t\t\t\t\t\"name\": \"Thai\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1633\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 157,\n\t\t\t\t\"title\": \"光年正传\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1635\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 157,\n\t\t\t\t\"title\": \"Buzz l'Éclair\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 2,\n\t\t\t\t\t\"name\": \"French\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1648\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 157,\n\t\t\t\t\"title\": \"Rakeťák\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1649\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 157,\n\t\t\t\t\"title\": \"Svjetlosni\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1650\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 157,\n\t\t\t\t\"title\": \"लाइटईयर\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1651\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 157,\n\t\t\t\t\"title\": \"שנות-אור\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1652\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 157,\n\t\t\t\t\"title\": \"バズ・ライトイヤー\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1653\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 157,\n\t\t\t\t\"title\": \"Lightyear - La vera storia di Buzz\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 5,\n\t\t\t\t\t\"name\": \"Italian\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1654\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 157,\n\t\t\t\t\"title\": \"Базз Лайтер\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 11,\n\t\t\t\t\t\"name\": \"Russian\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1655\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 157,\n\t\t\t\t\"title\": \"버즈 라이트이어\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1656\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 157,\n\t\t\t\t\"title\": \"Баз Светлосни\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1657\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 157,\n\t\t\t\t\"title\": \"巴斯光年\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1658\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 157,\n\t\t\t\t\"title\": \"Işıkyılı\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 17,\n\t\t\t\t\t\"name\": \"Turkish\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1659\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 157,\n\t\t\t\t\"title\": \"Bazz Layter\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1660\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 157,\n\t\t\t\t\"title\": \"ბაზ ლაითერი\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1829\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 157,\n\t\t\t\t\"title\": \"სათამაშოების ისტორია: ბაზ ლაითერი\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1830\n\t\t\t}\n\t\t],\n\t\t\"secondaryYearSourceId\": 0,\n\t\t\"sortTitle\": \"lightyear\",\n\t\t\"sizeOnDisk\": 4162236849,\n\t\t\"status\": \"released\",\n\t\t\"overview\": \"Legendary Space Ranger Buzz Lightyear embarks on an intergalactic adventure alongside a group of ambitious recruits and his robot companion Sox.\",\n\t\t\"inCinemas\": \"2022-06-15T00:00:00Z\",\n\t\t\"physicalRelease\": \"2022-09-29T00:00:00Z\",\n\t\t\"digitalRelease\": \"2022-08-03T00:00:00Z\",\n\t\t\"images\": [\n\t\t\t{\n\t\t\t\t\"coverType\": \"poster\",\n\t\t\t\t\"url\": \"https://image.tmdb.org/t/p/original/ox4goZd956BxqJH6iLwhWPL9ct4.jpg\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"coverType\": \"fanart\",\n\t\t\t\t\"url\": \"https://image.tmdb.org/t/p/original/nW5fUbldp1DYf2uQ3zJTUdachOu.jpg\"\n\t\t\t}\n\t\t],\n\t\t\"website\": \"https://movies.disney.com/lightyear\",\n\t\t\"year\": 2022,\n\t\t\"hasFile\": true,\n\t\t\"youTubeTrailerId\": \"0ir3Z8hLeHc\",\n\t\t\"studio\": \"Walt Disney Pictures\",\n\t\t\"path\": \"/movies/Lightyear (2022)\",\n\t\t\"qualityProfileId\": 1,\n\t\t\"monitored\": true,\n\t\t\"minimumAvailability\": \"announced\",\n\t\t\"isAvailable\": true,\n\t\t\"folderName\": \"/movies/Lightyear (2022)\",\n\t\t\"runtime\": 105,\n\t\t\"cleanTitle\": \"lightyear\",\n\t\t\"imdbId\": \"tt10298810\",\n\t\t\"tmdbId\": 718789,\n\t\t\"titleSlug\": \"718789\",\n\t\t\"certification\": \"PG\",\n\t\t\"genres\": [\n\t\t\t\"Animation\",\n\t\t\t\"Science Fiction\",\n\t\t\t\"Adventure\"\n\t\t],\n\t\t\"tags\": [],\n\t\t\"added\": \"2022-05-25T11:01:52Z\",\n\t\t\"ratings\": {\n\t\t\t\"imdb\": {\n\t\t\t\t\"votes\": 57059,\n\t\t\t\t\"value\": 5.5,\n\t\t\t\t\"type\": \"user\"\n\t\t\t},\n\t\t\t\"tmdb\": {\n\t\t\t\t\"votes\": 1405,\n\t\t\t\t\"value\": 7.362,\n\t\t\t\t\"type\": \"user\"\n\t\t\t},\n\t\t\t\"metacritic\": {\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"value\": 60,\n\t\t\t\t\"type\": \"user\"\n\t\t\t},\n\t\t\t\"rottenTomatoes\": {\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"value\": 75,\n\t\t\t\t\"type\": \"user\"\n\t\t\t}\n\t\t},\n\t\t\"movieFile\": {\n\t\t\t\"movieId\": 157,\n\t\t\t\"relativePath\": \"Lightyear (2022) WEBRip-1080p.mkv\",\n\t\t\t\"path\": \"/movies/Lightyear (2022)/Lightyear (2022) WEBRip-1080p.mkv\",\n\t\t\t\"size\": 4162236849,\n\t\t\t\"dateAdded\": \"2022-07-14T12:39:18Z\",\n\t\t\t\"sceneName\": \"Lightyear.2022.1080p.WEBRip.DD5.1.x264-EVO[TGx]\",\n\t\t\t\"indexerFlags\": 1,\n\t\t\t\"quality\": {\n\t\t\t\t\"quality\": {\n\t\t\t\t\t\"id\": 15,\n\t\t\t\t\t\"name\": \"WEBRip-1080p\",\n\t\t\t\t\t\"source\": \"webrip\",\n\t\t\t\t\t\"resolution\": 1080,\n\t\t\t\t\t\"modifier\": \"none\"\n\t\t\t\t},\n\t\t\t\t\"revision\": {\n\t\t\t\t\t\"version\": 1,\n\t\t\t\t\t\"real\": 0,\n\t\t\t\t\t\"isRepack\": false\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"mediaInfo\": {\n\t\t\t\t\"audioBitrate\": 384000,\n\t\t\t\t\"audioChannels\": 5.1,\n\t\t\t\t\"audioCodec\": \"AC3\",\n\t\t\t\t\"audioLanguages\": \"eng\",\n\t\t\t\t\"audioStreamCount\": 1,\n\t\t\t\t\"videoBitDepth\": 8,\n\t\t\t\t\"videoBitrate\": 0,\n\t\t\t\t\"videoCodec\": \"x264\",\n\t\t\t\t\"videoDynamicRangeType\": \"\",\n\t\t\t\t\"videoFps\": 23.976,\n\t\t\t\t\"resolution\": \"1920x804\",\n\t\t\t\t\"runTime\": \"1:45:04\",\n\t\t\t\t\"scanType\": \"Progressive\",\n\t\t\t\t\"subtitles\": \"\"\n\t\t\t},\n\t\t\t\"originalFilePath\": \"Lightyear.2022.1080p.WEBRip.DD5.1.x264-EVO[TGx]/Lightyear.2022.1080p.WEBRip.DD5.1.x264-EVO.mkv\",\n\t\t\t\"qualityCutoffNotMet\": false,\n\t\t\t\"languages\": [\n\t\t\t\t{\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t}\n\t\t\t],\n\t\t\t\"releaseGroup\": \"EVO\",\n\t\t\t\"edition\": \"\",\n\t\t\t\"id\": 227\n\t\t},\n\t\t\"id\": 157\n\t},\n\t{\n\t\t\"title\": \"Minions: The Rise of Gru\",\n\t\t\"originalTitle\": \"Minions: The Rise of Gru\",\n\t\t\"originalLanguage\": {\n\t\t\t\"id\": 1,\n\t\t\t\"name\": \"English\"\n\t\t},\n\t\t\"alternateTitles\": [\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 165,\n\t\t\t\t\"title\": \"미니언즈: 라이즈 오브 그루\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1679\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 165,\n\t\t\t\t\"title\": \"Miljenici: Uspon Grua\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1680\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 165,\n\t\t\t\t\"title\": \"Käsilased 2\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1681\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 165,\n\t\t\t\t\"title\": \"Minions 2: Η Άνοδος του Γκρου\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1682\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 165,\n\t\t\t\t\"title\": \"Minioni 2\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1683\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 165,\n\t\t\t\t\"title\": \"Minions: Historien om Gru\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 15,\n\t\t\t\t\t\"name\": \"Norwegian\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1684\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 165,\n\t\t\t\t\"title\": \"Mínimos 2: A Ascensão de Gru\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 18,\n\t\t\t\t\t\"name\": \"Portuguese\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1685\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 165,\n\t\t\t\t\"title\": \"Миньоны: Грювитация\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 11,\n\t\t\t\t\t\"name\": \"Russian\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1686\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 165,\n\t\t\t\t\"title\": \"Малци: Успон Груа\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1687\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 165,\n\t\t\t\t\"title\": \"Mimoni: Zloduch prichádza\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1688\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 165,\n\t\t\t\t\"title\": \"Minions: El origen de Gru\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 3,\n\t\t\t\t\t\"name\": \"Spanish\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1689\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 165,\n\t\t\t\t\"title\": \"Minioner: Berättelsen om Gru\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1690\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 165,\n\t\t\t\t\"title\": \"Minions 2: Come Gru diventa cattivissimo\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 5,\n\t\t\t\t\t\"name\": \"Italian\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1691\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 165,\n\t\t\t\t\"title\": \"Minions 2: Historien om Gru\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1692\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 165,\n\t\t\t\t\"title\": \"Minions 2\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1693\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 165,\n\t\t\t\t\"title\": \"Minions 2: Nace un villano\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1694\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 165,\n\t\t\t\t\"title\": \"Minions - Auf der Suche nach dem Mini-Boss\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 4,\n\t\t\t\t\t\"name\": \"German\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1695\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 165,\n\t\t\t\t\"title\": \"Minions 2: The Rise of Gru\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 7,\n\t\t\t\t\t\"name\": \"Dutch\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1696\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 165,\n\t\t\t\t\"title\": \"迷你兵團 2\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1697\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 165,\n\t\t\t\t\"title\": \"Minions: Hoe Gru superschurk were\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 7,\n\t\t\t\t\t\"name\": \"Dutch\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1698\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 165,\n\t\t\t\t\"title\": \"มินเนี่ยน 2\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 28,\n\t\t\t\t\t\"name\": \"Thai\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1699\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 165,\n\t\t\t\t\"title\": \"Minyonlar 2: Gru'nun Yükselişi\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 17,\n\t\t\t\t\t\"name\": \"Turkish\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1726\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 165,\n\t\t\t\t\"title\": \"Minions: Nace un villano\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1734\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 165,\n\t\t\t\t\"title\": \"Մինիոններ. Գրուի վերելքը\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1787\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 165,\n\t\t\t\t\"title\": \"Minions: KEBANGKITAN GRU\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1838\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 165,\n\t\t\t\t\"title\": \"미니언즈 2\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1846\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 165,\n\t\t\t\t\"title\": \"小黄人大眼萌：神偷奶爸前传\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1860\n\t\t\t}\n\t\t],\n\t\t\"secondaryYearSourceId\": 0,\n\t\t\"sortTitle\": \"minions rise gru\",\n\t\t\"sizeOnDisk\": 6621540111,\n\t\t\"status\": \"released\",\n\t\t\"overview\": \"A fanboy of a supervillain supergroup known as the Vicious 6, Gru hatches a plan to become evil enough to join them, with the backup of his followers, the Minions.\",\n\t\t\"inCinemas\": \"2022-06-29T00:00:00Z\",\n\t\t\"physicalRelease\": \"2022-09-15T00:00:00Z\",\n\t\t\"digitalRelease\": \"2022-08-02T00:00:00Z\",\n\t\t\"images\": [\n\t\t\t{\n\t\t\t\t\"coverType\": \"poster\",\n\t\t\t\t\"url\": \"https://image.tmdb.org/t/p/original/wKiOkZTN9lUUUNZLmtnwubZYONg.jpg\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"coverType\": \"fanart\",\n\t\t\t\t\"url\": \"https://image.tmdb.org/t/p/original/nmGWzTLMXy9x7mKd8NKPLmHtWGa.jpg\"\n\t\t\t}\n\t\t],\n\t\t\"website\": \"https://www.minionsmovie.com/\",\n\t\t\"year\": 2022,\n\t\t\"hasFile\": true,\n\t\t\"youTubeTrailerId\": \"HhIl_XJ-OGA\",\n\t\t\"studio\": \"Universal Pictures\",\n\t\t\"path\": \"/movies/Minions The Rise of Gru (2022)\",\n\t\t\"qualityProfileId\": 1,\n\t\t\"monitored\": true,\n\t\t\"minimumAvailability\": \"released\",\n\t\t\"isAvailable\": true,\n\t\t\"folderName\": \"/movies/Minions The Rise of Gru (2022)\",\n\t\t\"runtime\": 87,\n\t\t\"cleanTitle\": \"minionsrisegru\",\n\t\t\"imdbId\": \"tt5113044\",\n\t\t\"tmdbId\": 438148,\n\t\t\"titleSlug\": \"438148\",\n\t\t\"certification\": \"PG\",\n\t\t\"genres\": [\n\t\t\t\"Family\",\n\t\t\t\"Animation\",\n\t\t\t\"Adventure\"\n\t\t],\n\t\t\"tags\": [],\n\t\t\"added\": \"2022-06-27T13:00:47Z\",\n\t\t\"ratings\": {\n\t\t\t\"imdb\": {\n\t\t\t\t\"votes\": 29174,\n\t\t\t\t\"value\": 6.8,\n\t\t\t\t\"type\": \"user\"\n\t\t\t},\n\t\t\t\"tmdb\": {\n\t\t\t\t\"votes\": 1038,\n\t\t\t\t\"value\": 7.8,\n\t\t\t\t\"type\": \"user\"\n\t\t\t},\n\t\t\t\"metacritic\": {\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"value\": 56,\n\t\t\t\t\"type\": \"user\"\n\t\t\t},\n\t\t\t\"rottenTomatoes\": {\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"value\": 70,\n\t\t\t\t\"type\": \"user\"\n\t\t\t}\n\t\t},\n\t\t\"movieFile\": {\n\t\t\t\"movieId\": 165,\n\t\t\t\"relativePath\": \"Minions The Rise of Gru (2022) WEBRip-1080p.mkv\",\n\t\t\t\"path\": \"/movies/Minions The Rise of Gru (2022)/Minions The Rise of Gru (2022) WEBRip-1080p.mkv\",\n\t\t\t\"size\": 6621540111,\n\t\t\t\"dateAdded\": \"2022-08-02T07:18:57Z\",\n\t\t\t\"sceneName\": \"Minions.The.Rise.of.Gru.2022.1080p.AMZN.WEBRip.DDP5.1.Atmos.x264-NOGRP\",\n\t\t\t\"indexerFlags\": 1,\n\t\t\t\"quality\": {\n\t\t\t\t\"quality\": {\n\t\t\t\t\t\"id\": 15,\n\t\t\t\t\t\"name\": \"WEBRip-1080p\",\n\t\t\t\t\t\"source\": \"webrip\",\n\t\t\t\t\t\"resolution\": 1080,\n\t\t\t\t\t\"modifier\": \"none\"\n\t\t\t\t},\n\t\t\t\t\"revision\": {\n\t\t\t\t\t\"version\": 1,\n\t\t\t\t\t\"real\": 0,\n\t\t\t\t\t\"isRepack\": false\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"mediaInfo\": {\n\t\t\t\t\"audioBitrate\": 768000,\n\t\t\t\t\"audioChannels\": 5.1,\n\t\t\t\t\"audioCodec\": \"EAC3 Atmos\",\n\t\t\t\t\"audioLanguages\": \"eng\",\n\t\t\t\t\"audioStreamCount\": 1,\n\t\t\t\t\"videoBitDepth\": 8,\n\t\t\t\t\"videoBitrate\": 0,\n\t\t\t\t\"videoCodec\": \"x264\",\n\t\t\t\t\"videoDynamicRangeType\": \"\",\n\t\t\t\t\"videoFps\": 23.976,\n\t\t\t\t\"resolution\": \"1920x800\",\n\t\t\t\t\"runTime\": \"1:27:35\",\n\t\t\t\t\"scanType\": \"Progressive\",\n\t\t\t\t\"subtitles\": \"eng/eng/fre\"\n\t\t\t},\n\t\t\t\"originalFilePath\": \"Minions.The.Rise.of.Gru.2022.1080p.AMZN.WEBRip.DDP5.1.Atmos.x264-NOGRP/Minions.The.Rise.of.Gru.2022.1080p.AMZN.WEBRip.DDP5.1.Atmos.x264-NOGRP.mkv\",\n\t\t\t\"qualityCutoffNotMet\": false,\n\t\t\t\"languages\": [\n\t\t\t\t{\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t}\n\t\t\t],\n\t\t\t\"releaseGroup\": \"NOGRP\",\n\t\t\t\"edition\": \"\",\n\t\t\t\"id\": 230\n\t\t},\n\t\t\"collection\": {\n\t\t\t\"name\": \"Minions Collection\",\n\t\t\t\"tmdbId\": 544669,\n\t\t\t\"images\": []\n\t\t},\n\t\t\"id\": 165\n\t},\n\t{\n\t\t\"title\": \"Thor: Love and Thunder\",\n\t\t\"originalTitle\": \"Thor: Love and Thunder\",\n\t\t\"originalLanguage\": {\n\t\t\t\"id\": 1,\n\t\t\t\"name\": \"English\"\n\t\t},\n\t\t\"alternateTitles\": [\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 168,\n\t\t\t\t\"title\": \"Thor 4\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1735\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 168,\n\t\t\t\t\"title\": \"雷神4:爱与雷霆\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1736\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 168,\n\t\t\t\t\"title\": \"Тор 4\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 11,\n\t\t\t\t\t\"name\": \"Russian\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1737\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 168,\n\t\t\t\t\"title\": \"থর: প্রেম এবং বজ্রপাত\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1738\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 168,\n\t\t\t\t\"title\": \"Marvel Studios' Thor: Love and Thunder\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1739\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 168,\n\t\t\t\t\"title\": \"Thor: Love and Thunder de Marvel Studios\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 3,\n\t\t\t\t\t\"name\": \"Spanish\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1740\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 168,\n\t\t\t\t\"title\": \"Tors: Mīla un Pērkons\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1741\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 168,\n\t\t\t\t\"title\": \"Thor : Amour et tonnerre de Marvel Studios\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1742\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 168,\n\t\t\t\t\"title\": \"Marvel Studios' Thor: Tình Yêu và Sấm Sét\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1743\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 168,\n\t\t\t\t\"title\": \"Thor: amor y trueno\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 3,\n\t\t\t\t\t\"name\": \"Spanish\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1745\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 168,\n\t\t\t\t\"title\": \"თორი: სიყვარული და ჭექა-ქუხილი\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1746\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 168,\n\t\t\t\t\"title\": \"토르 4\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1770\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 168,\n\t\t\t\t\"title\": \"Թոր: Սեր և ամպրոպ\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1775\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 168,\n\t\t\t\t\"title\": \"תור: אהבה ורעם\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1781\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 168,\n\t\t\t\t\"title\": \"Thor: Cinta dan Guntur\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1790\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 168,\n\t\t\t\t\"title\": \"마블 토르: 러브 앤 썬더\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1839\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 168,\n\t\t\t\t\"title\": \"토르 러브 앤 썬더\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1840\n\t\t\t}\n\t\t],\n\t\t\"secondaryYearSourceId\": 0,\n\t\t\"sortTitle\": \"thor love thunder\",\n\t\t\"sizeOnDisk\": 0,\n\t\t\"status\": \"inCinemas\",\n\t\t\"overview\": \"After his retirement is interrupted by Gorr the God Butcher, a galactic killer who seeks the extinction of the gods, Thor enlists the help of King Valkyrie, Korg, and ex-girlfriend Jane Foster, who now inexplicably wields Mjolnir as the Mighty Thor. Together they embark upon a harrowing cosmic adventure to uncover the mystery of the God Butcher’s vengeance and stop him before it’s too late.\",\n\t\t\"inCinemas\": \"2022-07-06T00:00:00Z\",\n\t\t\"images\": [\n\t\t\t{\n\t\t\t\t\"coverType\": \"poster\",\n\t\t\t\t\"url\": \"https://image.tmdb.org/t/p/original/pIkRyD18kl4FhoCNQuWxWu5cBLM.jpg\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"coverType\": \"fanart\",\n\t\t\t\t\"url\": \"https://image.tmdb.org/t/p/original/p1F51Lvj3sMopG948F5HsBbl43C.jpg\"\n\t\t\t}\n\t\t],\n\t\t\"website\": \"https://www.marvel.com/movies/thor-love-and-thunder\",\n\t\t\"year\": 2022,\n\t\t\"hasFile\": false,\n\t\t\"youTubeTrailerId\": \"Go8nTmfrQd8\",\n\t\t\"studio\": \"Marvel Studios\",\n\t\t\"path\": \"/movies/Thor Love and Thunder (2022)\",\n\t\t\"qualityProfileId\": 1,\n\t\t\"monitored\": true,\n\t\t\"minimumAvailability\": \"released\",\n\t\t\"isAvailable\": false,\n\t\t\"folderName\": \"/movies/Thor Love and Thunder (2022)\",\n\t\t\"runtime\": 119,\n\t\t\"cleanTitle\": \"thorlovethunder\",\n\t\t\"imdbId\": \"tt10648342\",\n\t\t\"tmdbId\": 616037,\n\t\t\"titleSlug\": \"616037\",\n\t\t\"certification\": \"PG-13\",\n\t\t\"genres\": [\n\t\t\t\"Action\",\n\t\t\t\"Adventure\",\n\t\t\t\"Fantasy\"\n\t\t],\n\t\t\"tags\": [],\n\t\t\"added\": \"2022-07-04T17:04:57Z\",\n\t\t\"ratings\": {\n\t\t\t\"imdb\": {\n\t\t\t\t\"votes\": 146274,\n\t\t\t\t\"value\": 6.8,\n\t\t\t\t\"type\": \"user\"\n\t\t\t},\n\t\t\t\"tmdb\": {\n\t\t\t\t\"votes\": 1695,\n\t\t\t\t\"value\": 6.8,\n\t\t\t\t\"type\": \"user\"\n\t\t\t},\n\t\t\t\"metacritic\": {\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"value\": 57,\n\t\t\t\t\"type\": \"user\"\n\t\t\t},\n\t\t\t\"rottenTomatoes\": {\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"value\": 67,\n\t\t\t\t\"type\": \"user\"\n\t\t\t}\n\t\t},\n\t\t\"collection\": {\n\t\t\t\"name\": \"Thor Collection\",\n\t\t\t\"tmdbId\": 131296,\n\t\t\t\"images\": []\n\t\t},\n\t\t\"id\": 168\n\t},\n\t{\n\t\t\"title\": \"Sword Art Online the Movie -Progressive- Scherzo of a Deep Night\",\n\t\t\"originalTitle\": \"劇場版 ソードアート・オンライン プログレッシブ 冥き夕闇のスケルツォ\",\n\t\t\"originalLanguage\": {\n\t\t\t\"id\": 8,\n\t\t\t\"name\": \"Japanese\"\n\t\t},\n\t\t\"alternateTitles\": [\n\t\t\t{\n\t\t\t\t\"sourceType\": \"tmdb\",\n\t\t\t\t\"movieId\": 169,\n\t\t\t\t\"title\": \"Sword Art Online Progressive\",\n\t\t\t\t\"sourceId\": 0,\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"voteCount\": 0,\n\t\t\t\t\"language\": {\n\t\t\t\t\t\"id\": 1,\n\t\t\t\t\t\"name\": \"English\"\n\t\t\t\t},\n\t\t\t\t\"id\": 1748\n\t\t\t}\n\t\t],\n\t\t\"secondaryYearSourceId\": 0,\n\t\t\"sortTitle\": \"sword art online movie progressive scherzo deep night\",\n\t\t\"sizeOnDisk\": 0,\n\t\t\"status\": \"announced\",\n\t\t\"overview\": \"\",\n\t\t\"inCinemas\": \"2022-09-10T00:00:00Z\",\n\t\t\"images\": [\n\t\t\t{\n\t\t\t\t\"coverType\": \"poster\",\n\t\t\t\t\"url\": \"https://image.tmdb.org/t/p/original/1L904CSzPCEEpPcUoBWH4cjuGJW.jpg\"\n\t\t\t}\n\t\t],\n\t\t\"website\": \"\",\n\t\t\"year\": 2022,\n\t\t\"hasFile\": false,\n\t\t\"youTubeTrailerId\": \"\",\n\t\t\"studio\": \"Aniplex\",\n\t\t\"path\": \"/movies/Sword Art Online the Movie -Progressive- Scherzo of a Deep Night (2022)\",\n\t\t\"qualityProfileId\": 1,\n\t\t\"monitored\": true,\n\t\t\"minimumAvailability\": \"released\",\n\t\t\"isAvailable\": false,\n\t\t\"folderName\": \"/movies/Sword Art Online the Movie -Progressive- Scherzo of a Deep Night (2022)\",\n\t\t\"runtime\": 0,\n\t\t\"cleanTitle\": \"swordartonlinemovieprogressivescherzodeepnight\",\n\t\t\"tmdbId\": 893712,\n\t\t\"titleSlug\": \"893712\",\n\t\t\"genres\": [\n\t\t\t\"Animation\",\n\t\t\t\"Action\",\n\t\t\t\"Fantasy\"\n\t\t],\n\t\t\"tags\": [],\n\t\t\"added\": \"2022-07-04T17:05:01Z\",\n\t\t\"ratings\": {\n\t\t\t\"tmdb\": {\n\t\t\t\t\"votes\": 0,\n\t\t\t\t\"value\": 0,\n\t\t\t\t\"type\": \"user\"\n\t\t\t}\n\t\t},\n\t\t\"collection\": {\n\t\t\t\"name\": \"Sword Art Online the Movie -Progressive-\",\n\t\t\t\"tmdbId\": 893713,\n\t\t\t\"images\": []\n\t\t},\n\t\t\"id\": 169\n\t}\n]"
  },
  {
    "path": "src/modules/common/examples/multipletvshows.json",
    "content": "{\n\t\"page\": 1,\n\t\"totalPages\": 2,\n\t\"totalResults\": 21,\n\t\"results\": [\n\t\t{\n\t\t\t\"id\": 66025,\n\t\t\t\"firstAirDate\": \"2016-06-14\",\n\t\t\t\"genreIds\": [\n\t\t\t\t80,\n\t\t\t\t18\n\t\t\t],\n\t\t\t\"mediaType\": \"tv\",\n\t\t\t\"name\": \"Animal Kingdom\",\n\t\t\t\"originCountry\": [\n\t\t\t\t\"US\"\n\t\t\t],\n\t\t\t\"originalLanguage\": \"en\",\n\t\t\t\"originalName\": \"Animal Kingdom\",\n\t\t\t\"overview\": \"Un jeune homme de dix-sept ans emménage avec la famille Cody après le décès de sa mère, une fratrie baignant dans la criminalité gouvernée d'une main de maître par la matriarche, Smurf.\",\n\t\t\t\"popularity\": 75.653,\n\t\t\t\"voteAverage\": 7.7,\n\t\t\t\"voteCount\": 318,\n\t\t\t\"backdropPath\": \"/eQJwfyMqSra10ck8HOoiCrbQR32.jpg\",\n\t\t\t\"posterPath\": \"/rzvdKrnSRKPFI0pgqMQknDPpRC9.jpg\",\n\t\t\t\"mediaInfo\": {\n\t\t\t\t\"downloadStatus\": [],\n\t\t\t\t\"downloadStatus4k\": [],\n\t\t\t\t\"id\": 217,\n\t\t\t\t\"mediaType\": \"tv\",\n\t\t\t\t\"tmdbId\": 66025,\n\t\t\t\t\"tvdbId\": 304262,\n\t\t\t\t\"imdbId\": null,\n\t\t\t\t\"status\": 3,\n\t\t\t\t\"status4k\": 1,\n\t\t\t\t\"createdAt\": \"2022-08-08T11:06:20.000Z\",\n\t\t\t\t\"updatedAt\": \"2022-08-08T11:06:23.000Z\",\n\t\t\t\t\"lastSeasonChange\": \"2022-08-08T11:06:20.000Z\",\n\t\t\t\t\"mediaAddedAt\": null,\n\t\t\t\t\"serviceId\": 0,\n\t\t\t\t\"serviceId4k\": null,\n\t\t\t\t\"externalServiceId\": 56,\n\t\t\t\t\"externalServiceId4k\": null,\n\t\t\t\t\"externalServiceSlug\": \"animal-kingdom-2016\",\n\t\t\t\t\"externalServiceSlug4k\": null,\n\t\t\t\t\"ratingKey\": null,\n\t\t\t\t\"ratingKey4k\": null,\n\t\t\t\t\"seasons\": [],\n\t\t\t\t\"serviceUrl\": \"http://sonarr:8989/series/animal-kingdom-2016\"\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"id\": 44629,\n\t\t\t\"mediaType\": \"movie\",\n\t\t\t\"adult\": false,\n\t\t\t\"genreIds\": [\n\t\t\t\t18,\n\t\t\t\t53,\n\t\t\t\t80,\n\t\t\t\t9648\n\t\t\t],\n\t\t\t\"originalLanguage\": \"en\",\n\t\t\t\"originalTitle\": \"Animal Kingdom\",\n\t\t\t\"overview\": \"Une rue anonyme dans la banlieue de Melbourne. C’est là que vit la famille Cody. Profession: criminels. L’irruption parmi eux de Joshua, un neveu éloigné, offre à la police le moyen de les infiltrer. Il ne reste plus à Joshua qu’à choisir son camp...\",\n\t\t\t\"popularity\": 11.839,\n\t\t\t\"releaseDate\": \"2010-06-03\",\n\t\t\t\"title\": \"Animal Kingdom\",\n\t\t\t\"video\": false,\n\t\t\t\"voteAverage\": 6.8,\n\t\t\t\"voteCount\": 643,\n\t\t\t\"backdropPath\": \"/dxOv6K3LNbZfQaGDyx7Tp94Koy.jpg\",\n\t\t\t\"posterPath\": \"/qrVjc5JcaujL58SMMW9lqrp3bBX.jpg\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 95731,\n\t\t\t\"firstAirDate\": \"2020-09-25\",\n\t\t\t\"genreIds\": [\n\t\t\t\t99\n\t\t\t],\n\t\t\t\"mediaType\": \"tv\",\n\t\t\t\"name\": \"Au cœur de Disney's Animal Kingdom\",\n\t\t\t\"originCountry\": [],\n\t\t\t\"originalLanguage\": \"en\",\n\t\t\t\"originalName\": \"Magic of Disney's Animal Kingdom\",\n\t\t\t\"overview\": \"Au cœur d’Animal Kingdom narrée par Josh Gad, une célébrité parmi les fans de Disney, nous emmène en coulisses découvrir la magie de deux des animations animalières les plus visitées au monde : le parc à thème de Disney, Animal Kingdom, et The Seas with Nemo & Friends à Epcot. Les spectateurs s’approchent au plus près de créatures parmi les plus rares et les plus belles de la planète et rencontrent les experts en soins animaliers qui ont tissé des liens stupéfiants avec les 5 000 et plus animaux du parc. Chacun des huit épisodes plonge au cœur de l’endroit le plus magique sur Terre, dévoilant les multiples facettes de sa conception et de sa gestion.\",\n\t\t\t\"popularity\": 3.367,\n\t\t\t\"voteAverage\": 8,\n\t\t\t\"voteCount\": 4,\n\t\t\t\"backdropPath\": \"/gMTMnd54VVAbGiodBqMTGCjM3b2.jpg\",\n\t\t\t\"posterPath\": \"/gvNTeRAfu4KN3dD5HUO4Nbnri07.jpg\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 120862,\n\t\t\t\"mediaType\": \"movie\",\n\t\t\t\"adult\": false,\n\t\t\t\"genreIds\": [\n\t\t\t\t35,\n\t\t\t\t18,\n\t\t\t\t10749\n\t\t\t],\n\t\t\t\"originalLanguage\": \"en\",\n\t\t\t\"originalTitle\": \"The Animal Kingdom\",\n\t\t\t\"overview\": \"Tom Collier, jeune éditeur, a entretenu une liaison passionnée et intellectuelle avec une dessinatrice, Daisy Sage. Celle-ci ayant mis un terme à leur relation, il a fait la connaissance de Cecilia, qu'il a rapidement décidé d'épouser. Alors que les fiançailles sont annoncées, Daisy, toujours amoureuse, fait son retour, mais trop tard. Le mariage a lieu. Sous l'influence de Cecilia, Tom Collier, qui était un éditeur intègre et exigeant, fait de plus en plus de concessions commerciales. Daisy, elle demeure fidèle à elle-même. Tom Collier, se retrouve a évoluer, par amour pour sa femme, dans un milieu de conventions bourgeoises qui ne l'intéressent pas.\",\n\t\t\t\"popularity\": 2.102,\n\t\t\t\"releaseDate\": \"1932-12-28\",\n\t\t\t\"title\": \"The Animal Kingdom\",\n\t\t\t\"video\": false,\n\t\t\t\"voteAverage\": 6.3,\n\t\t\t\"voteCount\": 13,\n\t\t\t\"backdropPath\": \"/5P1Hx46wvCVx9D9yT8M5rdUIHZB.jpg\",\n\t\t\t\"posterPath\": \"/3sLWwNvS77xynAGLkbiHVXlO3UH.jpg\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 311015,\n\t\t\t\"mediaType\": \"movie\",\n\t\t\t\"adult\": false,\n\t\t\t\"genreIds\": [\n\t\t\t\t99\n\t\t\t],\n\t\t\t\"originalLanguage\": \"en\",\n\t\t\t\"originalTitle\": \"Disney Parks: Disney's Animal Kingdom\",\n\t\t\t\"overview\": \"\",\n\t\t\t\"popularity\": 1.208,\n\t\t\t\"releaseDate\": \"2010-01-01\",\n\t\t\t\"title\": \"Disney Parks: Disney's Animal Kingdom\",\n\t\t\t\"video\": true,\n\t\t\t\"voteAverage\": 9,\n\t\t\t\"voteCount\": 2,\n\t\t\t\"backdropPath\": null,\n\t\t\t\"posterPath\": \"/93OEKY5vnKqGFbOyHtUAdcEz8NV.jpg\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 291774,\n\t\t\t\"mediaType\": \"movie\",\n\t\t\t\"adult\": false,\n\t\t\t\"genreIds\": [],\n\t\t\t\"originalLanguage\": \"en\",\n\t\t\t\"originalTitle\": \"Kenya 3D: Animal Kingdom\",\n\t\t\t\"overview\": \"\",\n\t\t\t\"popularity\": 0.6,\n\t\t\t\"releaseDate\": \"2013-03-08\",\n\t\t\t\"title\": \"Kenya 3D: Animal Kingdom\",\n\t\t\t\"video\": false,\n\t\t\t\"voteAverage\": 0,\n\t\t\t\"voteCount\": 0,\n\t\t\t\"backdropPath\": null,\n\t\t\t\"posterPath\": null\n\t\t},\n\t\t{\n\t\t\t\"id\": 640253,\n\t\t\t\"mediaType\": \"movie\",\n\t\t\t\"adult\": false,\n\t\t\t\"genreIds\": [],\n\t\t\t\"originalLanguage\": \"it\",\n\t\t\t\"originalTitle\": \"Animal Kingdom\",\n\t\t\t\"overview\": \"\",\n\t\t\t\"popularity\": 0.6,\n\t\t\t\"releaseDate\": \"2016-11-12\",\n\t\t\t\"title\": \"Animal Kingdom\",\n\t\t\t\"video\": false,\n\t\t\t\"voteAverage\": 0,\n\t\t\t\"voteCount\": 0,\n\t\t\t\"backdropPath\": null,\n\t\t\t\"posterPath\": \"/vJFK5cCcIh4X4op0oeK5iY2ibPv.jpg\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 507434,\n\t\t\t\"mediaType\": \"movie\",\n\t\t\t\"adult\": false,\n\t\t\t\"genreIds\": [\n\t\t\t\t27\n\t\t\t],\n\t\t\t\"originalLanguage\": \"en\",\n\t\t\t\"originalTitle\": \"Animal Kingdom\",\n\t\t\t\"overview\": \"\",\n\t\t\t\"popularity\": 0.6,\n\t\t\t\"releaseDate\": \"2017-02-25\",\n\t\t\t\"title\": \"Animal Kingdom\",\n\t\t\t\"video\": false,\n\t\t\t\"voteAverage\": 0,\n\t\t\t\"voteCount\": 0,\n\t\t\t\"backdropPath\": \"/8QxSJRLLw2m8ymrFsC2xJ26yd1n.jpg\",\n\t\t\t\"posterPath\": \"/s77Q92boNGgkT2J5se3gwq5N8Xp.jpg\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 775877,\n\t\t\t\"mediaType\": \"movie\",\n\t\t\t\"adult\": false,\n\t\t\t\"genreIds\": [],\n\t\t\t\"originalLanguage\": \"en\",\n\t\t\t\"originalTitle\": \"Disney's Animal Kingdom\",\n\t\t\t\"overview\": \"\",\n\t\t\t\"popularity\": 0.6,\n\t\t\t\"releaseDate\": \"2004-05-12\",\n\t\t\t\"title\": \"Disney's Animal Kingdom\",\n\t\t\t\"video\": true,\n\t\t\t\"voteAverage\": 0,\n\t\t\t\"voteCount\": 0,\n\t\t\t\"backdropPath\": null,\n\t\t\t\"posterPath\": null\n\t\t},\n\t\t{\n\t\t\t\"id\": 318575,\n\t\t\t\"mediaType\": \"movie\",\n\t\t\t\"adult\": false,\n\t\t\t\"genreIds\": [\n\t\t\t\t99\n\t\t\t],\n\t\t\t\"originalLanguage\": \"en\",\n\t\t\t\"originalTitle\": \"Nature: Love in the Animal Kingdom\",\n\t\t\t\"overview\": \"\",\n\t\t\t\"popularity\": 0.655,\n\t\t\t\"releaseDate\": \"2013-11-06\",\n\t\t\t\"title\": \"Nature: Love in the Animal Kingdom\",\n\t\t\t\"video\": true,\n\t\t\t\"voteAverage\": 9.5,\n\t\t\t\"voteCount\": 2,\n\t\t\t\"backdropPath\": \"/vx2dfrXPTn0dKoyIqCEgrGvzwkd.jpg\",\n\t\t\t\"posterPath\": \"/1fd53UCxtLAItNI5jMtVetFuw6v.jpg\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 743266,\n\t\t\t\"mediaType\": \"movie\",\n\t\t\t\"adult\": false,\n\t\t\t\"genreIds\": [],\n\t\t\t\"originalLanguage\": \"en\",\n\t\t\t\"originalTitle\": \"Animal Kingdom: Great Are Thy Works\",\n\t\t\t\"overview\": \"\",\n\t\t\t\"popularity\": 0.6,\n\t\t\t\"releaseDate\": \"1993-01-01\",\n\t\t\t\"title\": \"Animal Kingdom: Great Are Thy Works\",\n\t\t\t\"video\": false,\n\t\t\t\"voteAverage\": 0,\n\t\t\t\"voteCount\": 0,\n\t\t\t\"backdropPath\": null,\n\t\t\t\"posterPath\": \"/vjnsGLvymjG7dAIbjwzgFCdbhl6.jpg\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 828152,\n\t\t\t\"mediaType\": \"movie\",\n\t\t\t\"adult\": false,\n\t\t\t\"genreIds\": [\n\t\t\t\t99\n\t\t\t],\n\t\t\t\"originalLanguage\": \"en\",\n\t\t\t\"originalTitle\": \"Disney's Animal Kingdom: Alive with Magic\",\n\t\t\t\"overview\": \"\",\n\t\t\t\"popularity\": 0.6,\n\t\t\t\"releaseDate\": \"2017-06-27\",\n\t\t\t\"title\": \"Disney's Animal Kingdom: Alive with Magic\",\n\t\t\t\"video\": false,\n\t\t\t\"voteAverage\": 0,\n\t\t\t\"voteCount\": 0,\n\t\t\t\"backdropPath\": null,\n\t\t\t\"posterPath\": \"/amzVT8T9Ju3KLCDnBq4Rhf3LO8j.jpg\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 280391,\n\t\t\t\"mediaType\": \"movie\",\n\t\t\t\"adult\": false,\n\t\t\t\"genreIds\": [\n\t\t\t\t12,\n\t\t\t\t35,\n\t\t\t\t16\n\t\t\t],\n\t\t\t\"originalLanguage\": \"fr\",\n\t\t\t\"originalTitle\": \"Pourquoi j'ai pas mangé mon père\",\n\t\t\t\"overview\": \"L’histoire trépidante d’Édouard, fils aîné du roi des simiens, qui, considéré à sa naissance comme trop malingre, est rejeté par sa tribu. Il grandit loin d’eux, auprès de son ami Ian, et, incroyablement ingénieux, il découvre le feu, la chasse, l’habitat moderne, l’amour et même… l’espoir. Généreux, il veut tout partager, révolutionne l’ordre établi, et mène son peuple avec éclat et humour vers la véritable humanité… celle où on ne mange pas son père.\",\n\t\t\t\"popularity\": 12.971,\n\t\t\t\"releaseDate\": \"2015-04-08\",\n\t\t\t\"title\": \"Pourquoi j'ai pas mangé mon père\",\n\t\t\t\"video\": false,\n\t\t\t\"voteAverage\": 5.3,\n\t\t\t\"voteCount\": 303,\n\t\t\t\"backdropPath\": \"/msDLrSt7Ozpe6oOg4XJrsQJd2IE.jpg\",\n\t\t\t\"posterPath\": \"/efpzs2g1uRNcP8wPbIKSRPPH0aC.jpg\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 775559,\n\t\t\t\"mediaType\": \"movie\",\n\t\t\t\"adult\": false,\n\t\t\t\"genreIds\": [],\n\t\t\t\"originalLanguage\": \"en\",\n\t\t\t\"originalTitle\": \"A New species of Theme Park: Disney’s Animal Kingdom\",\n\t\t\t\"overview\": \"\",\n\t\t\t\"popularity\": 0.6,\n\t\t\t\"releaseDate\": \"1998-04-14\",\n\t\t\t\"title\": \"A New species of Theme Park: Disney’s Animal Kingdom\",\n\t\t\t\"video\": true,\n\t\t\t\"voteAverage\": 0,\n\t\t\t\"voteCount\": 0,\n\t\t\t\"backdropPath\": null,\n\t\t\t\"posterPath\": null\n\t\t},\n\t\t{\n\t\t\t\"id\": 775831,\n\t\t\t\"mediaType\": \"movie\",\n\t\t\t\"adult\": false,\n\t\t\t\"genreIds\": [],\n\t\t\t\"originalLanguage\": \"en\",\n\t\t\t\"originalTitle\": \"Disney Animal Kingdom Villas: A Village Comes to Life\",\n\t\t\t\"overview\": \"\",\n\t\t\t\"popularity\": 0.6,\n\t\t\t\"releaseDate\": \"2007-06-14\",\n\t\t\t\"title\": \"Disney Animal Kingdom Villas: A Village Comes to Life\",\n\t\t\t\"video\": true,\n\t\t\t\"voteAverage\": 0,\n\t\t\t\"voteCount\": 0,\n\t\t\t\"backdropPath\": null,\n\t\t\t\"posterPath\": null\n\t\t},\n\t\t{\n\t\t\t\"id\": 432906,\n\t\t\t\"mediaType\": \"movie\",\n\t\t\t\"adult\": false,\n\t\t\t\"genreIds\": [\n\t\t\t\t99\n\t\t\t],\n\t\t\t\"originalLanguage\": \"en\",\n\t\t\t\"originalTitle\": \"Out in Nature: Homosexual Behaviour in the Animal Kingdom\",\n\t\t\t\"overview\": \"\",\n\t\t\t\"popularity\": 0.6,\n\t\t\t\"releaseDate\": \"2001-09-07\",\n\t\t\t\"title\": \"Out in Nature: Homosexual Behaviour in the Animal Kingdom\",\n\t\t\t\"video\": false,\n\t\t\t\"voteAverage\": 6.8,\n\t\t\t\"voteCount\": 4,\n\t\t\t\"backdropPath\": null,\n\t\t\t\"posterPath\": \"/jjxhR9ZxZ3vhauK8IDR6wIBlCLI.jpg\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 128887,\n\t\t\t\"mediaType\": \"movie\",\n\t\t\t\"adult\": false,\n\t\t\t\"genreIds\": [\n\t\t\t\t16,\n\t\t\t\t35\n\t\t\t],\n\t\t\t\"originalLanguage\": \"ja\",\n\t\t\t\"originalTitle\": \"クレヨンしんちゃん オタケべ！カスカベ野生王国\",\n\t\t\t\"overview\": \"\",\n\t\t\t\"popularity\": 5.365,\n\t\t\t\"releaseDate\": \"2009-04-18\",\n\t\t\t\"title\": \"クレヨンしんちゃん オタケべ！カスカベ野生王国\",\n\t\t\t\"video\": false,\n\t\t\t\"voteAverage\": 8.5,\n\t\t\t\"voteCount\": 10,\n\t\t\t\"backdropPath\": \"/azvwXB25Wvbx2Cou3Th7lbnjrqP.jpg\",\n\t\t\t\"posterPath\": \"/h7LipCtdCyBOKR1By5wSP2Ufy3c.jpg\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 579733,\n\t\t\t\"mediaType\": \"movie\",\n\t\t\t\"adult\": false,\n\t\t\t\"genreIds\": [],\n\t\t\t\"originalLanguage\": \"no\",\n\t\t\t\"originalTitle\": \"Dyreriket\",\n\t\t\t\"overview\": \"\",\n\t\t\t\"popularity\": 0.6,\n\t\t\t\"releaseDate\": \"2018-05-01\",\n\t\t\t\"title\": \"Dyreriket\",\n\t\t\t\"video\": false,\n\t\t\t\"voteAverage\": 0,\n\t\t\t\"voteCount\": 0,\n\t\t\t\"backdropPath\": null,\n\t\t\t\"posterPath\": null\n\t\t},\n\t\t{\n\t\t\t\"id\": 111612,\n\t\t\t\"firstAirDate\": \"2018-10-12\",\n\t\t\t\"genreIds\": [\n\t\t\t\t10764\n\t\t\t],\n\t\t\t\"mediaType\": \"tv\",\n\t\t\t\"name\": \"坂上どうぶつ王国\",\n\t\t\t\"originCountry\": [\n\t\t\t\t\"JP\"\n\t\t\t],\n\t\t\t\"originalLanguage\": \"ja\",\n\t\t\t\"originalName\": \"坂上どうぶつ王国\",\n\t\t\t\"overview\": \"\",\n\t\t\t\"popularity\": 1.186,\n\t\t\t\"voteAverage\": 0,\n\t\t\t\"voteCount\": 0,\n\t\t\t\"backdropPath\": \"/op8bK5R76L9QpwcVTnYG7nKXKsU.jpg\",\n\t\t\t\"posterPath\": \"/2VPq9RYaDohOT8YqTibKZMMT2Ue.jpg\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 156216,\n\t\t\t\"firstAirDate\": \"2022-01-17\",\n\t\t\t\"genreIds\": [\n\t\t\t\t16\n\t\t\t],\n\t\t\t\"mediaType\": \"tv\",\n\t\t\t\"name\": \"动物王国的故事\",\n\t\t\t\"originCountry\": [\n\t\t\t\t\"CN\"\n\t\t\t],\n\t\t\t\"originalLanguage\": \"zh\",\n\t\t\t\"originalName\": \"动物王国的故事\",\n\t\t\t\"overview\": \"\",\n\t\t\t\"popularity\": 0.6,\n\t\t\t\"voteAverage\": 0,\n\t\t\t\"voteCount\": 0,\n\t\t\t\"backdropPath\": \"/uxIJQnjzIQn2MGHk17nNhoIEkxU.jpg\",\n\t\t\t\"posterPath\": \"/v90bqYZRUT30n22DdwahmW18LFn.jpg\"\n\t\t}\n\t]\n}"
  },
  {
    "path": "src/modules/common/examples/music.json",
    "content": "{\n\t\"title\": \"Celebrate\",\n\t\"disambiguation\": \"\",\n\t\"overview\": \"\",\n\t\"artistId\": 9,\n\t\"foreignAlbumId\": \"bfedab35-92b7-449b-adf0-875439ec9a85\",\n\t\"monitored\": true,\n\t\"anyReleaseOk\": true,\n\t\"profileId\": 1,\n\t\"duration\": 1818062,\n\t\"albumType\": \"Album\",\n\t\"secondaryTypes\": [],\n\t\"mediumCount\": 1,\n\t\"ratings\": {\n\t\t\t\"votes\": 1,\n\t\t\t\"value\": 10\n\t},\n\t\"releaseDate\": \"2022-07-27T00:00:00Z\",\n\t\"releases\": [\n\t\t\t{\n\t\t\t\t\t\"id\": 202,\n\t\t\t\t\t\"albumId\": 32,\n\t\t\t\t\t\"foreignReleaseId\": \"22bd49a1-f858-427d-94ee-1788b54fb508\",\n\t\t\t\t\t\"title\": \"Celebrate\",\n\t\t\t\t\t\"status\": \"Official\",\n\t\t\t\t\t\"duration\": 0,\n\t\t\t\t\t\"trackCount\": 9,\n\t\t\t\t\t\"media\": [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"mediumNumber\": 1,\n\t\t\t\t\t\t\t\t\t\"mediumName\": \"\",\n\t\t\t\t\t\t\t\t\t\"mediumFormat\": \"CD\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"mediumCount\": 1,\n\t\t\t\t\t\"disambiguation\": \"ONCE JAPAN限定盤\",\n\t\t\t\t\t\"country\": [\n\t\t\t\t\t\t\t\"Japan\"\n\t\t\t\t\t],\n\t\t\t\t\t\"label\": [\n\t\t\t\t\t\t\t\"Warner Music Japan\"\n\t\t\t\t\t],\n\t\t\t\t\t\"format\": \"CD\",\n\t\t\t\t\t\"monitored\": false\n\t\t\t},\n\t\t\t{\n\t\t\t\t\t\"id\": 203,\n\t\t\t\t\t\"albumId\": 32,\n\t\t\t\t\t\"foreignReleaseId\": \"52c73f5f-4f91-451b-96d1-3ac3ef9371ee\",\n\t\t\t\t\t\"title\": \"Celebrate\",\n\t\t\t\t\t\"status\": \"Official\",\n\t\t\t\t\t\"duration\": 0,\n\t\t\t\t\t\"trackCount\": 9,\n\t\t\t\t\t\"media\": [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"mediumNumber\": 1,\n\t\t\t\t\t\t\t\t\t\"mediumName\": \"\",\n\t\t\t\t\t\t\t\t\t\"mediumFormat\": \"CD\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"mediumCount\": 1,\n\t\t\t\t\t\"disambiguation\": \"初回限定盤B\",\n\t\t\t\t\t\"country\": [\n\t\t\t\t\t\t\t\"Japan\"\n\t\t\t\t\t],\n\t\t\t\t\t\"label\": [\n\t\t\t\t\t\t\t\"Warner Music Japan\"\n\t\t\t\t\t],\n\t\t\t\t\t\"format\": \"CD\",\n\t\t\t\t\t\"monitored\": false\n\t\t\t},\n\t\t\t{\n\t\t\t\t\t\"id\": 204,\n\t\t\t\t\t\"albumId\": 32,\n\t\t\t\t\t\"foreignReleaseId\": \"5745040b-a5fa-4dae-ad31-0bce9d501e23\",\n\t\t\t\t\t\"title\": \"Celebrate\",\n\t\t\t\t\t\"status\": \"Official\",\n\t\t\t\t\t\"duration\": 0,\n\t\t\t\t\t\"trackCount\": 9,\n\t\t\t\t\t\"media\": [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"mediumNumber\": 1,\n\t\t\t\t\t\t\t\t\t\"mediumName\": \"\",\n\t\t\t\t\t\t\t\t\t\"mediumFormat\": \"CD\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"mediumCount\": 1,\n\t\t\t\t\t\"disambiguation\": \"JEONGYEON盤\",\n\t\t\t\t\t\"country\": [\n\t\t\t\t\t\t\t\"Japan\"\n\t\t\t\t\t],\n\t\t\t\t\t\"label\": [\n\t\t\t\t\t\t\t\"Warner Music Japan\"\n\t\t\t\t\t],\n\t\t\t\t\t\"format\": \"CD\",\n\t\t\t\t\t\"monitored\": false\n\t\t\t},\n\t\t\t{\n\t\t\t\t\t\"id\": 205,\n\t\t\t\t\t\"albumId\": 32,\n\t\t\t\t\t\"foreignReleaseId\": \"006f9135-454b-4182-a057-47d1b002a282\",\n\t\t\t\t\t\"title\": \"Celebrate\",\n\t\t\t\t\t\"status\": \"Official\",\n\t\t\t\t\t\"duration\": 0,\n\t\t\t\t\t\"trackCount\": 9,\n\t\t\t\t\t\"media\": [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"mediumNumber\": 1,\n\t\t\t\t\t\t\t\t\t\"mediumName\": \"\",\n\t\t\t\t\t\t\t\t\t\"mediumFormat\": \"CD\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"mediumCount\": 1,\n\t\t\t\t\t\"disambiguation\": \"NAYEON盤\",\n\t\t\t\t\t\"country\": [\n\t\t\t\t\t\t\t\"Japan\"\n\t\t\t\t\t],\n\t\t\t\t\t\"label\": [\n\t\t\t\t\t\t\t\"Warner Music Japan\"\n\t\t\t\t\t],\n\t\t\t\t\t\"format\": \"CD\",\n\t\t\t\t\t\"monitored\": false\n\t\t\t},\n\t\t\t{\n\t\t\t\t\t\"id\": 206,\n\t\t\t\t\t\"albumId\": 32,\n\t\t\t\t\t\"foreignReleaseId\": \"eeacd54b-a2bd-48f8-8d7c-3ab55b68f17c\",\n\t\t\t\t\t\"title\": \"Celebrate\",\n\t\t\t\t\t\"status\": \"Official\",\n\t\t\t\t\t\"duration\": 0,\n\t\t\t\t\t\"trackCount\": 81,\n\t\t\t\t\t\"media\": [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"mediumNumber\": 1,\n\t\t\t\t\t\t\t\t\t\"mediumName\": \"NAYEON盤\",\n\t\t\t\t\t\t\t\t\t\"mediumFormat\": \"CD\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"mediumNumber\": 2,\n\t\t\t\t\t\t\t\t\t\"mediumName\": \"JEONGYEON盤\",\n\t\t\t\t\t\t\t\t\t\"mediumFormat\": \"CD\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"mediumNumber\": 3,\n\t\t\t\t\t\t\t\t\t\"mediumName\": \"MOMO盤\",\n\t\t\t\t\t\t\t\t\t\"mediumFormat\": \"CD\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"mediumNumber\": 4,\n\t\t\t\t\t\t\t\t\t\"mediumName\": \"SANA盤\",\n\t\t\t\t\t\t\t\t\t\"mediumFormat\": \"CD\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"mediumNumber\": 5,\n\t\t\t\t\t\t\t\t\t\"mediumName\": \"JIHYO盤\",\n\t\t\t\t\t\t\t\t\t\"mediumFormat\": \"CD\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"mediumNumber\": 6,\n\t\t\t\t\t\t\t\t\t\"mediumName\": \"MINA盤\",\n\t\t\t\t\t\t\t\t\t\"mediumFormat\": \"CD\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"mediumNumber\": 7,\n\t\t\t\t\t\t\t\t\t\"mediumName\": \"DAHYUN盤\",\n\t\t\t\t\t\t\t\t\t\"mediumFormat\": \"CD\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"mediumNumber\": 8,\n\t\t\t\t\t\t\t\t\t\"mediumName\": \"CHAEYOUNG盤\",\n\t\t\t\t\t\t\t\t\t\"mediumFormat\": \"CD\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"mediumNumber\": 9,\n\t\t\t\t\t\t\t\t\t\"mediumName\": \"TZUYU盤\",\n\t\t\t\t\t\t\t\t\t\"mediumFormat\": \"CD\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"mediumCount\": 9,\n\t\t\t\t\t\"disambiguation\": \"5th Anniversary Collection BOX\",\n\t\t\t\t\t\"country\": [\n\t\t\t\t\t\t\t\"Japan\"\n\t\t\t\t\t],\n\t\t\t\t\t\"label\": [\n\t\t\t\t\t\t\t\"Warner Music Japan\",\n\t\t\t\t\t\t\t\"Warner Music Japan\",\n\t\t\t\t\t\t\t\"Warner Music Japan\",\n\t\t\t\t\t\t\t\"Warner Music Japan\",\n\t\t\t\t\t\t\t\"Warner Music Japan\",\n\t\t\t\t\t\t\t\"Warner Music Japan\",\n\t\t\t\t\t\t\t\"Warner Music Japan\",\n\t\t\t\t\t\t\t\"Warner Music Japan\",\n\t\t\t\t\t\t\t\"Warner Music Japan\"\n\t\t\t\t\t],\n\t\t\t\t\t\"format\": \"9xCD\",\n\t\t\t\t\t\"monitored\": false\n\t\t\t},\n\t\t\t{\n\t\t\t\t\t\"id\": 207,\n\t\t\t\t\t\"albumId\": 32,\n\t\t\t\t\t\"foreignReleaseId\": \"8ddd43f0-859e-4cff-be7c-daf6806cc035\",\n\t\t\t\t\t\"title\": \"Celebrate\",\n\t\t\t\t\t\"status\": \"Official\",\n\t\t\t\t\t\"duration\": 0,\n\t\t\t\t\t\"trackCount\": 9,\n\t\t\t\t\t\"media\": [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"mediumNumber\": 1,\n\t\t\t\t\t\t\t\t\t\"mediumName\": \"\",\n\t\t\t\t\t\t\t\t\t\"mediumFormat\": \"CD\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"mediumCount\": 1,\n\t\t\t\t\t\"disambiguation\": \"JIHYO盤\",\n\t\t\t\t\t\"country\": [\n\t\t\t\t\t\t\t\"Japan\"\n\t\t\t\t\t],\n\t\t\t\t\t\"label\": [\n\t\t\t\t\t\t\t\"Warner Music Japan\"\n\t\t\t\t\t],\n\t\t\t\t\t\"format\": \"CD\",\n\t\t\t\t\t\"monitored\": false\n\t\t\t},\n\t\t\t{\n\t\t\t\t\t\"id\": 208,\n\t\t\t\t\t\"albumId\": 32,\n\t\t\t\t\t\"foreignReleaseId\": \"ad8e0553-97de-499b-8010-85bd02c62859\",\n\t\t\t\t\t\"title\": \"Celebrate\",\n\t\t\t\t\t\"status\": \"Official\",\n\t\t\t\t\t\"duration\": 0,\n\t\t\t\t\t\"trackCount\": 9,\n\t\t\t\t\t\"media\": [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"mediumNumber\": 1,\n\t\t\t\t\t\t\t\t\t\"mediumName\": \"\",\n\t\t\t\t\t\t\t\t\t\"mediumFormat\": \"CD\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"mediumCount\": 1,\n\t\t\t\t\t\"disambiguation\": \"TZUYU盤\",\n\t\t\t\t\t\"country\": [\n\t\t\t\t\t\t\t\"Japan\"\n\t\t\t\t\t],\n\t\t\t\t\t\"label\": [\n\t\t\t\t\t\t\t\"Warner Music Japan\"\n\t\t\t\t\t],\n\t\t\t\t\t\"format\": \"CD\",\n\t\t\t\t\t\"monitored\": false\n\t\t\t},\n\t\t\t{\n\t\t\t\t\t\"id\": 209,\n\t\t\t\t\t\"albumId\": 32,\n\t\t\t\t\t\"foreignReleaseId\": \"276bf831-8cae-49a0-bc50-479869d401ac\",\n\t\t\t\t\t\"title\": \"Celebrate\",\n\t\t\t\t\t\"status\": \"Official\",\n\t\t\t\t\t\"duration\": 0,\n\t\t\t\t\t\"trackCount\": 9,\n\t\t\t\t\t\"media\": [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"mediumNumber\": 1,\n\t\t\t\t\t\t\t\t\t\"mediumName\": \"\",\n\t\t\t\t\t\t\t\t\t\"mediumFormat\": \"CD\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"mediumCount\": 1,\n\t\t\t\t\t\"disambiguation\": \"MOMO盤\",\n\t\t\t\t\t\"country\": [\n\t\t\t\t\t\t\t\"Japan\"\n\t\t\t\t\t],\n\t\t\t\t\t\"label\": [\n\t\t\t\t\t\t\t\"Warner Music Japan\"\n\t\t\t\t\t],\n\t\t\t\t\t\"format\": \"CD\",\n\t\t\t\t\t\"monitored\": false\n\t\t\t},\n\t\t\t{\n\t\t\t\t\t\"id\": 210,\n\t\t\t\t\t\"albumId\": 32,\n\t\t\t\t\t\"foreignReleaseId\": \"3d201058-deb0-4159-a82f-d9076a608036\",\n\t\t\t\t\t\"title\": \"Celebrate\",\n\t\t\t\t\t\"status\": \"Official\",\n\t\t\t\t\t\"duration\": 0,\n\t\t\t\t\t\"trackCount\": 9,\n\t\t\t\t\t\"media\": [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"mediumNumber\": 1,\n\t\t\t\t\t\t\t\t\t\"mediumName\": \"\",\n\t\t\t\t\t\t\t\t\t\"mediumFormat\": \"CD\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"mediumCount\": 1,\n\t\t\t\t\t\"disambiguation\": \"MINA盤\",\n\t\t\t\t\t\"country\": [\n\t\t\t\t\t\t\t\"Japan\"\n\t\t\t\t\t],\n\t\t\t\t\t\"label\": [\n\t\t\t\t\t\t\t\"Warner Music Japan\"\n\t\t\t\t\t],\n\t\t\t\t\t\"format\": \"CD\",\n\t\t\t\t\t\"monitored\": false\n\t\t\t},\n\t\t\t{\n\t\t\t\t\t\"id\": 211,\n\t\t\t\t\t\"albumId\": 32,\n\t\t\t\t\t\"foreignReleaseId\": \"e1fbf96d-f83e-478c-be7d-f0f6dd5305d1\",\n\t\t\t\t\t\"title\": \"Celebrate\",\n\t\t\t\t\t\"status\": \"Official\",\n\t\t\t\t\t\"duration\": 0,\n\t\t\t\t\t\"trackCount\": 9,\n\t\t\t\t\t\"media\": [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"mediumNumber\": 1,\n\t\t\t\t\t\t\t\t\t\"mediumName\": \"\",\n\t\t\t\t\t\t\t\t\t\"mediumFormat\": \"CD\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"mediumCount\": 1,\n\t\t\t\t\t\"disambiguation\": \"DAHYUN盤\",\n\t\t\t\t\t\"country\": [\n\t\t\t\t\t\t\t\"Japan\"\n\t\t\t\t\t],\n\t\t\t\t\t\"label\": [\n\t\t\t\t\t\t\t\"Warner Music Japan\"\n\t\t\t\t\t],\n\t\t\t\t\t\"format\": \"CD\",\n\t\t\t\t\t\"monitored\": false\n\t\t\t},\n\t\t\t{\n\t\t\t\t\t\"id\": 212,\n\t\t\t\t\t\"albumId\": 32,\n\t\t\t\t\t\"foreignReleaseId\": \"769a7006-763b-4cd8-8d1f-d389d52ec002\",\n\t\t\t\t\t\"title\": \"Celebrate\",\n\t\t\t\t\t\"status\": \"Official\",\n\t\t\t\t\t\"duration\": 0,\n\t\t\t\t\t\"trackCount\": 9,\n\t\t\t\t\t\"media\": [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"mediumNumber\": 1,\n\t\t\t\t\t\t\t\t\t\"mediumName\": \"\",\n\t\t\t\t\t\t\t\t\t\"mediumFormat\": \"CD\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"mediumCount\": 1,\n\t\t\t\t\t\"disambiguation\": \"CHAEYOUNG盤\",\n\t\t\t\t\t\"country\": [\n\t\t\t\t\t\t\t\"Japan\"\n\t\t\t\t\t],\n\t\t\t\t\t\"label\": [\n\t\t\t\t\t\t\t\"Warner Music Japan\"\n\t\t\t\t\t],\n\t\t\t\t\t\"format\": \"CD\",\n\t\t\t\t\t\"monitored\": false\n\t\t\t},\n\t\t\t{\n\t\t\t\t\t\"id\": 213,\n\t\t\t\t\t\"albumId\": 32,\n\t\t\t\t\t\"foreignReleaseId\": \"42e74581-0ef3-4db9-8a20-ba8a3daa1cf0\",\n\t\t\t\t\t\"title\": \"Celebrate\",\n\t\t\t\t\t\"status\": \"Official\",\n\t\t\t\t\t\"duration\": 0,\n\t\t\t\t\t\"trackCount\": 9,\n\t\t\t\t\t\"media\": [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"mediumNumber\": 1,\n\t\t\t\t\t\t\t\t\t\"mediumName\": \"\",\n\t\t\t\t\t\t\t\t\t\"mediumFormat\": \"CD\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"mediumCount\": 1,\n\t\t\t\t\t\"disambiguation\": \"初回限定盤A\",\n\t\t\t\t\t\"country\": [\n\t\t\t\t\t\t\t\"Japan\"\n\t\t\t\t\t],\n\t\t\t\t\t\"label\": [\n\t\t\t\t\t\t\t\"Warner Music Japan\",\n\t\t\t\t\t\t\t\"Warner Music Japan\"\n\t\t\t\t\t],\n\t\t\t\t\t\"format\": \"CD\",\n\t\t\t\t\t\"monitored\": false\n\t\t\t},\n\t\t\t{\n\t\t\t\t\t\"id\": 214,\n\t\t\t\t\t\"albumId\": 32,\n\t\t\t\t\t\"foreignReleaseId\": \"81bdf07f-61ad-4436-bfae-63cd1d9e700c\",\n\t\t\t\t\t\"title\": \"Celebrate\",\n\t\t\t\t\t\"status\": \"Official\",\n\t\t\t\t\t\"duration\": 0,\n\t\t\t\t\t\"trackCount\": 9,\n\t\t\t\t\t\"media\": [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"mediumNumber\": 1,\n\t\t\t\t\t\t\t\t\t\"mediumName\": \"\",\n\t\t\t\t\t\t\t\t\t\"mediumFormat\": \"CD\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"mediumCount\": 1,\n\t\t\t\t\t\"disambiguation\": \"通常盤\",\n\t\t\t\t\t\"country\": [\n\t\t\t\t\t\t\t\"Japan\"\n\t\t\t\t\t],\n\t\t\t\t\t\"label\": [\n\t\t\t\t\t\t\t\"Warner Music Japan\"\n\t\t\t\t\t],\n\t\t\t\t\t\"format\": \"CD\",\n\t\t\t\t\t\"monitored\": false\n\t\t\t},\n\t\t\t{\n\t\t\t\t\t\"id\": 215,\n\t\t\t\t\t\"albumId\": 32,\n\t\t\t\t\t\"foreignReleaseId\": \"273b3ba1-88e8-4653-a542-c8b0489c1772\",\n\t\t\t\t\t\"title\": \"Celebrate\",\n\t\t\t\t\t\"status\": \"Official\",\n\t\t\t\t\t\"duration\": 0,\n\t\t\t\t\t\"trackCount\": 9,\n\t\t\t\t\t\"media\": [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"mediumNumber\": 1,\n\t\t\t\t\t\t\t\t\t\"mediumName\": \"\",\n\t\t\t\t\t\t\t\t\t\"mediumFormat\": \"CD\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"mediumCount\": 1,\n\t\t\t\t\t\"disambiguation\": \"SANA盤\",\n\t\t\t\t\t\"country\": [\n\t\t\t\t\t\t\t\"Japan\"\n\t\t\t\t\t],\n\t\t\t\t\t\"label\": [\n\t\t\t\t\t\t\t\"Warner Music Japan\"\n\t\t\t\t\t],\n\t\t\t\t\t\"format\": \"CD\",\n\t\t\t\t\t\"monitored\": false\n\t\t\t},\n\t\t\t{\n\t\t\t\t\t\"id\": 216,\n\t\t\t\t\t\"albumId\": 32,\n\t\t\t\t\t\"foreignReleaseId\": \"2442df5f-4090-452c-be7f-5885dffee8e2\",\n\t\t\t\t\t\"title\": \"Celebrate\",\n\t\t\t\t\t\"status\": \"Official\",\n\t\t\t\t\t\"duration\": 1818062,\n\t\t\t\t\t\"trackCount\": 9,\n\t\t\t\t\t\"media\": [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"mediumNumber\": 1,\n\t\t\t\t\t\t\t\t\t\"mediumName\": \"\",\n\t\t\t\t\t\t\t\t\t\"mediumFormat\": \"Digital Media\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"mediumCount\": 1,\n\t\t\t\t\t\"disambiguation\": \"\",\n\t\t\t\t\t\"country\": [\n\t\t\t\t\t\t\t\"Algeria\",\n\t\t\t\t\t\t\t\"Angola\",\n\t\t\t\t\t\t\t\"Anguilla\",\n\t\t\t\t\t\t\t\"Antigua and Barbuda\",\n\t\t\t\t\t\t\t\"Argentina\",\n\t\t\t\t\t\t\t\"Armenia\",\n\t\t\t\t\t\t\t\"Australia\",\n\t\t\t\t\t\t\t\"Austria\",\n\t\t\t\t\t\t\t\"Azerbaijan\",\n\t\t\t\t\t\t\t\"Bahamas\",\n\t\t\t\t\t\t\t\"Bahrain\",\n\t\t\t\t\t\t\t\"Barbados\",\n\t\t\t\t\t\t\t\"Belgium\",\n\t\t\t\t\t\t\t\"Belize\",\n\t\t\t\t\t\t\t\"Benin\",\n\t\t\t\t\t\t\t\"Bermuda\",\n\t\t\t\t\t\t\t\"Bhutan\",\n\t\t\t\t\t\t\t\"Bolivia\",\n\t\t\t\t\t\t\t\"Bosnia and Herzegovina\",\n\t\t\t\t\t\t\t\"Botswana\",\n\t\t\t\t\t\t\t\"Brazil\",\n\t\t\t\t\t\t\t\"Brunei\",\n\t\t\t\t\t\t\t\"Bulgaria\",\n\t\t\t\t\t\t\t\"Burkina Faso\",\n\t\t\t\t\t\t\t\"Cambodia\",\n\t\t\t\t\t\t\t\"Cameroon\",\n\t\t\t\t\t\t\t\"Canada\",\n\t\t\t\t\t\t\t\"Cape Verde\",\n\t\t\t\t\t\t\t\"Cayman Islands\",\n\t\t\t\t\t\t\t\"Chad\",\n\t\t\t\t\t\t\t\"Chile\",\n\t\t\t\t\t\t\t\"China\",\n\t\t\t\t\t\t\t\"Colombia\",\n\t\t\t\t\t\t\t\"Congo\",\n\t\t\t\t\t\t\t\"Costa Rica\",\n\t\t\t\t\t\t\t\"Côte d'Ivoire\",\n\t\t\t\t\t\t\t\"Croatia\",\n\t\t\t\t\t\t\t\"Cyprus\",\n\t\t\t\t\t\t\t\"Czech Republic\",\n\t\t\t\t\t\t\t\"Denmark\",\n\t\t\t\t\t\t\t\"Dominica\",\n\t\t\t\t\t\t\t\"Dominican Republic\",\n\t\t\t\t\t\t\t\"Ecuador\",\n\t\t\t\t\t\t\t\"Egypt\",\n\t\t\t\t\t\t\t\"El Salvador\",\n\t\t\t\t\t\t\t\"Estonia\",\n\t\t\t\t\t\t\t\"Fiji\",\n\t\t\t\t\t\t\t\"Finland\",\n\t\t\t\t\t\t\t\"France\",\n\t\t\t\t\t\t\t\"Gabon\",\n\t\t\t\t\t\t\t\"Gambia\",\n\t\t\t\t\t\t\t\"Georgia\",\n\t\t\t\t\t\t\t\"Germany\",\n\t\t\t\t\t\t\t\"Ghana\",\n\t\t\t\t\t\t\t\"Greece\",\n\t\t\t\t\t\t\t\"Grenada\",\n\t\t\t\t\t\t\t\"Guatemala\",\n\t\t\t\t\t\t\t\"Guinea-Bissau\",\n\t\t\t\t\t\t\t\"Guyana\",\n\t\t\t\t\t\t\t\"Honduras\",\n\t\t\t\t\t\t\t\"Hong Kong\",\n\t\t\t\t\t\t\t\"Hungary\",\n\t\t\t\t\t\t\t\"Iceland\",\n\t\t\t\t\t\t\t\"India\",\n\t\t\t\t\t\t\t\"Indonesia\",\n\t\t\t\t\t\t\t\"Iraq\",\n\t\t\t\t\t\t\t\"Ireland\",\n\t\t\t\t\t\t\t\"Israel\",\n\t\t\t\t\t\t\t\"Italy\",\n\t\t\t\t\t\t\t\"Jamaica\",\n\t\t\t\t\t\t\t\"Japan\",\n\t\t\t\t\t\t\t\"Jordan\",\n\t\t\t\t\t\t\t\"Kazakhstan\",\n\t\t\t\t\t\t\t\"Kenya\",\n\t\t\t\t\t\t\t\"Kuwait\",\n\t\t\t\t\t\t\t\"Kyrgyzstan\",\n\t\t\t\t\t\t\t\"Laos\",\n\t\t\t\t\t\t\t\"Latvia\",\n\t\t\t\t\t\t\t\"Lebanon\",\n\t\t\t\t\t\t\t\"Liberia\",\n\t\t\t\t\t\t\t\"Libya\",\n\t\t\t\t\t\t\t\"Lithuania\",\n\t\t\t\t\t\t\t\"Luxembourg\",\n\t\t\t\t\t\t\t\"Macao\",\n\t\t\t\t\t\t\t\"North Macedonia\",\n\t\t\t\t\t\t\t\"Madagascar\",\n\t\t\t\t\t\t\t\"Malawi\",\n\t\t\t\t\t\t\t\"Malaysia\",\n\t\t\t\t\t\t\t\"Maldives\",\n\t\t\t\t\t\t\t\"Mali\",\n\t\t\t\t\t\t\t\"Malta\",\n\t\t\t\t\t\t\t\"Mauritania\",\n\t\t\t\t\t\t\t\"Mauritius\",\n\t\t\t\t\t\t\t\"Mexico\",\n\t\t\t\t\t\t\t\"Federated States of Micronesia\",\n\t\t\t\t\t\t\t\"Moldova\",\n\t\t\t\t\t\t\t\"Mongolia\",\n\t\t\t\t\t\t\t\"Montserrat\",\n\t\t\t\t\t\t\t\"Morocco\",\n\t\t\t\t\t\t\t\"Mozambique\",\n\t\t\t\t\t\t\t\"Myanmar\",\n\t\t\t\t\t\t\t\"Namibia\",\n\t\t\t\t\t\t\t\"Nepal\",\n\t\t\t\t\t\t\t\"Netherlands\",\n\t\t\t\t\t\t\t\"New Zealand\",\n\t\t\t\t\t\t\t\"Nicaragua\",\n\t\t\t\t\t\t\t\"Niger\",\n\t\t\t\t\t\t\t\"Nigeria\",\n\t\t\t\t\t\t\t\"Norway\",\n\t\t\t\t\t\t\t\"Oman\",\n\t\t\t\t\t\t\t\"Panama\",\n\t\t\t\t\t\t\t\"Papua New Guinea\",\n\t\t\t\t\t\t\t\"Paraguay\",\n\t\t\t\t\t\t\t\"Peru\",\n\t\t\t\t\t\t\t\"Philippines\",\n\t\t\t\t\t\t\t\"Poland\",\n\t\t\t\t\t\t\t\"Portugal\",\n\t\t\t\t\t\t\t\"Qatar\",\n\t\t\t\t\t\t\t\"Romania\",\n\t\t\t\t\t\t\t\"Rwanda\",\n\t\t\t\t\t\t\t\"Saint Kitts and Nevis\",\n\t\t\t\t\t\t\t\"Saint Lucia\",\n\t\t\t\t\t\t\t\"Saint Vincent and The Grenadines\",\n\t\t\t\t\t\t\t\"Saudi Arabia\",\n\t\t\t\t\t\t\t\"Senegal\",\n\t\t\t\t\t\t\t\"Seychelles\",\n\t\t\t\t\t\t\t\"Sierra Leone\",\n\t\t\t\t\t\t\t\"Singapore\",\n\t\t\t\t\t\t\t\"Slovakia\",\n\t\t\t\t\t\t\t\"Slovenia\",\n\t\t\t\t\t\t\t\"Solomon Islands\",\n\t\t\t\t\t\t\t\"South Africa\",\n\t\t\t\t\t\t\t\"Spain\",\n\t\t\t\t\t\t\t\"Sri Lanka\",\n\t\t\t\t\t\t\t\"Suriname\",\n\t\t\t\t\t\t\t\"Eswatini\",\n\t\t\t\t\t\t\t\"Sweden\",\n\t\t\t\t\t\t\t\"Switzerland\",\n\t\t\t\t\t\t\t\"Taiwan\",\n\t\t\t\t\t\t\t\"Tajikistan\",\n\t\t\t\t\t\t\t\"Tanzania\",\n\t\t\t\t\t\t\t\"Thailand\",\n\t\t\t\t\t\t\t\"Tonga\",\n\t\t\t\t\t\t\t\"Trinidad and Tobago\",\n\t\t\t\t\t\t\t\"Tunisia\",\n\t\t\t\t\t\t\t\"Turkey\",\n\t\t\t\t\t\t\t\"Turkmenistan\",\n\t\t\t\t\t\t\t\"Turks and Caicos Islands\",\n\t\t\t\t\t\t\t\"Uganda\",\n\t\t\t\t\t\t\t\"Ukraine\",\n\t\t\t\t\t\t\t\"United Arab Emirates\",\n\t\t\t\t\t\t\t\"United Kingdom\",\n\t\t\t\t\t\t\t\"United States\",\n\t\t\t\t\t\t\t\"Uruguay\",\n\t\t\t\t\t\t\t\"Uzbekistan\",\n\t\t\t\t\t\t\t\"Vanuatu\",\n\t\t\t\t\t\t\t\"Venezuela\",\n\t\t\t\t\t\t\t\"Vietnam\",\n\t\t\t\t\t\t\t\"British Virgin Islands\",\n\t\t\t\t\t\t\t\"Yemen\",\n\t\t\t\t\t\t\t\"Democratic Republic of the Congo\",\n\t\t\t\t\t\t\t\"Zambia\",\n\t\t\t\t\t\t\t\"Zimbabwe\",\n\t\t\t\t\t\t\t\"Montenegro\",\n\t\t\t\t\t\t\t\"Serbia\",\n\t\t\t\t\t\t\t\"Kosovo\"\n\t\t\t\t\t],\n\t\t\t\t\t\"label\": [\n\t\t\t\t\t\t\t\"Warner Music Japan\"\n\t\t\t\t\t],\n\t\t\t\t\t\"format\": \"Digital Media\",\n\t\t\t\t\t\"monitored\": true\n\t\t\t}\n\t],\n\t\"genres\": [],\n\t\"media\": [\n\t\t\t{\n\t\t\t\t\t\"mediumNumber\": 1,\n\t\t\t\t\t\"mediumName\": \"\",\n\t\t\t\t\t\"mediumFormat\": \"Digital Media\"\n\t\t\t}\n\t],\n\t\"artist\": {\n\t\t\t\"artistMetadataId\": 14,\n\t\t\t\"status\": \"continuing\",\n\t\t\t\"ended\": false,\n\t\t\t\"artistName\": \"TWICE\",\n\t\t\t\"foreignArtistId\": \"8da127cc-c432-418f-b356-ef36210d82ac\",\n\t\t\t\"tadbId\": 0,\n\t\t\t\"discogsId\": 0,\n\t\t\t\"overview\": \"Twice (Korean: 트와이스; RR: Teuwaiseu; Japanese: トゥワイス, Hepburn: To~uwaisu; commonly stylized in all caps as TWICE) is a South Korean girl group formed by JYP Entertainment. The group is composed of nine members: Nayeon, Jeongyeon, Momo, Sana, Jihyo, Mina, Dahyun, Chaeyoung, and Tzuyu. Twice was formed under the television program Sixteen (2015) and debuted on October 20, 2015, with the extended play (EP) The Story Begins.\\nTwice rose to domestic fame in 2016 with their single \\\"Cheer Up\\\", which charted at number one on the Gaon Digital Chart, became the best-performing single of the year, and won \\\"Song of the Year\\\" at the Melon Music Awards and Mnet Asian Music Awards. Their next single, \\\"TT\\\", from their third EP Twicecoaster: Lane 1, topped the Gaon charts for four consecutive weeks. The EP was the highest selling Korean girl group album of 2016. Within 19 months after debut, Twice had already sold over 1.2 million units of their four EPs and special album. As of December 2020, the group has sold over 10 million albums cumulatively in South Korea and Japan, becoming the highest-selling K-Pop girl group of all time.The group debuted in Japan on June 28, 2017, under Warner Music Japan, with the release of a compilation album titled #Twice. The album charted at number 2 on the Oricon Albums Chart with the highest first-week album sales by a K-pop artist in Japan in two years. It was followed by the release of Twice's first original Japanese maxi single titled \\\"One More Time\\\" in October. Twice became the first Korean girl group to earn a platinum certification from the Recording Industry Association of Japan (RIAJ) for both an album and CD single in the same year. Twice ranked third in the Top Artist category of Billboard Japan's 2017 Year-end Rankings, and in 2019, they became the first Korean girl group to embark on a Japanese dome tour.\\nTwice is the first female Korean act to simultaneously top both Billboard's World Albums and World Digital Song Sales charts with the release of their first studio album Twicetagram and its lead single \\\"Likey\\\" in 2017. With the release of their single \\\"Feel Special\\\" in 2019, Twice became the third female Korean act to chart into the Canadian Hot 100. After signing with Republic Records for American promotions as part of a partnership with JYP Entertainment, the group has charted into the US Billboard 200 with More & More and Eyes Wide Open in 2020 and Taste of Love and Formula of Love: O+T=<3 in 2021. Their first official English-language single, \\\"The Feels\\\", became their first song to enter the US Billboard Hot 100 and the UK Singles Chart, peaking at the 83rd and 80th positions of the charts, respectively. They have been dubbed the next \\\"Nation's Girl Group\\\", and their point choreography—including for \\\"Cheer Up\\\" (2016), \\\"TT\\\" (2016), \\\"Signal\\\" (2017), and \\\"What Is Love?\\\" (2018)—became dance crazes and viral memes imitated by many celebrities.\",\n\t\t\t\"artistType\": \"Group\",\n\t\t\t\"disambiguation\": \"South Korean girl group\",\n\t\t\t\"links\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\t\"url\": \"https://www.generasia.com/wiki/Twice\",\n\t\t\t\t\t\t\t\"name\": \"generasia\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\t\"url\": \"http://twice.jype.com/\",\n\t\t\t\t\t\t\t\"name\": \"jype\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\t\"url\": \"https://twitter.com/JYPETWICE\",\n\t\t\t\t\t\t\t\"name\": \"twitter\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\t\"url\": \"https://www.facebook.com/JYPETWICE\",\n\t\t\t\t\t\t\t\"name\": \"facebook\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\t\"url\": \"https://www.instagram.com/twicetagram/\",\n\t\t\t\t\t\t\t\"name\": \"instagram\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\t\"url\": \"https://www.wikidata.org/wiki/Q20645861\",\n\t\t\t\t\t\t\t\"name\": \"wikidata\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\t\"url\": \"http://fans.jype.com/twice\",\n\t\t\t\t\t\t\t\"name\": \"jype\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\t\"url\": \"https://commons.wikimedia.org/wiki/File:Twice_performing_at_SAC_2016_02_(cropped).jpg\",\n\t\t\t\t\t\t\t\"name\": \"wikimedia\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\t\"url\": \"https://www.discogs.com/artist/4786543\",\n\t\t\t\t\t\t\t\"name\": \"discogs\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\t\"url\": \"https://www.last.fm/music/%ED%8A%B8%EC%99%80%EC%9D%B4%EC%8A%A4\",\n\t\t\t\t\t\t\t\"name\": \"last\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\t\"url\": \"https://www.last.fm/music/TWICE\",\n\t\t\t\t\t\t\t\"name\": \"last\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\t\"url\": \"https://commons.wikimedia.org/wiki/File:160507_Twice_guerrilla_concert.jpg\",\n\t\t\t\t\t\t\t\"name\": \"wikimedia\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\t\"url\": \"https://open.spotify.com/artist/7n2Ycct7Beij7Dj7meI4X0\",\n\t\t\t\t\t\t\t\"name\": \"spotify\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\t\"url\": \"http://www.twicejapan.com/\",\n\t\t\t\t\t\t\t\"name\": \"twicejapan\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\t\"url\": \"https://www.instagram.com/jypetwice_japan/\",\n\t\t\t\t\t\t\t\"name\": \"instagram\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\t\"url\": \"https://twitter.com/JYPETWICE_JAPAN\",\n\t\t\t\t\t\t\t\"name\": \"twitter\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\t\"url\": \"https://itunes.apple.com/jp/artist/id1203816887\",\n\t\t\t\t\t\t\t\"name\": \"apple\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\t\"url\": \"https://commons.wikimedia.org/wiki/File:(TV10)_%EC%97%AC%EC%9E%90%EC%B9%9C%EA%B5%AC%C2%B7%ED%8A%B8%EC%99%80%EC%9D%B4%EC%8A%A4%C2%B7%EB%B8%94%EB%9E%99%ED%95%91%ED%81%AC,_%EB%A0%88%EB%93%9C%EC%B9%B4%ED%8E%AB_%EA%B0%81%EC%96%91%EA%B0%81%EC%83%89_%ED%8C%A8%EC%85%98_%EC%97%B4%EC%A0%84_(2017_%EA%B3%A8%EB%93%A0%EB%94%94%EC%8A%A4%ED%81%AC_%EB%A0%88%EB%93%9C%EC%B9%B4%ED%8E%AB)_2m19s.jpg\",\n\t\t\t\t\t\t\t\"name\": \"wikimedia\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\t\"url\": \"https://itunes.apple.com/us/artist/id1203816887\",\n\t\t\t\t\t\t\t\"name\": \"apple\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\t\"url\": \"http://viaf.org/viaf/178150468353504172529\",\n\t\t\t\t\t\t\t\"name\": \"viaf\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\t\"url\": \"https://www.deezer.com/artist/161553\",\n\t\t\t\t\t\t\t\"name\": \"deezer\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\t\"url\": \"https://imvdb.com/n/twice\",\n\t\t\t\t\t\t\t\"name\": \"imvdb\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\t\"url\": \"https://listen.tidal.com/artist/3577941\",\n\t\t\t\t\t\t\t\"name\": \"tidal\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\t\"url\": \"https://www.youtube.com/TWICE\",\n\t\t\t\t\t\t\t\"name\": \"youtube\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\t\"url\": \"https://www.youtube.com/twicejapan_official\",\n\t\t\t\t\t\t\t\"name\": \"youtube\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\t\"url\": \"https://music.apple.com/mx/artist/1203816887\",\n\t\t\t\t\t\t\t\"name\": \"apple\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\t\"url\": \"https://www.imdb.com/name/nm9652049/\",\n\t\t\t\t\t\t\t\"name\": \"imdb\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\t\"url\": \"https://www.tiktok.com/@twice_tiktok_officialjp\",\n\t\t\t\t\t\t\t\"name\": \"tiktok\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\t\"url\": \"https://music.youtube.com/channel/UCAq0pFGa2w9SjxOq0ZxKVIw\",\n\t\t\t\t\t\t\t\"name\": \"youtube\"\n\t\t\t\t\t}\n\t\t\t],\n\t\t\t\"images\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\t\"url\": \"http://assets.fanart.tv/fanart/music/8da127cc-c432-418f-b356-ef36210d82ac/musicbanner/twice-58fb678fb1219.jpg\",\n\t\t\t\t\t\t\t\"coverType\": \"banner\",\n\t\t\t\t\t\t\t\"extension\": \".jpg\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\t\"url\": \"http://assets.fanart.tv/fanart/music/8da127cc-c432-418f-b356-ef36210d82ac/artistbackground/twice-619421e3c57cc.jpg\",\n\t\t\t\t\t\t\t\"coverType\": \"fanart\",\n\t\t\t\t\t\t\t\"extension\": \".jpg\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\t\"url\": \"http://assets.fanart.tv/fanart/music/8da127cc-c432-418f-b356-ef36210d82ac/hdmusiclogo/twice-58d833d0a608a.png\",\n\t\t\t\t\t\t\t\"coverType\": \"logo\",\n\t\t\t\t\t\t\t\"extension\": \".png\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\t\"url\": \"http://assets.fanart.tv/fanart/music/8da127cc-c432-418f-b356-ef36210d82ac/artistthumb/twice-58fb69c0c2b00.jpg\",\n\t\t\t\t\t\t\t\"coverType\": \"poster\",\n\t\t\t\t\t\t\t\"extension\": \".jpg\"\n\t\t\t\t\t}\n\t\t\t],\n\t\t\t\"path\": \"/data/Library/Music/TWICE\",\n\t\t\t\"qualityProfileId\": 1,\n\t\t\t\"metadataProfileId\": 1,\n\t\t\t\"monitored\": true,\n\t\t\t\"monitorNewItems\": \"all\",\n\t\t\t\"genres\": [\n\t\t\t\t\t\"Dance\",\n\t\t\t\t\t\"Electronica\",\n\t\t\t\t\t\"K-Pop\",\n\t\t\t\t\t\"Pop\",\n\t\t\t\t\t\"R&B\"\n\t\t\t],\n\t\t\t\"cleanName\": \"twice\",\n\t\t\t\"sortName\": \"twice\",\n\t\t\t\"tags\": [],\n\t\t\t\"added\": \"2022-07-30T19:32:06Z\",\n\t\t\t\"ratings\": {\n\t\t\t\t\t\"votes\": 4,\n\t\t\t\t\t\"value\": 9.5\n\t\t\t},\n\t\t\t\"statistics\": {\n\t\t\t\t\t\"albumCount\": 0,\n\t\t\t\t\t\"trackFileCount\": 0,\n\t\t\t\t\t\"trackCount\": 0,\n\t\t\t\t\t\"totalTrackCount\": 0,\n\t\t\t\t\t\"sizeOnDisk\": 0,\n\t\t\t\t\t\"percentOfTracks\": 0\n\t\t\t},\n\t\t\t\"id\": 9\n\t},\n\t\"images\": [\n\t\t\t{\n\t\t\t\t\t\"url\": \"/MediaCover/Albums/32/cover.jpg?lastWrite=637927379160000000\",\n\t\t\t\t\t\"coverType\": \"cover\",\n\t\t\t\t\t\"extension\": \".jpg\",\n\t\t\t\t\t\"remoteUrl\": \"https://imagecache.lidarr.audio/v1/caa/22bd49a1-f858-427d-94ee-1788b54fb508/32961181216-1200.jpg\"\n\t\t\t}\n\t],\n\t\"links\": [],\n\t\"statistics\": {\n\t\t\t\"trackFileCount\": 9,\n\t\t\t\"trackCount\": 9,\n\t\t\t\"totalTrackCount\": 9,\n\t\t\t\"sizeOnDisk\": 74968875,\n\t\t\t\"percentOfTracks\": 100\n\t},\n\t\"grabbed\": false,\n\t\"id\": 32\n}"
  },
  {
    "path": "src/modules/common/examples/request.json",
    "content": "{\n\t\"id\": 634649,\n\t\"mediaType\": \"movie\",\n\t\"adult\": false,\n\t\"genreIds\": [\n\t\t28,\n\t\t12,\n\t\t878\n\t],\n\t\"originalLanguage\": \"en\",\n\t\"originalTitle\": \"Spider-Man: No Way Home\",\n\t\"overview\": \"Après les événements liés à l'affrontement avec Mysterio, l'identité secrète de Spider-Man a été révélée. Il est poursuivi par le gouvernement américain, qui l'accuse du meurtre de Mysterio, et traqué par les médias. Cet événement a également des conséquences terribles sur la vie de sa petite-amie M.J. et de son meilleur ami Ned. Désemparé, Peter Parker demande alors de l'aide au docteur Strange. Ce dernier lance un sort pour que tout le monde oublie que Peter est Spider-Man. Mais les choses ne se passent pas comme prévu, et cette action altère la stabilité de l'espace-temps. Cela ouvre le « multivers », un concept terrifiant dont ils ne savent quasiment rien...\",\n\t\"popularity\": 1643.549,\n\t\"releaseDate\": \"2021-12-15\",\n\t\"title\": \"Spider-Man: No Way Home\",\n\t\"video\": false,\n\t\"voteAverage\": 8,\n\t\"voteCount\": 14510,\n\t\"backdropPath\": \"/ocUp7DJBIc8VJgLEw1prcyK1dYv.jpg\",\n\t\"posterPath\": \"/3SyG7dq2q0ollxJ4pSsrqcfRmVj.jpg\",\n\t\"mediaInfo\": {\n\t\t\"downloadStatus\": [],\n\t\t\"downloadStatus4k\": [],\n\t\t\"id\": 91,\n\t\t\"mediaType\": \"movie\",\n\t\t\"tmdbId\": 634649,\n\t\t\"tvdbId\": null,\n\t\t\"imdbId\": null,\n\t\t\"status\": 5,\n\t\t\"status4k\": 1,\n\t\t\"createdAt\": \"2021-11-15T15:15:57.000Z\",\n\t\t\"updatedAt\": \"2022-08-01T08:40:19.000Z\",\n\t\t\"lastSeasonChange\": \"2021-11-15T15:15:57.000Z\",\n\t\t\"mediaAddedAt\": \"2021-12-23T12:04:39.000Z\",\n\t\t\"serviceId\": 0,\n\t\t\"serviceId4k\": null,\n\t\t\"externalServiceId\": 89,\n\t\t\"externalServiceId4k\": null,\n\t\t\"externalServiceSlug\": \"634649\",\n\t\t\"externalServiceSlug4k\": null,\n\t\t\"ratingKey\": \"823\",\n\t\t\"ratingKey4k\": null,\n\t\t\"seasons\": [],\n\t\t\"plexUrl\": \"https://app.plex.tv/desktop#!/server/719240db84d0795f30baa1c7283588fea536bb21/details?key=%2Flibrary%2Fmetadata%2F823\",\n\t\t\"serviceUrl\": \"http://radarr:7878/movie/634649\"\n\t}\n}"
  },
  {
    "path": "src/modules/common/examples/search-response.json",
    "content": "{\n\t\"page\": 1,\n\t\"totalPages\": 43,\n\t\"totalResults\": 847,\n\t\"results\": [\n\t\t{\n\t\t\t\"id\": 66732,\n\t\t\t\"firstAirDate\": \"2016-07-15\",\n\t\t\t\"genreIds\": [\n\t\t\t\t18,\n\t\t\t\t10765,\n\t\t\t\t9648\n\t\t\t],\n\t\t\t\"mediaType\": \"tv\",\n\t\t\t\"name\": \"Stranger Things\",\n\t\t\t\"originCountry\": [\n\t\t\t\t\"US\"\n\t\t\t],\n\t\t\t\"originalLanguage\": \"en\",\n\t\t\t\"originalName\": \"Stranger Things\",\n\t\t\t\"overview\": \"Quand un jeune garçon disparaît, une petite ville découvre une affaire mystérieuse, des expériences secrètes, des forces surnaturelles terrifiantes... et une fillette.\",\n\t\t\t\"popularity\": 1750.831,\n\t\t\t\"voteAverage\": 8.6,\n\t\t\t\"voteCount\": 12763,\n\t\t\t\"backdropPath\": \"/56v2KjBlU4XaOv9rVYEQypROD7P.jpg\",\n\t\t\t\"posterPath\": \"/r2w5UNf2mO2Mdl4q6HopuBms6XM.jpg\",\n\t\t\t\"mediaInfo\": {\n\t\t\t\t\"downloadStatus\": [],\n\t\t\t\t\"downloadStatus4k\": [],\n\t\t\t\t\"id\": 202,\n\t\t\t\t\"mediaType\": \"tv\",\n\t\t\t\t\"tmdbId\": 66732,\n\t\t\t\t\"tvdbId\": 305288,\n\t\t\t\t\"imdbId\": null,\n\t\t\t\t\"status\": 4,\n\t\t\t\t\"status4k\": 1,\n\t\t\t\t\"createdAt\": \"2022-08-01T08:55:00.000Z\",\n\t\t\t\t\"updatedAt\": \"2022-08-02T02:30:09.000Z\",\n\t\t\t\t\"lastSeasonChange\": \"2022-08-01T08:55:00.000Z\",\n\t\t\t\t\"mediaAddedAt\": \"2022-08-01T08:49:00.000Z\",\n\t\t\t\t\"serviceId\": 0,\n\t\t\t\t\"serviceId4k\": null,\n\t\t\t\t\"externalServiceId\": 42,\n\t\t\t\t\"externalServiceId4k\": null,\n\t\t\t\t\"externalServiceSlug\": \"stranger-things\",\n\t\t\t\t\"externalServiceSlug4k\": null,\n\t\t\t\t\"ratingKey\": \"2012\",\n\t\t\t\t\"ratingKey4k\": null,\n\t\t\t\t\"seasons\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"id\": 166,\n\t\t\t\t\t\t\"seasonNumber\": 1,\n\t\t\t\t\t\t\"status\": 3,\n\t\t\t\t\t\t\"status4k\": 1,\n\t\t\t\t\t\t\"createdAt\": \"2022-08-01T08:55:00.000Z\",\n\t\t\t\t\t\t\"updatedAt\": \"2022-08-02T02:30:09.000Z\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"id\": 167,\n\t\t\t\t\t\t\"seasonNumber\": 2,\n\t\t\t\t\t\t\"status\": 3,\n\t\t\t\t\t\t\"status4k\": 1,\n\t\t\t\t\t\t\"createdAt\": \"2022-08-01T08:55:00.000Z\",\n\t\t\t\t\t\t\"updatedAt\": \"2022-08-02T02:30:09.000Z\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"id\": 168,\n\t\t\t\t\t\t\"seasonNumber\": 3,\n\t\t\t\t\t\t\"status\": 3,\n\t\t\t\t\t\t\"status4k\": 1,\n\t\t\t\t\t\t\"createdAt\": \"2022-08-01T08:55:00.000Z\",\n\t\t\t\t\t\t\"updatedAt\": \"2022-08-02T02:30:09.000Z\"\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"id\": 169,\n\t\t\t\t\t\t\"seasonNumber\": 4,\n\t\t\t\t\t\t\"status\": 5,\n\t\t\t\t\t\t\"status4k\": 1,\n\t\t\t\t\t\t\"createdAt\": \"2022-08-01T08:55:00.000Z\",\n\t\t\t\t\t\t\"updatedAt\": \"2022-08-01T08:55:00.000Z\"\n\t\t\t\t\t}\n\t\t\t\t],\n\t\t\t\t\"plexUrl\": \"https://app.plex.tv/desktop#!/server/719240db84d0795f30baa1c7283588fea536bb21/details?key=%2Flibrary%2Fmetadata%2F2012\",\n\t\t\t\t\"serviceUrl\": \"http://sonarr:8989/series/stranger-things\"\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"id\": 74851,\n\t\t\t\"firstAirDate\": \"2017-10-27\",\n\t\t\t\"genreIds\": [\n\t\t\t\t10767\n\t\t\t],\n\t\t\t\"mediaType\": \"tv\",\n\t\t\t\"name\": \"Beyond Stranger Things\",\n\t\t\t\"originCountry\": [\n\t\t\t\t\"US\"\n\t\t\t],\n\t\t\t\"originalLanguage\": \"en\",\n\t\t\t\"originalName\": \"Beyond Stranger Things\",\n\t\t\t\"overview\": \"Les secrets de l'univers de \\\"Stranger Things 2\\\" sont révélés tandis que comédiens et artistes invités évoquent les derniers épisodes avec Jim Rash. Attention, spoilers !\",\n\t\t\t\"popularity\": 72.277,\n\t\t\t\"voteAverage\": 7.5,\n\t\t\t\"voteCount\": 74,\n\t\t\t\"backdropPath\": \"/qevaCqIekzc7Bp5f2kGAi92kO39.jpg\",\n\t\t\t\"posterPath\": \"/rHCFO8RJ3Hg6a8KjWAsvAsa38hp.jpg\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 182026,\n\t\t\t\"mediaType\": \"movie\",\n\t\t\t\"adult\": false,\n\t\t\t\"genreIds\": [\n\t\t\t\t18\n\t\t\t],\n\t\t\t\"originalLanguage\": \"en\",\n\t\t\t\"originalTitle\": \"Stranger Things\",\n\t\t\t\"overview\": \"\",\n\t\t\t\"popularity\": 76.465,\n\t\t\t\"releaseDate\": \"2013-04-05\",\n\t\t\t\"title\": \"Stranger Things\",\n\t\t\t\"video\": false,\n\t\t\t\"voteAverage\": 8.6,\n\t\t\t\"voteCount\": 51,\n\t\t\t\"backdropPath\": null,\n\t\t\t\"posterPath\": \"/4TKdguyacjYrC1Hnbi3PjSP8r3M.jpg\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 1865,\n\t\t\t\"mediaType\": \"movie\",\n\t\t\t\"adult\": false,\n\t\t\t\"genreIds\": [\n\t\t\t\t12,\n\t\t\t\t28,\n\t\t\t\t14\n\t\t\t],\n\t\t\t\"originalLanguage\": \"en\",\n\t\t\t\"originalTitle\": \"Pirates of the Caribbean: On Stranger Tides\",\n\t\t\t\"overview\": \"Dans cette histoire pleine d’action, où vérité, trahison, jeunesse éternelle et mort forment un cocktail explosif, le capitaine Jack Sparrow retrouve une femme qu’il a connu autrefois. Leurs liens sont‐ils faits d’amour ou, cette femme n’est‐elle qu’une aventurière sans scrupules qui cherche à l’utiliser pour découvrir la légendaire Fontaine de Jouvence ? Lorsqu’elle l’oblige à embarquer à bord du Queen Anne’s Revenge, le bateau du terrible pirate Barbe‐Noire, Jack ne sait plus ce qu’il doit craindre le plus : Le redoutable maître du bateau ou cette femme surgit de son passé…\",\n\t\t\t\"popularity\": 251.27,\n\t\t\t\"releaseDate\": \"2011-05-14\",\n\t\t\t\"title\": \"Pirates des Caraïbes : La Fontaine de jouvence\",\n\t\t\t\"video\": false,\n\t\t\t\"voteAverage\": 6.5,\n\t\t\t\"voteCount\": 12180,\n\t\t\t\"backdropPath\": \"/uzIGtyS6bbnJzGsPL93WCF1FWm8.jpg\",\n\t\t\t\"posterPath\": \"/5JjjjGg24IGRXIQtaZkPU59acjV.jpg\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 96608,\n\t\t\t\"firstAirDate\": \"2020-01-30\",\n\t\t\t\"genreIds\": [\n\t\t\t\t9648,\n\t\t\t\t80\n\t\t\t],\n\t\t\t\"mediaType\": \"tv\",\n\t\t\t\"name\": \"Intimidation\",\n\t\t\t\"originCountry\": [\n\t\t\t\t\"GB\"\n\t\t\t],\n\t\t\t\"originalLanguage\": \"en\",\n\t\t\t\"originalName\": \"The Stranger\",\n\t\t\t\"overview\": \"Adam Price mène une vie idyllique : il a un bon travail, deux fils merveilleux et son mariage semble sans faille. Mais son bonheur va soudainement voler en éclats lorsque « The Stranger » dévoile un secret choquant au sujet de sa femme.\",\n\t\t\t\"popularity\": 15.11,\n\t\t\t\"voteAverage\": 7.4,\n\t\t\t\"voteCount\": 283,\n\t\t\t\"backdropPath\": \"/97pA0UjBqqgcZFbREQL3U1BQDgX.jpg\",\n\t\t\t\"posterPath\": \"/y9mX3A3O4SxffDIAlK8Li8AL8BD.jpg\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 7183,\n\t\t\t\"mediaType\": \"movie\",\n\t\t\t\"adult\": false,\n\t\t\t\"genreIds\": [\n\t\t\t\t53\n\t\t\t],\n\t\t\t\"originalLanguage\": \"en\",\n\t\t\t\"originalTitle\": \"Perfect Stranger\",\n\t\t\t\"overview\": \"Rowena est une journaliste d'investigation. Lorsqu'elle découvre que Harrison Hill, le très puissant publicitaire, est peut-être lié au meurtre de son amie, elle décide de mener son enquête. Pour se faire et l'approcher, elle va endosser deux identités, celle de Katherine, une intérimaire employée de sa société et Veronica, une jeune femme avec laquelle Hill flirte sur internet.\",\n\t\t\t\"popularity\": 20.863,\n\t\t\t\"releaseDate\": \"2007-04-11\",\n\t\t\t\"title\": \"Dangereuse séduction\",\n\t\t\t\"video\": false,\n\t\t\t\"voteAverage\": 5.8,\n\t\t\t\"voteCount\": 756,\n\t\t\t\"backdropPath\": \"/sG7flxRI3ujV5t2scYpbmREVQbv.jpg\",\n\t\t\t\"posterPath\": \"/jpQoXiLjTN8uqU9Ym9TMaz2D9aS.jpg\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 99282,\n\t\t\t\"firstAirDate\": \"2020-04-13\",\n\t\t\t\"genreIds\": [\n\t\t\t\t18,\n\t\t\t\t9648,\n\t\t\t\t80\n\t\t\t],\n\t\t\t\"mediaType\": \"tv\",\n\t\t\t\"name\": \"The Stranger\",\n\t\t\t\"originCountry\": [\n\t\t\t\t\"US\"\n\t\t\t],\n\t\t\t\"originalLanguage\": \"en\",\n\t\t\t\"originalName\": \"The Stranger\",\n\t\t\t\"overview\": \"Un jeune conducteur sans scrupule prend un mystérieux passager d'Hollywood Hills. Sur 12 heures, les deux hommes naviguent dans les bas-fonds sordides de Los Angeles...\",\n\t\t\t\"popularity\": 7.158,\n\t\t\t\"voteAverage\": 7.5,\n\t\t\t\"voteCount\": 25,\n\t\t\t\"backdropPath\": \"/g8n6jB5Mkn6FUGQ5MbqEMIHrZba.jpg\",\n\t\t\t\"posterPath\": \"/4KrCPwB6yNBR8Chg5quigrrUFCD.jpg\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 10053,\n\t\t\t\"mediaType\": \"movie\",\n\t\t\t\"adult\": false,\n\t\t\t\"genreIds\": [\n\t\t\t\t27,\n\t\t\t\t9648\n\t\t\t],\n\t\t\t\"originalLanguage\": \"en\",\n\t\t\t\"originalTitle\": \"When a Stranger Calls\",\n\t\t\t\"overview\": \"Alors qu'elle garde des enfants, une étudiante est terrorisée par un homme qui la harcèle au téléphone en lui demandant si elle a bien vérifié que tout était normal avec les petits dont elle a la charge. Les policiers qu'elle a appelés finissent par localiser les appels et l'informent que ceux-ci proviennent de la maison où elle se trouve...\",\n\t\t\t\"popularity\": 18.475,\n\t\t\t\"releaseDate\": \"2006-02-03\",\n\t\t\t\"title\": \"Terreur sur la Ligne\",\n\t\t\t\"video\": false,\n\t\t\t\"voteAverage\": 5.7,\n\t\t\t\"voteCount\": 873,\n\t\t\t\"backdropPath\": \"/lF3ojoSmCZgrh9nyy2lOxoWL7KD.jpg\",\n\t\t\t\"posterPath\": \"/xva4IuEfaT6c8tZLpNK2LKCtNGf.jpg\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 291151,\n\t\t\t\"mediaType\": \"movie\",\n\t\t\t\"adult\": false,\n\t\t\t\"genreIds\": [\n\t\t\t\t53,\n\t\t\t\t27,\n\t\t\t\t9648\n\t\t\t],\n\t\t\t\"originalLanguage\": \"en\",\n\t\t\t\"originalTitle\": \"The Stranger\",\n\t\t\t\"overview\": \"Un homme mystérieux à la recherche de sa femme arrive dans une petite ville du Canada,  sa présence va quelque peu bouleverser l'apparente tranquillité qui y règne.\",\n\t\t\t\"popularity\": 7.932,\n\t\t\t\"releaseDate\": \"2014-06-12\",\n\t\t\t\"title\": \"The Stranger\",\n\t\t\t\"video\": false,\n\t\t\t\"voteAverage\": 4.7,\n\t\t\t\"voteCount\": 77,\n\t\t\t\"backdropPath\": \"/plTx6iHNbLxNXKL4swZxl4RVT2w.jpg\",\n\t\t\t\"posterPath\": \"/8YjSy1vG4yuuatgdAU1NbitA52F.jpg\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 1262,\n\t\t\t\"mediaType\": \"movie\",\n\t\t\t\"adult\": false,\n\t\t\t\"genreIds\": [\n\t\t\t\t35,\n\t\t\t\t18,\n\t\t\t\t14,\n\t\t\t\t10749\n\t\t\t],\n\t\t\t\"originalLanguage\": \"en\",\n\t\t\t\"originalTitle\": \"Stranger Than Fiction\",\n\t\t\t\"overview\": \"Un beau matin, Harold Crick, un obscur fonctionnaire du fisc, entend soudain une voix de femme qui se met à commenter tout ce qu'il vit, y compris ses pensées les plus intimes. Pour Harold, c'est un cauchemar qui dérègle sa vie parfaitement agencée, mais cela devient encore plus grave lorsque la voix annonce qu'il va bientôt mourir...Harold découvre que cette voix est celle d'une romancière, Karen Eiffel, qui s'efforce désespérément d'écrire la fin de ce qui pourrait être son meilleur livre. Il ne lui reste plus qu'à trouver comment tuer son personnage principal : Harold ! Elle ignore que celui-ci existe, qu'il entend ses mots et connaît le sort qu'elle lui réserve...Pour s'en sortir vivant, Harold doit changer son destin. Sa seule chance est de devenir un personnage de comédie, puisque ceux-ci ne sont jamais tués...\",\n\t\t\t\"popularity\": 12.475,\n\t\t\t\"releaseDate\": \"2006-09-09\",\n\t\t\t\"title\": \"L'Incroyable Destin de Harold Crick\",\n\t\t\t\"video\": false,\n\t\t\t\"voteAverage\": 7.3,\n\t\t\t\"voteCount\": 1875,\n\t\t\t\"backdropPath\": \"/d9eONXYtCmQnPWw61w9pNMGlSzK.jpg\",\n\t\t\t\"posterPath\": \"/hZpCDBXmKqDBBonBKGAcZ95Qmvi.jpg\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 87692,\n\t\t\t\"firstAirDate\": \"2019-04-06\",\n\t\t\t\"genreIds\": [\n\t\t\t\t16,\n\t\t\t\t35,\n\t\t\t\t10765\n\t\t\t],\n\t\t\t\"mediaType\": \"tv\",\n\t\t\t\"name\": \"Chou Kadou Girl\",\n\t\t\t\"originCountry\": [\n\t\t\t\t\"JP\"\n\t\t\t],\n\t\t\t\"originalLanguage\": \"ja\",\n\t\t\t\"originalName\": \"超可動ガール⅙ AMAZING STRANGER\",\n\t\t\t\"overview\": \"Haruto est un otaku qui ne s'intéresse pas aux (vraies) filles en 3D ! Un jour, sa dernière acquisition, une figurine de son héroïne préférée Nona, se met à bouger toute seule. Ainsi commence la drôle de vie conjugale entre un otaku et un robot...\",\n\t\t\t\"popularity\": 11.422,\n\t\t\t\"voteAverage\": 6.4,\n\t\t\t\"voteCount\": 5,\n\t\t\t\"backdropPath\": \"/yl4Ltag61cTv0XtwbwMpvzxt7ov.jpg\",\n\t\t\t\"posterPath\": \"/pPxakEs1TP6JhclPceGxHBoE8Ey.jpg\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 455108,\n\t\t\t\"mediaType\": \"movie\",\n\t\t\t\"adult\": false,\n\t\t\t\"genreIds\": [\n\t\t\t\t9648,\n\t\t\t\t18,\n\t\t\t\t27,\n\t\t\t\t36\n\t\t\t],\n\t\t\t\"originalLanguage\": \"en\",\n\t\t\t\"originalTitle\": \"The Little Stranger\",\n\t\t\t\"overview\": \"Fils d’une modeste domestique, le docteur Faraday s’est construit une existence tranquille et respectable en devenant médecin de campagne. En 1947, lors d’un été particulièrement long et chaud, il est appelé au chevet d’une patiente à Hundreds Hall, où sa mère fut employée autrefois. Le domaine, qui appartient depuis plus de deux siècles à la famille Ayres, est aujourd’hui en piteux état, et ses habitants – la mère, son fils et sa fille – sont hantés par quelque chose de bien plus effrayant encore que le déclin de leurs finances. Faraday ne s’imagine pas à quel point le destin de cette famille et le sien sont liés, ni ce que cela a de terrifiant…\",\n\t\t\t\"popularity\": 12.538,\n\t\t\t\"releaseDate\": \"2018-08-30\",\n\t\t\t\"title\": \"The Little Stranger\",\n\t\t\t\"video\": false,\n\t\t\t\"voteAverage\": 5.7,\n\t\t\t\"voteCount\": 216,\n\t\t\t\"backdropPath\": \"/eyrUZ6jvg1Qy3jUz5YH8U4UkFLP.jpg\",\n\t\t\t\"posterPath\": \"/qm1KJU9coK2voDIFD6AUvSgVG56.jpg\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 38166,\n\t\t\t\"mediaType\": \"movie\",\n\t\t\t\"adult\": false,\n\t\t\t\"genreIds\": [\n\t\t\t\t28,\n\t\t\t\t18,\n\t\t\t\t53,\n\t\t\t\t9648\n\t\t\t],\n\t\t\t\"originalLanguage\": \"en\",\n\t\t\t\"originalTitle\": \"The Stranger\",\n\t\t\t\"overview\": \"Un agent du F.B.I poursuit le témoin matériel d'une enquête classée secret défense.\",\n\t\t\t\"popularity\": 6.555,\n\t\t\t\"releaseDate\": \"2010-06-01\",\n\t\t\t\"title\": \"The Stranger\",\n\t\t\t\"video\": false,\n\t\t\t\"voteAverage\": 4.9,\n\t\t\t\"voteCount\": 57,\n\t\t\t\"backdropPath\": \"/kjFC8S6y9wKiRXRpOPwQQu6e9cJ.jpg\",\n\t\t\t\"posterPath\": \"/fXg4MXYruDKrssFmfzKlf2TINJb.jpg\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 20246,\n\t\t\t\"mediaType\": \"movie\",\n\t\t\t\"adult\": false,\n\t\t\t\"genreIds\": [\n\t\t\t\t80,\n\t\t\t\t18,\n\t\t\t\t9648,\n\t\t\t\t53\n\t\t\t],\n\t\t\t\"originalLanguage\": \"en\",\n\t\t\t\"originalTitle\": \"The Stranger\",\n\t\t\t\"overview\": \"L'inspecteur Wilson, de la commission contre les crimes de guerre, décide de relâcher un ancien chef de camp d'extermination nazi, dans l'espoir qu'il le conduira jusqu'à son supérieur, Franz Kindler. L'Allemand, qui circule sous un nom d'emprunt, se rend dans la petite ville de Harper. L'inspecteur le suit. Se sachant surveillé, l'ex-détenu attire le policier dans le gymnase de l'école. Là, il l'assomme et se précipite dans la maison voisine, qui n'est autre que celle de Franz Kindler, aujourd'hui professeur dans ce collège, pour le prévenir de l'arrivée de la police…\",\n\t\t\t\"popularity\": 7.449,\n\t\t\t\"releaseDate\": \"1946-07-02\",\n\t\t\t\"title\": \"Le Criminel\",\n\t\t\t\"video\": false,\n\t\t\t\"voteAverage\": 7.3,\n\t\t\t\"voteCount\": 449,\n\t\t\t\"backdropPath\": \"/eewSm2QKPMueCM3ix5r3aE5eIur.jpg\",\n\t\t\t\"posterPath\": \"/ee3F8CvNMSJZvYiwW2DKSvU9rQj.jpg\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 469,\n\t\t\t\"mediaType\": \"movie\",\n\t\t\t\"adult\": false,\n\t\t\t\"genreIds\": [\n\t\t\t\t35,\n\t\t\t\t18\n\t\t\t],\n\t\t\t\"originalLanguage\": \"en\",\n\t\t\t\"originalTitle\": \"Stranger Than Paradise\",\n\t\t\t\"overview\": \"Eva, 16 ans, quitte la Hongrie et retrouve son cousin Willie, installé depuis 10 ans aux États-Unis. Inadaptés à cette terre de désillusions, ils partent de Miami découvrir le paradis de la Floride, royaume du jeu et dernier espoir d'un exil douloureux.\",\n\t\t\t\"popularity\": 9.713,\n\t\t\t\"releaseDate\": \"1984-10-01\",\n\t\t\t\"title\": \"Stranger Than Paradise\",\n\t\t\t\"video\": false,\n\t\t\t\"voteAverage\": 7.2,\n\t\t\t\"voteCount\": 394,\n\t\t\t\"backdropPath\": \"/tAEV7htL9Yi0hMHtxlv2VAm9Rbe.jpg\",\n\t\t\t\"posterPath\": \"/fxlMexOi2D64ugS07Sv2hJZYM3R.jpg\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 45964,\n\t\t\t\"mediaType\": \"movie\",\n\t\t\t\"adult\": false,\n\t\t\t\"genreIds\": [\n\t\t\t\t27,\n\t\t\t\t53,\n\t\t\t\t18,\n\t\t\t\t80,\n\t\t\t\t9648\n\t\t\t],\n\t\t\t\"originalLanguage\": \"en\",\n\t\t\t\"originalTitle\": \"When a Stranger Calls\",\n\t\t\t\"overview\": \"Au cours d’une nuit où elle garde les enfants d’un couple marié, une baby-sitter se fait harceler au téléphone par un inconnu qui lui pose systématiquement la même question : « êtes-vous allée voir les enfants ? ». De plus en plus inquiète à mesure que les appels se succèdent, la jeune femme décide de contacter la police.\",\n\t\t\t\"popularity\": 9.731,\n\t\t\t\"releaseDate\": \"1979-10-26\",\n\t\t\t\"title\": \"Terreur sur la ligne\",\n\t\t\t\"video\": false,\n\t\t\t\"voteAverage\": 6.2,\n\t\t\t\"voteCount\": 178,\n\t\t\t\"backdropPath\": \"/3dK12SaczU7Tf8btq7K2F5HQg6F.jpg\",\n\t\t\t\"posterPath\": \"/x4d8XUXbWLjiro51iQ2qiFhT6t4.jpg\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 105024,\n\t\t\t\"firstAirDate\": \"2020-06-24\",\n\t\t\t\"genreIds\": [\n\t\t\t\t35,\n\t\t\t\t18\n\t\t\t],\n\t\t\t\"mediaType\": \"tv\",\n\t\t\t\"name\": \"Hello, Stranger\",\n\t\t\t\"originCountry\": [\n\t\t\t\t\"PH\"\n\t\t\t],\n\t\t\t\"originalLanguage\": \"tl\",\n\t\t\t\"originalName\": \"Hello, Stranger\",\n\t\t\t\"overview\": \"\",\n\t\t\t\"popularity\": 3.554,\n\t\t\t\"voteAverage\": 7.3,\n\t\t\t\"voteCount\": 3,\n\t\t\t\"backdropPath\": \"/8uXYX9F92gc0RlVlTEYVrze83fo.jpg\",\n\t\t\t\"posterPath\": \"/uu8yWT64FP0W39whxIcs2aMv1Wb.jpg\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 618352,\n\t\t\t\"mediaType\": \"movie\",\n\t\t\t\"adult\": false,\n\t\t\t\"genreIds\": [\n\t\t\t\t16,\n\t\t\t\t28,\n\t\t\t\t27,\n\t\t\t\t14\n\t\t\t],\n\t\t\t\"originalLanguage\": \"en\",\n\t\t\t\"originalTitle\": \"DC Showcase: The Phantom Stranger\",\n\t\t\t\"overview\": \"L'histoire se situe dans les années 1970, quand une jeune femme du nom de Jess et ses amis se rendent à une soirée dans un vieux manoir qui appartient à un certain Seth, les choses tournent au vinaigre, le Phantom Stranger arrivera pour leur porter secours.\",\n\t\t\t\"popularity\": 8.072,\n\t\t\t\"releaseDate\": \"2020-02-25\",\n\t\t\t\"title\": \"DC Showcase: The Phantom Stranger\",\n\t\t\t\"video\": false,\n\t\t\t\"voteAverage\": 7.5,\n\t\t\t\"voteCount\": 49,\n\t\t\t\"backdropPath\": \"/vQkGZ0u9E8PgBbjg8vo61KHxQDc.jpg\",\n\t\t\t\"posterPath\": \"/tqcL1YEiGUKsW1Ofka59m4MIKr1.jpg\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 413852,\n\t\t\t\"mediaType\": \"movie\",\n\t\t\t\"adult\": false,\n\t\t\t\"genreIds\": [\n\t\t\t\t18,\n\t\t\t\t9648,\n\t\t\t\t53,\n\t\t\t\t878\n\t\t\t],\n\t\t\t\"originalLanguage\": \"en\",\n\t\t\t\"originalTitle\": \"Welcome the Stranger\",\n\t\t\t\"overview\": \"Alice arrive inopinément chez son frère, Ethan, en espérant se réconcilier avec lui. D'étranges visions et le retour de la petite amie d'Ethan perturbent son projet...\",\n\t\t\t\"popularity\": 5.994,\n\t\t\t\"releaseDate\": \"2018-03-20\",\n\t\t\t\"title\": \"Welcome the Stranger\",\n\t\t\t\"video\": false,\n\t\t\t\"voteAverage\": 5,\n\t\t\t\"voteCount\": 33,\n\t\t\t\"backdropPath\": \"/51aiE8fEXchmbLIyX7Smm3zJavV.jpg\",\n\t\t\t\"posterPath\": \"/fZch4FhfexA18gUUQjHXKnLmkjh.jpg\"\n\t\t},\n\t\t{\n\t\t\t\"id\": 41670,\n\t\t\t\"mediaType\": \"movie\",\n\t\t\t\"adult\": false,\n\t\t\t\"genreIds\": [\n\t\t\t\t18,\n\t\t\t\t10749,\n\t\t\t\t80\n\t\t\t],\n\t\t\t\"originalLanguage\": \"en\",\n\t\t\t\"originalTitle\": \"A Stranger Among Us\",\n\t\t\t\"overview\": \"Chargée d'enquêter sur un meurtre au sein de la communauté hassidique de la ville de New-York, la détective Emily Eden parvient à se faire accepter au sein de cette secte si hermétique.\",\n\t\t\t\"popularity\": 7.016,\n\t\t\t\"releaseDate\": \"1992-07-17\",\n\t\t\t\"title\": \"Une étrangère parmi nous\",\n\t\t\t\"video\": false,\n\t\t\t\"voteAverage\": 5.7,\n\t\t\t\"voteCount\": 71,\n\t\t\t\"backdropPath\": \"/hL0hkMFGWgOvC0P4le6gzRzwa62.jpg\",\n\t\t\t\"posterPath\": \"/rvk00cSV6cGWQQIppEPYLnDebQ1.jpg\"\n\t\t}\n\t]\n}"
  },
  {
    "path": "src/modules/common/examples/tvshow.json",
    "content": "{\n\t\"seriesId\": 37,\n\t\"episodeFileId\": 7387,\n\t\"seasonNumber\": 1,\n\t\"episodeNumber\": 4,\n\t\"title\": \"Part IV\",\n\t\"airDate\": \"2022-06-08\",\n\t\"airDateUtc\": \"2022-06-08T07:00:00Z\",\n\t\"overview\": \"Obi-Wan Kenobi plots a daring mission into enemy territory.\",\n\t\"episodeFile\": {\n\t\t\"seriesId\": 37,\n\t\t\"seasonNumber\": 1,\n\t\t\"relativePath\": \"Season 1/Obi-Wan.Kenobi.S01E04.1080p.WEB.h264-KOGi[rartv].mkv\",\n\t\t\"path\": \"/tv/Obi-Wan Kenobi/Season 1/Obi-Wan.Kenobi.S01E04.1080p.WEB.h264-KOGi[rartv].mkv\",\n\t\t\"size\": 1893191174,\n\t\t\"dateAdded\": \"2022-06-08T07:32:27.158296Z\",\n\t\t\"sceneName\": \"Obi-Wan.Kenobi.S01E04.1080p.WEB.h264-KOGi[rartv]\",\n\t\t\"quality\": {\n\t\t\t\"quality\": {\n\t\t\t\t\"id\": 3,\n\t\t\t\t\"name\": \"WEBDL-1080p\",\n\t\t\t\t\"source\": \"web\",\n\t\t\t\t\"resolution\": 1080\n\t\t\t},\n\t\t\t\"revision\": {\n\t\t\t\t\"version\": 1,\n\t\t\t\t\"real\": 0,\n\t\t\t\t\"isRepack\": false\n\t\t\t}\n\t\t},\n\t\t\"language\": {\n\t\t\t\"id\": 1,\n\t\t\t\"name\": \"English\"\n\t\t},\n\t\t\"mediaInfo\": {\n\t\t\t\"audioChannels\": 5.1,\n\t\t\t\"audioCodec\": \"EAC3 Atmos\",\n\t\t\t\"videoCodec\": \"h264\"\n\t\t},\n\t\t\"originalFilePath\": \"Obi-Wan.Kenobi.S01E04.1080p.WEB.h264-KOGi[rarbg]/Obi-Wan.Kenobi.S01E04.1080p.WEB.h264-KOGi.mkv\",\n\t\t\"qualityCutoffNotMet\": false,\n\t\t\"id\": 7387\n\t},\n\t\"hasFile\": true,\n\t\"monitored\": true,\n\t\"unverifiedSceneNumbering\": false,\n\t\"series\": {\n\t\t\"title\": \"Obi-Wan Kenobi\",\n\t\t\"sortTitle\": \"obiwan kenobi\",\n\t\t\"seasonCount\": 1,\n\t\t\"status\": \"ended\",\n\t\t\"overview\": \"During the reign of the Empire, Obi-Wan Kenobi embarks on a crucial mission.\",\n\t\t\"network\": \"Disney+\",\n\t\t\"airTime\": \"03:00\",\n\t\t\"images\": [\n\t\t\t{\n\t\t\t\t\"coverType\": \"banner\",\n\t\t\t\t\"url\": \"https://artworks.thetvdb.com/banners/v4/series/393199/banners/6290d38b8c283.jpg\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"coverType\": \"poster\",\n\t\t\t\t\"url\": \"https://artworks.thetvdb.com/banners/v4/series/393199/posters/629668351aca3.jpg\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"coverType\": \"fanart\",\n\t\t\t\t\"url\": \"https://artworks.thetvdb.com/banners/v4/series/393199/backgrounds/62912a0fe623d.jpg\"\n\t\t\t}\n\t\t],\n\t\t\"seasons\": [\n\t\t\t{\n\t\t\t\t\"seasonNumber\": 1,\n\t\t\t\t\"monitored\": true\n\t\t\t}\n\t\t],\n\t\t\"year\": 2022,\n\t\t\"path\": \"/tv/Obi-Wan Kenobi\",\n\t\t\"profileId\": 1,\n\t\t\"languageProfileId\": 1,\n\t\t\"seasonFolder\": true,\n\t\t\"monitored\": true,\n\t\t\"useSceneNumbering\": false,\n\t\t\"runtime\": 39,\n\t\t\"tvdbId\": 393199,\n\t\t\"tvRageId\": 0,\n\t\t\"tvMazeId\": 52260,\n\t\t\"firstAired\": \"2022-05-27T00:00:00Z\",\n\t\t\"lastInfoSync\": \"2022-07-22T03:36:34.392414Z\",\n\t\t\"seriesType\": \"standard\",\n\t\t\"cleanTitle\": \"obiwankenobi\",\n\t\t\"imdbId\": \"tt8466564\",\n\t\t\"titleSlug\": \"obi-wan-kenobi\",\n\t\t\"certification\": \"TV-14\",\n\t\t\"genres\": [\n\t\t\t\"Action\",\n\t\t\t\"Adventure\",\n\t\t\t\"Fantasy\",\n\t\t\t\"Mini-Series\",\n\t\t\t\"Science Fiction\"\n\t\t],\n\t\t\"tags\": [],\n\t\t\"added\": \"2022-05-03T20:22:10.47688Z\",\n\t\t\"ratings\": {\n\t\t\t\"votes\": 0,\n\t\t\t\"value\": 0\n\t\t},\n\t\t\"qualityProfileId\": 1,\n\t\t\"id\": 37\n\t},\n\t\"id\": 1407\n}"
  },
  {
    "path": "src/modules/common/index.ts",
    "content": "export * from './MediaDisplay';\n"
  },
  {
    "path": "src/modules/overseerr/Movie.d.ts",
    "content": "export interface MovieResult {\n  id: number;\n  adult: boolean;\n  budget: number;\n  genres: Genre[];\n  relatedVideos: RelatedVideo[];\n  originalLanguage: string;\n  originalTitle: string;\n  popularity: number;\n  productionCompanies: ProductionCompany[];\n  productionCountries: ProductionCountry[];\n  releaseDate: Date;\n  releases: Releases;\n  revenue: number;\n  spokenLanguages: SpokenLanguage[];\n  status: string;\n  title: string;\n  video: boolean;\n  voteAverage: number;\n  voteCount: number;\n  backdropPath: string;\n  homepage: string;\n  imdbId: string;\n  overview: string;\n  posterPath: string;\n  runtime: number;\n  tagline: string;\n  credits: Credits;\n  collection: Collection;\n  externalIds: ExternalIDS;\n  mediaInfo: Media;\n  watchProviders: WatchProvider[];\n}\n\nexport interface Collection {\n  id: number;\n  name: string;\n  posterPath: string;\n  backdropPath: string;\n}\n\nexport interface Credits {\n  cast: Cast[];\n  crew: Crew[];\n}\n\nexport interface Cast {\n  castId: number;\n  character: string;\n  creditId: string;\n  id: number;\n  name: string;\n  order: number;\n  gender: number;\n  profilePath: null | string;\n}\n\nexport interface Crew {\n  creditId: string;\n  department: Department;\n  id: number;\n  job: string;\n  name: string;\n  gender: number;\n  profilePath: null | string;\n}\n\nexport enum Department {\n  Art = 'Art',\n  Camera = 'Camera',\n  CostumeMakeUp = 'Costume & Make-Up',\n  Crew = 'Crew',\n  Directing = 'Directing',\n  Editing = 'Editing',\n  Production = 'Production',\n  Sound = 'Sound',\n  VisualEffects = 'Visual Effects',\n  Writing = 'Writing',\n}\n\nexport interface ExternalIDS {\n  facebookId: string;\n  imdbId: string;\n  instagramId: string;\n  twitterId: string;\n}\n\nexport interface Genre {\n  id: number;\n  name: string;\n}\n\nexport interface Request {\n  id: number;\n  status: number;\n  createdAt: Date;\n  updatedAt: Date;\n  type: string;\n  is4k: boolean;\n  serverId: number;\n  profileId: number;\n  rootFolder: string;\n  languageProfileId: null;\n  tags: any[];\n  media: Media;\n  requestedBy: EdBy;\n  modifiedBy: EdBy;\n  seasons: any[];\n  seasonCount: number;\n}\n\nexport interface Media {\n  downloadStatus: any[];\n  downloadStatus4k: any[];\n  id: number;\n  mediaType: string;\n  tmdbId: number;\n  tvdbId: null;\n  imdbId: null;\n  status: number;\n  status4k: number;\n  createdAt: Date;\n  updatedAt: Date;\n  lastSeasonChange: Date;\n  mediaAddedAt: Date;\n  serviceId: number;\n  serviceId4k: null;\n  externalServiceId: number;\n  externalServiceId4k: null;\n  externalServiceSlug: string;\n  externalServiceSlug4k: null;\n  ratingKey: string;\n  ratingKey4k: null;\n  requests?: Request[];\n  issues?: any[];\n  seasons: any[];\n  plexUrl: string;\n  serviceUrl: string;\n}\n\nexport interface EdBy {\n  permissions: number;\n  id: number;\n  email: string;\n  plexUsername: string;\n  username: string;\n  recoveryLinkExpirationDate: null;\n  userType: number;\n  avatar: string;\n  movieQuotaLimit: null;\n  movieQuotaDays: null;\n  tvQuotaLimit: null;\n  tvQuotaDays: null;\n  createdAt: Date;\n  updatedAt: Date;\n  settings: Settings;\n  requestCount: number;\n  displayName: string;\n}\n\nexport interface Settings {\n  id: number;\n  locale: string;\n  region: string;\n  originalLanguage: null;\n  pgpKey: null;\n  discordId: string;\n  pushbulletAccessToken: null;\n  pushoverApplicationToken: null;\n  pushoverUserKey: null;\n  telegramChatId: null;\n  telegramSendSilently: null;\n  notificationTypes: NotificationTypes;\n}\n\nexport interface NotificationTypes {\n  discord: number;\n  email: number;\n  webpush: number;\n}\n\nexport interface ProductionCompany {\n  id: number;\n  name: string;\n  originCountry?: string;\n  logoPath: string;\n  displayPriority?: number;\n}\n\nexport interface ProductionCountry {\n  iso_3166_1: string;\n  name: string;\n}\n\nexport interface RelatedVideo {\n  site: string;\n  key: string;\n  name: string;\n  size: number;\n  type: string;\n  url: string;\n}\n\nexport interface Releases {\n  results: Result[];\n}\n\nexport interface Result {\n  iso_3166_1: string;\n  release_dates: ReleaseDate[];\n}\n\nexport interface ReleaseDate {\n  certification: string;\n  iso_639_1: ISO639_1 | null;\n  note: Note;\n  release_date: Date;\n  type: number;\n}\n\nexport enum ISO639_1 {\n  CS = 'cs',\n  Empty = '',\n}\n\nexport enum Note {\n  Empty = '',\n  HBOMax = 'HBO Max',\n  LosAngelesCalifornia = 'Los Angeles, California',\n  Starz = 'STARZ',\n  The4KUHDBluRayDVD = '4K UHD, Blu-ray & DVD',\n  TheMoreFunStuffVersion = 'The More Fun Stuff Version',\n  Tvod = 'TVOD',\n  VOD = 'VOD',\n}\n\nexport interface SpokenLanguage {\n  english_name: string;\n  iso_639_1: string;\n  name: string;\n}\n\nexport interface WatchProvider {\n  iso_3166_1: string;\n  link: string;\n  buy: ProductionCompany[];\n  flatrate: ProductionCompany[];\n}\n"
  },
  {
    "path": "src/modules/overseerr/RequestModal.tsx",
    "content": "import { Alert, Button, Checkbox, Group, Modal, Stack, Table, createStyles } from '@mantine/core';\nimport { showNotification, updateNotification } from '@mantine/notifications';\nimport { IconAlertCircle, IconCheck, IconDownload } from '@tabler/icons-react';\nimport Consola from 'consola';\nimport { useTranslation } from 'next-i18next';\nimport { useState } from 'react';\nimport { useConfigContext } from '~/config/provider';\nimport { useColorTheme } from '~/tools/color';\nimport { api } from '~/utils/api';\n\nimport { MovieResult } from './Movie.d';\nimport { Result } from './SearchResult';\nimport { TvShowResult, TvShowResultSeason } from './TvShow.d';\n\ninterface RequestModalProps {\n  base: Result;\n  opened: boolean;\n  setOpened: (opened: boolean) => void;\n}\n\nconst useStyles = createStyles((theme) => ({\n  rowSelected: {\n    backgroundColor:\n      theme.colorScheme === 'dark'\n        ? theme.fn.rgba(theme.colors[theme.primaryColor][7], 0.2)\n        : theme.colors[theme.primaryColor][0],\n  },\n}));\n\nexport function RequestModal({ base, opened, setOpened }: RequestModalProps) {\n  const { name: configName } = useConfigContext();\n  const { data: result } = api.overseerr.byId.useQuery(\n    {\n      id: base.id,\n      type: base.mediaType,\n      configName: configName!,\n    },\n    {\n      enabled: opened,\n    }\n  );\n\n  if (!result || !opened) {\n    return null;\n  }\n\n  return base.mediaType === 'movie' ? (\n    <MovieRequestModal result={result as MovieResult} opened={opened} setOpened={setOpened} />\n  ) : (\n    <TvRequestModal result={result as TvShowResult} opened={opened} setOpened={setOpened} />\n  );\n}\n\nexport function MovieRequestModal({\n  result,\n  opened,\n  setOpened,\n}: {\n  result: MovieResult;\n  opened: boolean;\n  setOpened: (opened: boolean) => void;\n}) {\n  const { secondaryColor } = useColorTheme();\n  const requestMediaAsync = useMediaRequestMutation();\n  const { t } = useTranslation('modules/overseerr');\n\n  return (\n    <Modal\n      onClose={() => setOpened(false)}\n      radius=\"lg\"\n      size=\"lg\"\n      trapFocus\n      zIndex={250}\n      withinPortal\n      opened={opened}\n      title={\n        <Group>\n          <IconDownload />\n          {t('popup.item.buttons.askFor', { title: result.title })}\n        </Group>\n      }\n    >\n      <Stack>\n        <Alert\n          icon={<IconAlertCircle size={16} />}\n          title={t('popup.item.alerts.automaticApproval.title')}\n          color={secondaryColor}\n          radius=\"md\"\n          variant=\"filled\"\n        >\n          {t('popup.item.alerts.automaticApproval.text')}\n        </Alert>\n        <Group>\n          <Button variant=\"outline\" color=\"gray\" onClick={() => setOpened(false)}>\n            {t('popup.item.buttons.cancel')}\n          </Button>\n          <Button\n            variant=\"outline\"\n            onClick={() => {\n              requestMediaAsync('movie', result.id, result.title);\n            }}\n          >\n            {t('popup.item.buttons.request')}\n          </Button>\n        </Group>\n      </Stack>\n    </Modal>\n  );\n}\n\nexport function TvRequestModal({\n  result,\n  opened,\n  setOpened,\n}: {\n  result: TvShowResult;\n  opened: boolean;\n  setOpened: (opened: boolean) => void;\n}) {\n  const [selection, setSelection] = useState<TvShowResultSeason[]>(result.seasons);\n  const { classes, cx } = useStyles();\n  const { t } = useTranslation('modules/overseerr');\n  const requestMediaAsync = useMediaRequestMutation();\n\n  const toggleRow = (container: TvShowResultSeason) =>\n    setSelection((current: TvShowResultSeason[]) =>\n      current.includes(container) ? current.filter((c) => c !== container) : [...current, container]\n    );\n  const toggleAll = () =>\n    setSelection((current: any) =>\n      current.length === result.seasons.length ? [] : result.seasons.map((c) => c)\n    );\n\n  const rows = result.seasons.map((element) => {\n    const selected = selection.includes(element);\n    return (\n      <tr key={element.id} className={cx({ [classes.rowSelected]: selected })}>\n        <td>\n          <Checkbox\n            key={element.id}\n            checked={selection.includes(element)}\n            onChange={() => toggleRow(element)}\n            transitionDuration={0}\n          />\n        </td>\n        <td>{element.name}</td>\n        <td>{element.episodeCount}</td>\n      </tr>\n    );\n  });\n  const { secondaryColor } = useColorTheme();\n\n  return (\n    <Modal\n      onClose={() => setOpened(false)}\n      radius=\"lg\"\n      size=\"lg\"\n      zIndex={250}\n      opened={opened}\n      title={\n        <Group>\n          <IconDownload />\n          {t('popup.item.buttons.askFor', {\n            title: result.name ?? result.originalName ?? 'a TV show',\n          })}\n        </Group>\n      }\n    >\n      <Stack>\n        <Alert\n          icon={<IconAlertCircle size={16} />}\n          title={t('popup.item.alerts.automaticApproval.title')}\n          color={secondaryColor}\n          radius=\"md\"\n          variant=\"filled\"\n        >\n          {t('popup.item.alerts.automaticApproval.text')}\n        </Alert>\n        <Table captionSide=\"bottom\" highlightOnHover>\n          <caption>{t('popup.seasonSelector.caption')}</caption>\n          <thead>\n            <tr>\n              <th>\n                <Checkbox\n                  onChange={toggleAll}\n                  checked={selection.length === result.seasons.length}\n                  indeterminate={selection.length > 0 && selection.length !== result.seasons.length}\n                  transitionDuration={0}\n                />\n              </th>\n              <th>{t('popup.seasonSelector.table.header.season')}</th>\n              <th>{t('popup.seasonSelector.table.header.numberOfEpisodes')}</th>\n            </tr>\n          </thead>\n          <tbody>{rows}</tbody>\n        </Table>\n        <Group position=\"center\">\n          <Button variant=\"outline\" color=\"gray\" onClick={() => setOpened(false)}>\n            {t('popup.item.buttons.cancel')}\n          </Button>\n          <Button\n            variant=\"outline\"\n            disabled={selection.length === 0}\n            onClick={() => {\n              requestMediaAsync(\n                'tv',\n                result.id,\n                result.name,\n                selection.map((s) => s.seasonNumber)\n              );\n            }}\n          >\n            {t('popup.item.buttons.request')}\n          </Button>\n        </Group>\n      </Stack>\n    </Modal>\n  );\n}\n\nconst useMediaRequestMutation = () => {\n  const { name: configName } = useConfigContext();\n  const { mutateAsync } = api.overseerr.request.useMutation();\n\n  return async (type: 'tv' | 'movie', id: number, name: string, seasons?: number[]) => {\n    Consola.info(`Requesting ${type} ${id} ${name}`);\n    showNotification({\n      title: 'Request',\n      id: id.toString(),\n      message: `Requesting media ${name}`,\n      color: 'orange',\n      loading: true,\n      autoClose: false,\n      withCloseButton: false,\n      icon: <IconAlertCircle />,\n    });\n\n    await mutateAsync(\n      {\n        configName: configName!,\n        id,\n        type,\n        seasons: seasons ?? [],\n      },\n      {\n        onSuccess: () => {\n          updateNotification({\n            id: id.toString(),\n            title: '',\n            color: 'green',\n            message: ` ${name} requested`,\n            icon: <IconCheck />,\n            autoClose: 2000,\n          });\n        },\n        onError: (err) => {\n          updateNotification({\n            id: id.toString(),\n            color: 'red',\n            title: 'There was an error',\n            message: err.message,\n            autoClose: 2000,\n          });\n        },\n      }\n    );\n  };\n};\n"
  },
  {
    "path": "src/modules/overseerr/SearchResult.ts",
    "content": "export interface SearchResult {\n  page: number;\n  totalPages: number;\n  totalResults: number;\n  results: Result[];\n}\n\nexport interface Result {\n  id: number;\n  mediaType: MediaType;\n  adult?: boolean;\n  genreIds: number[];\n  originalLanguage: OriginalLanguage;\n  originalTitle?: string;\n  overview: string;\n  popularity: number;\n  releaseDate?: Date;\n  title?: string;\n  video?: boolean;\n  voteAverage: number;\n  voteCount: number;\n  backdropPath: null | string;\n  posterPath: string;\n  mediaInfo?: MediaInfo;\n  firstAirDate?: Date;\n  name?: string;\n  originCountry?: string[];\n  originalName?: string;\n}\n\nexport interface MediaInfo {\n  downloadStatus: any[];\n  downloadStatus4k: any[];\n  id: number;\n  mediaType: MediaType;\n  tmdbId: number;\n  tvdbId: null;\n  imdbId: null;\n  status: number;\n  status4k: number;\n  createdAt: Date;\n  updatedAt: Date;\n  lastSeasonChange: Date;\n  mediaAddedAt: Date;\n  serviceId: number;\n  serviceId4k: null;\n  externalServiceId: number;\n  externalServiceId4k: null;\n  externalServiceSlug: string;\n  externalServiceSlug4k: null;\n  ratingKey: string;\n  ratingKey4k: null;\n  seasons: any[];\n  plexUrl: string;\n  serviceUrl: string;\n  mediaUrl?: string;\n}\n\nexport type MediaType = 'movie' | 'tv';\n\nexport enum OriginalLanguage {\n  En = 'en',\n}\n"
  },
  {
    "path": "src/modules/overseerr/TvShow.d.ts",
    "content": "export interface TvShowResult {\n  createdBy: CreatedBy[];\n  episodeRunTime: number[];\n  firstAirDate: Date;\n  genres: Genre[];\n  relatedVideos: RelatedVideo[];\n  homepage: string;\n  id: number;\n  inProduction: boolean;\n  languages: string[];\n  lastAirDate: Date;\n  name: string;\n  networks: Network[];\n  numberOfEpisodes: number;\n  numberOfSeasons: number;\n  originCountry: string[];\n  originalLanguage: string;\n  originalName: string;\n  tagline: string;\n  overview: string;\n  popularity: number;\n  productionCompanies: Network[];\n  productionCountries: ProductionCountry[];\n  contentRatings: ContentRatings;\n  spokenLanguages: SpokenLanguage[];\n  seasons: TvShowResultSeason[];\n  status: string;\n  type: string;\n  voteAverage: number;\n  voteCount: number;\n  backdropPath: string;\n  lastEpisodeToAir: LastEpisodeToAir;\n  posterPath: string;\n  credits: Credits;\n  externalIds: ExternalIDS;\n  keywords: Genre[];\n  mediaInfo: Media;\n  watchProviders: WatchProvider[];\n}\n\nexport interface ContentRatings {\n  results: Result[];\n}\n\nexport interface Result {\n  iso_3166_1: string;\n  rating: string;\n}\n\nexport interface CreatedBy {\n  id: number;\n  credit_id: string;\n  name: string;\n  gender: number;\n  profile_path: string;\n}\n\nexport interface Credits {\n  cast: Cast[];\n  crew: Crew[];\n}\n\nexport interface Cast {\n  character: string;\n  creditId: string;\n  id: number;\n  name: string;\n  order: number;\n  gender: number;\n  profilePath: null | string;\n}\n\nexport interface Crew {\n  creditId: string;\n  department: string;\n  id: number;\n  job: string;\n  name: string;\n  gender: number;\n  profilePath: string;\n}\n\nexport interface ExternalIDS {\n  facebookId: string;\n  freebaseId: null;\n  freebaseMid: string;\n  imdbId: string;\n  instagramId: string;\n  tvdbId: number;\n  tvrageId: number;\n  twitterId: string;\n}\n\nexport interface Genre {\n  id: number;\n  name: string;\n}\n\nexport interface LastEpisodeToAir {\n  id: number;\n  airDate: Date;\n  episodeNumber: number;\n  name: string;\n  overview: string;\n  productionCode: string;\n  seasonNumber: number;\n  showId: number;\n  voteAverage: number;\n  stillPath: string;\n}\n\nexport interface Request {\n  id: number;\n  status: number;\n  createdAt: Date;\n  updatedAt: Date;\n  type: Type;\n  is4k: boolean;\n  serverId: null;\n  profileId: null;\n  rootFolder: null;\n  languageProfileId: null;\n  tags: null;\n  media: Media;\n  requestedBy: EdBy;\n  modifiedBy: EdBy;\n  seasons: MediaInfoSeason[];\n  seasonCount: number;\n}\n\nexport interface Media {\n  downloadStatus: DownloadStatus[];\n  downloadStatus4k: any[];\n  id: number;\n  mediaType: Type;\n  tmdbId: number;\n  tvdbId: number;\n  imdbId: null;\n  status: number;\n  status4k: number;\n  createdAt: Date;\n  updatedAt: Date;\n  lastSeasonChange: Date;\n  mediaAddedAt: Date;\n  serviceId: number;\n  serviceId4k: null;\n  externalServiceId: number;\n  externalServiceId4k: null;\n  externalServiceSlug: string;\n  externalServiceSlug4k: null;\n  ratingKey: string;\n  ratingKey4k: null;\n  requests?: Request[];\n  issues?: any[];\n  seasons: MediaInfoSeason[];\n  plexUrl: string;\n  serviceUrl: string;\n}\n\nexport interface EdBy {\n  permissions: number;\n  id: number;\n  email: string;\n  plexUsername: string;\n  username: string;\n  recoveryLinkExpirationDate: null;\n  userType: number;\n  avatar: string;\n  movieQuotaLimit: null;\n  movieQuotaDays: null;\n  tvQuotaLimit: null;\n  tvQuotaDays: null;\n  createdAt: Date;\n  updatedAt: Date;\n  settings: Settings;\n  requestCount: number;\n  displayName: string;\n}\n\nexport interface Settings {\n  id: number;\n  locale: string;\n  region: string;\n  originalLanguage: null;\n  pgpKey: null;\n  discordId: string;\n  pushbulletAccessToken: null;\n  pushoverApplicationToken: null;\n  pushoverUserKey: null;\n  telegramChatId: null;\n  telegramSendSilently: null;\n  notificationTypes: NotificationTypes;\n}\n\nexport interface NotificationTypes {\n  discord: number;\n  email: number;\n  webpush: number;\n}\n\nexport interface MediaInfoSeason {\n  id: number;\n  seasonNumber: number;\n  status: number;\n  status4k?: number;\n  createdAt: Date;\n  updatedAt: Date;\n}\n\nexport enum Type {\n  Tv = 'tv',\n}\n\nexport interface DownloadStatus {\n  externalId: number;\n  estimatedCompletionTime: Date;\n  mediaType: Type;\n  size: number;\n  sizeLeft: number;\n  status: Status;\n  timeLeft: string;\n  title: string;\n}\n\nexport enum Status {\n  Completed = 'completed',\n  Downloading = 'downloading',\n}\n\nexport interface Network {\n  id: number;\n  name: Name;\n  originCountry?: string;\n  logoPath: LogoPath | null;\n  displayPriority?: number;\n}\n\nexport enum LogoPath {\n  HbifXPpM55B1FL5WPo7T72VzN78PNG = '/hbifXPpM55B1fL5wPo7t72vzN78.png',\n  KhiCshsZBdtUUYOr4VLoCtuqCEqPNG = '/khiCshsZBdtUUYOr4VLoCtuqCEq.png',\n  O9ExgOSLF3OTwR6T3DJOuwOKJgqJpg = '/o9ExgOSLF3OTwR6T3DJOuwOKJgq.jpg',\n  PEURlLlr8JggOwK53FJ5WdQl05YJpg = '/peURlLlr8jggOwK53fJ5wdQl05y.jpg',\n  T2YyOv40HZeVlLjYsCSPHnWLk4WJpg = '/t2yyOv40HZeVlLjYsCsPHnWLk4W.jpg',\n  TBEdFQDwx5LEVr8WpSEXQSIirVqJpg = '/tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg',\n  The5NyLm42TmCqCMOZFvH4FcoSNKEWJpg = '/5NyLm42TmCqCMOZFvH4fcoSNKEW.jpg',\n  WwemzKWzjKYJFfCeiB57Q3R4BcmPNG = '/wwemzKWzjKYJFfCeiB57q3r4Bcm.png',\n}\n\nexport enum Name {\n  AmazonVideo = 'Amazon Video',\n  AppleITunes = 'Apple iTunes',\n  Channel4 = 'Channel 4',\n  GooglePlayMovies = 'Google Play Movies',\n  HouseOfTomorrow = 'House of Tomorrow',\n  Ivi = 'Ivi',\n  Netflix = 'Netflix',\n  Zeppotron = 'Zeppotron',\n}\n\nexport interface ProductionCountry {\n  iso_3166_1: string;\n  name: string;\n}\n\nexport interface RelatedVideo {\n  site: string;\n  key: string;\n  name: string;\n  size: number;\n  type: string;\n  url: string;\n}\n\nexport interface TvShowResultSeason {\n  airDate: Date;\n  episodeCount: number;\n  id: number;\n  name: string;\n  overview: string;\n  seasonNumber: number;\n  posterPath: string;\n}\n\nexport interface SpokenLanguage {\n  englishName: string;\n  iso_639_1: string;\n  name: string;\n}\n\nexport interface WatchProvider {\n  iso_3166_1: string;\n  link: string;\n  buy: Network[];\n  flatrate: Network[];\n}\n"
  },
  {
    "path": "src/modules/overseerr/example.json",
    "content": "{\n\t\"id\": 86831,\n\t\"firstAirDate\": \"2019-03-15\",\n\t\"genreIds\": [\n\t\t16,\n\t\t10765\n\t],\n\t\"mediaType\": \"tv\",\n\t\"name\": \"Love, Death & Robots\",\n\t\"originCountry\": [\n\t\t\"US\"\n\t],\n\t\"originalLanguage\": \"en\",\n\t\"originalName\": \"Love, Death & Robots\",\n\t\"overview\": \"Terrifying creatures, wicked surprises and dark comedy converge in this NSFW anthology of animated stories presented by Tim Miller and David Fincher.\",\n\t\"popularity\": 623.833,\n\t\"voteAverage\": 8.2,\n\t\"voteCount\": 1720,\n\t\"backdropPath\": \"/78NtUwwo3lhH7QGh4vG3U1qK1mc.jpg\",\n\t\"posterPath\": \"/cRiDlzzZC5lL7fvImuSjs04SUIJ.jpg\",\n\t\"mediaInfo\": {\n\t\t\"downloadStatus\": [],\n\t\t\"downloadStatus4k\": [],\n\t\t\"id\": 79,\n\t\t\"mediaType\": \"tv\",\n\t\t\"tmdbId\": 86831,\n\t\t\"tvdbId\": 357888,\n\t\t\"imdbId\": null,\n\t\t\"status\": 4,\n\t\t\"status4k\": 1,\n\t\t\"createdAt\": \"2022-02-05T04:30:01.000Z\",\n\t\t\"updatedAt\": \"2022-02-05T09:25:22.000Z\",\n\t\t\"lastSeasonChange\": \"2022-02-05T04:30:01.000Z\",\n\t\t\"mediaAddedAt\": \"2022-02-04T01:16:35.000Z\",\n\t\t\"serviceId\": 0,\n\t\t\"serviceId4k\": null,\n\t\t\"externalServiceId\": 7,\n\t\t\"externalServiceId4k\": null,\n\t\t\"externalServiceSlug\": \"love-death-and-robots\",\n\t\t\"externalServiceSlug4k\": null,\n\t\t\"ratingKey\": \"182\",\n\t\t\"ratingKey4k\": null,\n\t\t\"seasons\": [\n\t\t\t{\n\t\t\t\t\"id\": 11,\n\t\t\t\t\"seasonNumber\": 1,\n\t\t\t\t\"status\": 1,\n\t\t\t\t\"status4k\": 1,\n\t\t\t\t\"createdAt\": \"2022-02-05T04:30:01.000Z\",\n\t\t\t\t\"updatedAt\": \"2022-02-05T04:30:01.000Z\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"id\": 24,\n\t\t\t\t\"seasonNumber\": 2,\n\t\t\t\t\"status\": 5,\n\t\t\t\t\"status4k\": 1,\n\t\t\t\t\"createdAt\": \"2022-02-05T04:30:01.000Z\",\n\t\t\t\t\"updatedAt\": \"2022-02-05T04:30:01.000Z\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"id\": 85,\n\t\t\t\t\"seasonNumber\": 3,\n\t\t\t\t\"status\": 3,\n\t\t\t\t\"status4k\": 1,\n\t\t\t\t\"createdAt\": \"2022-04-26T04:30:02.000Z\",\n\t\t\t\t\"updatedAt\": \"2022-04-26T04:30:02.000Z\"\n\t\t\t}\n\t\t],\n\t\t\"plexUrl\": \"https://app.plex.tv/desktop#!/server/5b88b3c20d2d092c0ee848f9044f3f3bee033d91/details?key=%2Flibrary%2Fmetadata%2F182\",\n\t\t\"serviceUrl\": \"http://server:8989/series/love-death-and-robots\"\n\t}\n}"
  },
  {
    "path": "src/pages/401.tsx",
    "content": "import { Button, Center, createStyles, Stack, Text, Title } from '@mantine/core';\nimport { useTranslation } from 'next-i18next';\nimport Image from 'next/image';\nimport Head from 'next/head';\nimport { MainLayout } from '~/components/layout/Templates/MainLayout';\nimport Link from 'next/link';\n\nimport imageAccessDenied from '~/images/undraw_secure_login_pdn4.svg';\nimport { pageAccessDeniedNamespaces } from '~/tools/server/translation-namespaces';\nimport { getServerSideTranslations } from '~/tools/server/getServerSideTranslations';\nimport { GetServerSidePropsContext } from 'next';\n\nexport default function Custom401() {\n  const { classes } = useStyles();\n  const { t } = useTranslation('layout/errors/access-denied');\n  return (\n    <MainLayout>\n      <Center h=\"100dvh\" w=\"100dvw\">\n      <Head>\n        <title>Access denied • Homarr</title>\n      </Head>\n      <Stack maw={500} p=\"xl\">\n        <Image className={classes.image} src={imageAccessDenied} width={200} height={200} alt=\"\" />\n        <Title>{t('title')}</Title>\n        <Text>{t('text')}</Text>\n\n        <Button component={Link} variant=\"light\" href=\"/auth/login\">\n          {t('switchAccount')}\n        </Button>\n      </Stack>\n    </Center>\n    </MainLayout>\n  )\n}\n\nexport async function getStaticProps({ req, res, locale }: GetServerSidePropsContext) {\n  const translations = await getServerSideTranslations(\n    [...pageAccessDeniedNamespaces, 'common'],\n    locale,\n    req,\n    res\n  );\n  return {\n    props: {\n      ...translations,\n    },\n  };\n}\n\nconst useStyles = createStyles(() => ({\n  image: {\n    margin: '0 auto',\n    display: 'block',\n  },\n}));"
  },
  {
    "path": "src/pages/404.tsx",
    "content": "import { Button, Center, createStyles, Stack, Text, Title } from '@mantine/core';\nimport { GetServerSidePropsContext } from 'next';\nimport { useTranslation } from 'next-i18next';\nimport Head from 'next/head';\nimport Image from 'next/image';\nimport Link from 'next/link';\nimport pageNotFoundImage from '~/images/undraw_page_not_found_re_e9o6.svg';\nimport { getServerSideTranslations } from '~/tools/server/getServerSideTranslations';\nimport { pageNotFoundNamespaces } from '~/tools/server/translation-namespaces';\n\nexport default function Custom404() {\n  const { classes } = useStyles();\n\n  const { t } = useTranslation('layout/errors/not-found');\n\n  return (\n    <Center h=\"100dvh\" w=\"100dvw\">\n      <Head>\n        <title>Page not found • Homarr</title>\n      </Head>\n      <Stack maw={500} p=\"xl\">\n        <Image className={classes.image} src={pageNotFoundImage} width={200} height={200} alt=\"\" />\n        <Title>{t('title')}</Title>\n        <Text>{t('text')}</Text>\n\n        <Button component={Link} variant=\"light\" href=\"/b\">\n          {t('button')}\n        </Button>\n        <Button component={Link} variant=\"light\" href=\"/auth/login\">\n          Login\n        </Button>\n      </Stack>\n    </Center>\n  );\n}\n\nexport async function getStaticProps({ req, res, locale }: GetServerSidePropsContext) {\n  const translations = await getServerSideTranslations(\n    [...pageNotFoundNamespaces, 'common'],\n    locale,\n    req,\n    res\n  );\n  return {\n    props: {\n      ...translations,\n    },\n  };\n}\n\nconst useStyles = createStyles(() => ({\n  image: {\n    margin: '0 auto',\n    display: 'block',\n  },\n}));\n"
  },
  {
    "path": "src/pages/_app.tsx",
    "content": "import { ColorScheme as MantineColorScheme, MantineProvider, MantineTheme } from '@mantine/core';\nimport { ModalsProvider } from '@mantine/modals';\nimport { Notifications } from '@mantine/notifications';\nimport { ReactQueryDevtools } from '@tanstack/react-query-devtools';\nimport Consola from 'consola';\nimport { getCookie, setCookie } from 'cookies-next';\nimport dayjs from 'dayjs';\nimport locale from 'dayjs/plugin/localeData';\nimport utc from 'dayjs/plugin/utc';\nimport 'flag-icons/css/flag-icons.min.css';\nimport { GetServerSidePropsContext } from 'next';\nimport { Session } from 'next-auth';\nimport { getSession } from 'next-auth/react';\nimport { appWithTranslation } from 'next-i18next';\nimport { AppProps } from 'next/app';\nimport Script from 'next/script';\nimport { useEffect, useState } from 'react';\nimport 'video.js/dist/video-js.css';\nimport { CommonHead } from '~/components/layout/Meta/CommonHead';\nimport { ConfigProvider } from '~/config/provider';\nimport { env } from '~/env.js';\nimport { CustomSessionProvider } from '~/hooks/custom-session-provider';\nimport { ColorSchemeProvider } from '~/hooks/use-colorscheme';\nimport { modals } from '~/modals';\nimport { usePackageAttributesStore } from '~/tools/client/zustands/usePackageAttributesStore';\nimport { ColorTheme } from '~/tools/color';\nimport { getLanguageByCode } from '~/tools/language';\nimport {\n  ServerSidePackageAttributesType,\n  getServiceSidePackageAttributes,\n} from '~/tools/server/getPackageVersion';\nimport { theme } from '~/tools/server/theme/theme';\nimport { ConfigType } from '~/types/config';\nimport { api } from '~/utils/api';\nimport { colorSchemeParser } from '~/validations/user';\n\nimport { CheckUpgradeModal } from '~/components/UpgradeModal/CheckUpgradeModal';\nimport { COOKIE_COLOR_SCHEME_KEY, COOKIE_LOCALE_KEY } from '../../data/constants';\nimport nextI18nextConfig from '../../next-i18next.config.js';\nimport '../styles/global.scss';\n\ndayjs.extend(locale);\ndayjs.extend(utc);\n\nfunction App(\n  this: any,\n  props: AppProps<{\n    activeColorScheme: MantineColorScheme;\n    environmentColorScheme: MantineColorScheme;\n    packageAttributes: ServerSidePackageAttributesType;\n    editModeEnabled: boolean;\n    logoutUrl?: string;\n    analyticsEnabled: boolean;\n    disableUpgradeModal: boolean;\n    config?: ConfigType;\n    primaryColor?: MantineTheme['primaryColor'];\n    secondaryColor?: MantineTheme['primaryColor'];\n    primaryShade?: MantineTheme['primaryShade'];\n    session: Session;\n    configName?: string;\n    locale: string;\n  }>\n) {\n  const { Component, pageProps } = props;\n  const analyticsEnabled = pageProps.analyticsEnabled ?? true;\n  // TODO: make mapping from our locales to moment locales\n  const language = getLanguageByCode(pageProps.session?.user?.language ?? 'en');\n  if (language.dayJsLocale) require(`dayjs/locale/${language.dayJsLocale}.js`);\n  dayjs.locale(language.dayJsLocale);\n\n  const [primaryColor, setPrimaryColor] = useState<MantineTheme['primaryColor']>(\n    props.pageProps.primaryColor ?? 'red'\n  );\n  const [secondaryColor, setSecondaryColor] = useState<MantineTheme['primaryColor']>(\n    props.pageProps.secondaryColor ?? 'orange'\n  );\n  const [primaryShade, setPrimaryShade] = useState<MantineTheme['primaryShade']>(\n    props.pageProps.primaryShade ?? 6\n  );\n  const colorTheme = {\n    primaryColor,\n    secondaryColor,\n    setPrimaryColor,\n    setSecondaryColor,\n    primaryShade,\n    setPrimaryShade,\n  };\n\n  useEffect(() => {\n    setPrimaryColor(props.pageProps.primaryColor ?? 'red');\n    setSecondaryColor(props.pageProps.secondaryColor ?? 'orange');\n    setPrimaryShade(props.pageProps.primaryShade ?? 6);\n    return () => {\n      setPrimaryColor('red');\n      setSecondaryColor('orange');\n      setPrimaryShade(6);\n    };\n  }, [props.pageProps]);\n\n  const { setInitialPackageAttributes } = usePackageAttributesStore();\n  useEffect(() => {\n    setInitialPackageAttributes(props.pageProps.packageAttributes);\n  }, []);\n\n  return (\n    <>\n      <CommonHead />\n      {!pageProps.disableUpgradeModal && <CheckUpgradeModal />}\n      {pageProps.session && pageProps.session.user.language === 'cr' && (\n        <>\n          <Script type=\"text/javascript\" src=\"//cdn.crowdin.com/jipt/jipt.js\" />\n          <Script type=\"text/javascript\">var _jipt = []; _jipt.push(['project', 'homarr']);</Script>\n        </>\n      )}\n      {analyticsEnabled === true && (\n        <Script\n          src=\"https://umami.homarr.dev/script.js\"\n          data-website-id=\"f133f10c-30a7-4506-889c-3a803f328fa4\"\n          strategy=\"lazyOnload\"\n        />\n      )}\n      <CustomSessionProvider session={pageProps.session} logoutUrl={pageProps.logoutUrl}>\n        <ColorSchemeProvider {...pageProps}>\n          {(colorScheme) => (\n            <ColorTheme.Provider value={colorTheme}>\n              <MantineProvider\n                theme={{\n                  ...theme,\n                  components: {\n                    Checkbox: {\n                      styles: {\n                        input: { cursor: 'pointer' },\n                        label: { cursor: 'pointer' },\n                      },\n                    },\n                    Switch: {\n                      styles: {\n                        input: { cursor: 'pointer' },\n                        label: { cursor: 'pointer' },\n                      },\n                    },\n                  },\n                  primaryColor,\n                  primaryShade,\n                  colorScheme,\n                }}\n                withGlobalStyles\n                withNormalizeCSS\n                withCSSVariables\n              >\n                <ConfigProvider {...props.pageProps}>\n                  <Notifications limit={4} position=\"bottom-left\" />\n                  <ModalsProvider modals={modals}>\n                    <Component {...pageProps} />\n                  </ModalsProvider>\n                </ConfigProvider>\n              </MantineProvider>\n            </ColorTheme.Provider>\n          )}\n        </ColorSchemeProvider>\n        <ReactQueryDevtools initialIsOpen={false} />\n      </CustomSessionProvider>\n    </>\n  );\n}\n\nApp.getInitialProps = async ({ ctx }: { ctx: GetServerSidePropsContext }) => {\n  if (env.NEXT_PUBLIC_DEFAULT_COLOR_SCHEME !== 'light') {\n    Consola.debug(\n      `Overriding the default color scheme with ${env.NEXT_PUBLIC_DEFAULT_COLOR_SCHEME}`\n    );\n  }\n\n  const analyticsEnabled = env.NEXT_PUBLIC_DISABLE_ANALYTICS !== 'true';\n\n  const session = await getSession(ctx);\n\n  // Set the cookie language to the user language if it is not set correctly\n  const cookieLanguage = getCookie(COOKIE_LOCALE_KEY, ctx);\n  if (session?.user && session.user.language != cookieLanguage) {\n    setCookie(COOKIE_LOCALE_KEY, session.user.language, ctx);\n  }\n\n  return {\n    pageProps: {\n      ...getActiveColorScheme(session, ctx),\n      packageAttributes: getServiceSidePackageAttributes(),\n      logoutUrl: env.AUTH_LOGOUT_REDIRECT_URL,\n      analyticsEnabled,\n      disableUpgradeModal: env.DISABLE_UPGRADE_MODAL,\n      session,\n      locale: ctx.locale ?? 'en',\n    },\n  };\n};\n\nexport default appWithTranslation<any>(api.withTRPC(App), nextI18nextConfig as any);\n\nconst getActiveColorScheme = (session: Session | null, ctx: GetServerSidePropsContext) => {\n  const environmentColorScheme = env.NEXT_PUBLIC_DEFAULT_COLOR_SCHEME ?? 'light';\n  const cookieColorScheme = getCookie(COOKIE_COLOR_SCHEME_KEY, ctx);\n  const activeColorScheme = colorSchemeParser.parse(\n    session?.user?.colorScheme ?? cookieColorScheme ?? environmentColorScheme\n  );\n\n  if (cookieColorScheme !== activeColorScheme) {\n    setCookie(COOKIE_COLOR_SCHEME_KEY, activeColorScheme, ctx);\n  }\n\n  return {\n    activeColorScheme: activeColorScheme,\n    environmentColorScheme,\n  };\n};\n"
  },
  {
    "path": "src/pages/_document.tsx",
    "content": "import { createGetInitialProps } from '@mantine/next';\nimport Document, { Head, Html, Main, NextScript } from 'next/document';\n\nconst getInitialProps = createGetInitialProps();\n\nexport default class _Document extends Document {\n  static getInitialProps = getInitialProps;\n\n  render() {\n    return (\n      <Html>\n        <Head />\n        <body>\n          <Main />\n          <NextScript />\n        </body>\n      </Html>\n    );\n  }\n}\n"
  },
  {
    "path": "src/pages/_error.tsx",
    "content": "import { Accordion, Center, createStyles, Group, Stack, Text, Title, useMantineTheme } from '@mantine/core';\nimport { IconDeviceDesktop, IconInfoCircle, IconServer } from '@tabler/icons-react';\nimport { NextPageContext } from 'next';\nimport Head from 'next/head';\nimport Image from 'next/image';\nimport imageBugFixing from '~/images/undraw_bug_fixing_oc-7-a.svg';\n\nfunction Error({ statusCode }: { statusCode: number }) {\n  const { classes } = useStyles();\n  const theme = useMantineTheme();\n  const getColor = (color: string) => theme.colors[color][theme.colorScheme === 'dark' ? 5 : 7];\n  return (\n    <Center className={classes.root} h=\"100dvh\" maw={400}>\n      <Head>\n        <title>An error occurred • Homarr</title>\n      </Head>\n      <Stack>\n        <Image className={classes.image} src={imageBugFixing} alt=\"bug illustration\" />\n        <Title>An unexpected error has occurred</Title>\n        <Text>\n          This page has crashed unexpectedly. We're sorry for the inconvenience. Please try again or\n          contact an administrator\n        </Text>\n\n        <Accordion variant=\"contained\">\n          <Accordion.Item value=\"detailed\">\n            <Accordion.Control icon={<IconInfoCircle color={getColor('red')} size=\"1rem\" />}>\n              Detailed error information\n            </Accordion.Control>\n            <Accordion.Panel>\n              <Stack spacing=\"xs\">\n                <Group position=\"apart\">\n                  <Text fw=\"bold\">Type</Text>\n                  <Text>\n                    {statusCode ? (\n                      <Group spacing=\"xs\">\n                        <IconServer size=\"1rem\" />\n                        <Text>Server side</Text>\n                      </Group>\n                    ) : (\n                      <Group spacing=\"xs\">\n                        <IconDeviceDesktop size=\"1rem\" />\n                        <Text>Client side</Text>\n                      </Group>\n                    )}\n                  </Text>\n                </Group>\n              </Stack>\n            </Accordion.Panel>\n          </Accordion.Item>\n        </Accordion>\n      </Stack>\n    </Center>\n  );\n}\n\nError.getInitialProps = ({ res, err }: NextPageContext) => {\n  const statusCode = res ? res.statusCode : err ? err.statusCode : 404;\n  return { statusCode };\n};\n\nconst useStyles = createStyles(() => ({\n  root: {\n    margin: '0 auto',\n  },\n  image: {\n    maxWidth: 400,\n    maxHeight: 200,\n    display: 'block',\n    margin: '0 auto',\n  },\n}));\n\nexport default Error;\n"
  },
  {
    "path": "src/pages/api/[...trpc].ts",
    "content": "import { NextApiRequest, NextApiResponse } from 'next';\nimport cors from 'nextjs-cors';\nimport { createOpenApiNextHandler } from 'trpc-openapi';\nimport { createTRPCContext } from '~/server/api/trpc';\nimport { rootRouter } from '~/server/api/root';\nimport Consola from 'consola';\n\nconst handler = async (req: NextApiRequest, res: NextApiResponse) => {\n  // Setup CORS\n  await cors(req, res);\n\n  // Handle incoming OpenAPI requests\n  return createOpenApiNextHandler({\n    router: rootRouter,\n    createContext: createTRPCContext,\n    onError({ error, path }) {\n      Consola.error(`tRPC OpenAPI error on ${path}: ${error}`);\n    }\n  })(req, res);\n};\n\nexport default handler;"
  },
  {
    "path": "src/pages/api/auth/[...nextauth].ts",
    "content": "import { NextApiRequest, NextApiResponse } from 'next';\nimport NextAuth from 'next-auth';\nimport { constructAuthOptions } from '~/server/auth';\n\nexport default async function auth(req: NextApiRequest, res: NextApiResponse) {\n  return await NextAuth(req, res, await constructAuthOptions(req, res));\n}\n"
  },
  {
    "path": "src/pages/api/download.ts",
    "content": "import AdmZip from 'adm-zip';\nimport fs from 'fs';\nimport { NextApiRequest, NextApiResponse } from 'next';\nimport { getServerAuthSession } from '~/server/auth';\nimport { getFrontendConfig } from '~/tools/config/getFrontendConfig';\n\nconst handler = async (req: NextApiRequest, res: NextApiResponse) => {\n  const session = await getServerAuthSession({ req, res });\n  if (!session) {\n    return res.status(401).end();\n  }\n\n  if (!session.user.isAdmin) {\n    return res.status(403).end();\n  }\n\n  const files = fs.readdirSync('./data/configs').filter((file) => file.endsWith('.json'));\n\n  const zip = new AdmZip();\n\n  for (const file of files) {\n    const data = await getFrontendConfig(file.replace('.json', ''));\n    const content = JSON.stringify(data, null, 2);\n    zip.addFile(file, Buffer.from(content, 'utf-8'));\n  }\n\n  const zipBuffer = zip.toBuffer();\n  res.setHeader('Content-Type', 'application/zip');\n  res.setHeader('Content-Disposition', 'attachment; filename=board-configs.zip');\n  res.setHeader('Content-Length', zipBuffer.length.toString());\n  res.status(200).end(zipBuffer);\n};\n\nexport default handler;\n"
  },
  {
    "path": "src/pages/api/migrate.ts",
    "content": "import AdmZip from 'adm-zip';\nimport crypto, { randomBytes } from 'crypto';\nimport { eq, isNotNull } from 'drizzle-orm';\nimport fs from 'fs';\nimport { NextApiRequest, NextApiResponse } from 'next';\nimport { getServerAuthSession } from '~/server/auth';\nimport { db } from '~/server/db';\nimport { migrateTokens, users } from '~/server/db/schema';\nimport { getConfig } from '~/tools/config/getConfig';\n\nconst handler = async (req: NextApiRequest, res: NextApiResponse) => {\n  const session = await getServerAuthSession({ req, res });\n  if (!session) {\n    return res.status(401).end();\n  }\n\n  if (!session.user.isAdmin) {\n    return res.status(403).end('Not an admin');\n  }\n\n  const token = req.query.token;\n\n  if (!token || Array.isArray(token)) {\n    return res.status(400).end();\n  }\n\n  const dbToken = await db.query.migrateTokens.findFirst({\n    where: eq(migrateTokens.token, token),\n  });\n\n  if (!dbToken) {\n    return res.status(403).end('No db token');\n  }\n\n  if (dbToken.expires < new Date()) {\n    return res.status(403).end('Token expired');\n  }\n\n  const files = fs.readdirSync('./data/configs').filter((file) => file.endsWith('.json'));\n\n  const zip = new AdmZip();\n\n  for (const file of files) {\n    const data = await getConfig(file.replace('.json', ''));\n\n    const mappedApps = data.apps.map((app) => ({\n      ...app,\n      integration:\n        app.integration && dbToken.integrations\n          ? {\n              ...app.integration,\n              properties: app.integration.properties.map((property) => ({\n                ...property,\n                value: property.value ? encryptSecret(property.value, dbToken.token) : null,\n              })),\n            }\n          : null,\n    }));\n\n    const content = JSON.stringify(\n      {\n        ...data,\n        apps: mappedApps,\n      },\n      null,\n      2\n    );\n    zip.addFile(file, Buffer.from(content, 'utf-8'));\n  }\n\n  if (dbToken.users) {\n    // Only credentials users\n    const dbUsers = await db.query.users.findMany({\n      with: { settings: true },\n      where: isNotNull(users.password),\n    });\n    const encryptedUsers = dbUsers.map((user) => ({\n      ...user,\n      password: user.password ? encryptSecret(user.password, dbToken.token) : null,\n      salt: user.salt ? encryptSecret(user.salt, dbToken.token) : null,\n    }));\n    const content = JSON.stringify(encryptedUsers, null, 2);\n    zip.addFile('users/users.json', Buffer.from(content, 'utf-8'));\n  }\n\n  if (dbToken.integrations || dbToken.users) {\n    const checksum = randomBytes(16).toString('hex');\n    const encryptedChecksum = encryptSecret(checksum, dbToken.token);\n    const content = `${checksum}\\n${encryptedChecksum}`;\n    zip.addFile('checksum.txt', Buffer.from(content, 'utf-8'));\n  }\n\n  const zipBuffer = zip.toBuffer();\n  res.setHeader('Content-Type', 'application/zip');\n  res.setHeader('Content-Disposition', 'attachment; filename=migrate-homarr.zip');\n  res.setHeader('Content-Length', zipBuffer.length.toString());\n  res.status(200).end(zipBuffer);\n};\n\nexport default handler;\n\nexport function encryptSecret(text: string, encryptionKey: string): `${string}.${string}` {\n  const key = Buffer.from(encryptionKey, 'hex');\n  const initializationVector = crypto.randomBytes(16);\n  const cipher = crypto.createCipheriv('aes-256-cbc', Buffer.from(key), initializationVector);\n  let encrypted = cipher.update(text);\n  encrypted = Buffer.concat([encrypted, cipher.final()]);\n  return `${encrypted.toString('hex')}.${initializationVector.toString('hex')}`;\n}\n"
  },
  {
    "path": "src/pages/api/openapi.json.ts",
    "content": "import { NextApiRequest, NextApiResponse } from 'next';\nimport { openApiDocument } from '~/server/openai';\n\n// Respond with our OpenAPI schema\nconst handler = (req: NextApiRequest, res: NextApiResponse) => {\n  res.status(200).send(openApiDocument);\n};\n\nexport default handler;"
  },
  {
    "path": "src/pages/api/trpc/[trpc].ts",
    "content": "import { createNextApiHandler } from '@trpc/server/adapters/next';\nimport Consola from 'consola';\nimport { env } from '~/env';\nimport { rootRouter } from '~/server/api/root';\nimport { createTRPCContext } from '~/server/api/trpc';\n\n// export API handler\nexport default createNextApiHandler({\n  router: rootRouter,\n  createContext: createTRPCContext,\n  onError:\n    env.NEXT_PUBLIC_NODE_ENV === 'development'\n      ? ({ path, error }) => {\n          Consola.error(`❌ tRPC failed on ${path ?? '<no-path>'}: ${error.message}`);\n        }\n      : undefined,\n});\n"
  },
  {
    "path": "src/pages/auth/invite/[inviteId].tsx",
    "content": "import { Button, Card, Flex, PasswordInput, Stack, Text, TextInput, Title } from '@mantine/core';\nimport { useForm } from '@mantine/form';\nimport { showNotification, updateNotification } from '@mantine/notifications';\nimport { IconCheck, IconX } from '@tabler/icons-react';\nimport { and, eq } from 'drizzle-orm';\nimport { GetServerSideProps } from 'next';\nimport { signIn } from 'next-auth/react';\nimport { useTranslation } from 'next-i18next';\nimport Head from 'next/head';\nimport { useRouter } from 'next/router';\nimport { useState } from 'react';\nimport { z } from 'zod';\nimport { PasswordRequirements } from '~/components/Password/password-requirements';\nimport { ThemeSchemeToggle } from '~/components/ThemeSchemeToggle/ThemeSchemeToggle';\nimport { FloatingBackground } from '~/components/layout/Background/FloatingBackground';\nimport { getServerAuthSession } from '~/server/auth';\nimport { db } from '~/server/db';\nimport { invites } from '~/server/db/schema';\nimport { getServerSideTranslations } from '~/tools/server/getServerSideTranslations';\nimport { api } from '~/utils/api';\nimport { useI18nZodResolver } from '~/utils/i18n-zod-resolver';\nimport { signUpFormSchema } from '~/validations/user';\n\nconst notificationId = 'register';\n\nexport default function AuthInvitePage() {\n  const { t } = useTranslation('authentication/invite');\n  const { i18nZodResolver } = useI18nZodResolver();\n  const router = useRouter();\n  const query = router.query as { token: string };\n  const { mutateAsync, isError } = api.user.createFromInvite.useMutation();\n  const [isLoading, setIsLoading] = useState(false);\n\n  const form = useForm<z.infer<typeof signUpFormSchema>>({\n    validateInputOnChange: true,\n    validateInputOnBlur: true,\n    validate: i18nZodResolver(signUpFormSchema),\n    initialValues: {\n      username: '',\n      password: '',\n      passwordConfirmation: '',\n    },\n  });\n\n  const handleSubmit = (values: z.infer<typeof signUpFormSchema>) => {\n    showNotification({\n      id: notificationId,\n      title: t('notifications.loading.title'),\n      message: `${t('notifications.loading.text')}...`,\n      loading: true,\n    });\n    setIsLoading(true);\n    void mutateAsync(\n      {\n        ...values,\n        inviteToken: query.token,\n      },\n      {\n        onSuccess() {\n          updateNotification({\n            id: notificationId,\n            title: t('notifications.success.title'),\n            message: t('notifications.success.text'),\n            color: 'teal',\n            icon: <IconCheck />,\n          });\n          signIn('credentials', {\n            redirect: false,\n            name: values.username,\n            password: values.password,\n            callbackUrl: '/',\n          }).then((response) => {\n            if (!response?.ok) {\n              // Redirect to login page if something went wrong\n              router.push('/auth/login');\n              return;\n            }\n            router.push('/manage');\n          });\n        },\n        onError(error) {\n          updateNotification({\n            id: notificationId,\n            title: t('notifications.error.title'),\n            message: t('notifications.error.text', { error: error.message }),\n            color: 'red',\n            icon: <IconX />,\n          });\n        },\n      }\n    );\n  };\n\n  const metaTitle = `${t('metaTitle')} • Homarr`;\n\n  return (\n    <>\n      <Head>\n        <title>{metaTitle}</title>\n      </Head>\n\n      <Flex h=\"100dvh\" display=\"flex\" w=\"100%\" direction=\"column\" align=\"center\" justify=\"center\">\n        <FloatingBackground />\n        <ThemeSchemeToggle pos=\"absolute\" top={20} right={20} />\n        <Card withBorder shadow=\"md\" p=\"xl\" radius=\"md\" w=\"90%\" maw={420}>\n          <Title align=\"center\" weight={900}>\n            {t('title')}\n          </Title>\n\n          <Text color=\"dimmed\" size=\"sm\" align=\"center\" mt={5} mb=\"md\">\n            {t('text')}\n          </Text>\n\n          <form onSubmit={form.onSubmit(handleSubmit)}>\n            <Stack>\n              <TextInput\n                variant=\"filled\"\n                label={t('form.fields.username.label')}\n                withAsterisk\n                {...form.getInputProps('username')}\n              />\n              <PasswordInput\n                variant=\"filled\"\n                label={t('form.fields.password.label')}\n                withAsterisk\n                {...form.getInputProps('password')}\n              />\n              <Card>\n                <PasswordRequirements value={form.values.password} />\n              </Card>\n\n              <PasswordInput\n                variant=\"filled\"\n                label={t('form.fields.passwordConfirmation.label')}\n                withAsterisk\n                {...form.getInputProps('passwordConfirmation')}\n              />\n\n              <Button fullWidth type=\"submit\" disabled={!form.isValid()} loading={isLoading}>\n                {t('form.buttons.submit')}\n              </Button>\n            </Stack>\n          </form>\n        </Card>\n      </Flex>\n    </>\n  );\n}\n\nconst queryParamsSchema = z.object({\n  token: z.string(),\n});\nconst routeParamsSchema = z.object({\n  inviteId: z.string(),\n});\n\nexport const getServerSideProps: GetServerSideProps = async ({\n  locale,\n  req,\n  res,\n  query,\n  params,\n}) => {\n  const session = await getServerAuthSession({ req, res });\n\n  if (session) {\n    return {\n      redirect: {\n        destination: '/',\n        permanent: false,\n      },\n    };\n  }\n\n  const queryParams = queryParamsSchema.safeParse(query);\n  const routeParams = routeParamsSchema.safeParse(params);\n\n  if (!queryParams.success || !routeParams.success) {\n    return {\n      notFound: true,\n    };\n  }\n\n  const dbInvite = await db.query.invites.findFirst({\n    where: and(\n      eq(invites.id, routeParams.data.inviteId),\n      eq(invites.token, queryParams.data.token)\n    ),\n  });\n\n  if (!dbInvite || dbInvite.expires < new Date()) {\n    return {\n      notFound: true,\n    };\n  }\n\n  return {\n    props: {\n      ...(await getServerSideTranslations(\n        ['authentication/invite', 'password-requirements'],\n        locale,\n        req,\n        res\n      )),\n    },\n  };\n};\n"
  },
  {
    "path": "src/pages/auth/login.tsx",
    "content": "import {\n  Alert,\n  Button,\n  Card,\n  Divider,\n  Flex,\n  PasswordInput,\n  Stack,\n  Text,\n  TextInput,\n  Title,\n} from '@mantine/core';\nimport { useForm } from '@mantine/form';\nimport { IconAlertTriangle } from '@tabler/icons-react';\nimport { GetServerSidePropsContext, InferGetServerSidePropsType } from 'next';\nimport { signIn } from 'next-auth/react';\nimport { useTranslation } from 'next-i18next';\nimport Head from 'next/head';\nimport Image from 'next/image';\nimport { useRouter } from 'next/router';\nimport { useEffect, useState } from 'react';\nimport { z } from 'zod';\nimport { ThemeSchemeToggle } from '~/components/ThemeSchemeToggle/ThemeSchemeToggle';\nimport { FloatingBackground } from '~/components/layout/Background/FloatingBackground';\nimport { env } from '~/env';\nimport { getServerAuthSession } from '~/server/auth';\nimport { getServerSideTranslations } from '~/tools/server/getServerSideTranslations';\nimport { useI18nZodResolver } from '~/utils/i18n-zod-resolver';\nimport { signInSchema } from '~/validations/user';\n\nconst signInSchemaWithProvider = signInSchema.extend({ provider: z.string() });\n\nexport default function LoginPage({\n  redirectAfterLogin,\n  providers,\n  oidcProviderName,\n  oidcAutoLogin,\n  isDemo,\n}: InferGetServerSidePropsType<typeof getServerSideProps>) {\n  const { t } = useTranslation('authentication/login');\n  const { i18nZodResolver } = useI18nZodResolver();\n  const router = useRouter();\n  const [isLoading, setIsLoading] = useState(false);\n  const [isError, setIsError] = useState(false);\n\n  const hasCredentialsInput = providers.includes('credentials') || providers.includes('ldap');\n\n  const form = useForm<z.infer<typeof signInSchemaWithProvider>>({\n    validateInputOnChange: true,\n    validateInputOnBlur: true,\n    validate: i18nZodResolver(signInSchemaWithProvider),\n    initialValues: { name: '', password: '', provider: '' },\n  });\n\n  const handleSubmit = (values: z.infer<typeof signInSchemaWithProvider>) => {\n    setIsLoading(true);\n    setIsError(false);\n    signIn(values.provider, {\n      redirect: false,\n      name: values.name,\n      password: values.password,\n      callbackUrl: '/',\n    }).then((response) => {\n      if (!response?.ok) {\n        setIsLoading(false);\n        setIsError(true);\n        return;\n      }\n      router.push(redirectAfterLogin ?? '/manage');\n    });\n  };\n\n  useEffect(() => {\n    if (oidcAutoLogin && !isError)\n      signIn('oidc', {\n        redirect: false,\n        callbackUrl: '/',\n      }).then((response) => {\n        if (!response?.ok) {\n          setIsError(true);\n        }\n      });\n  }, [oidcAutoLogin]);\n\n  const metaTitle = `${t('metaTitle')} • Homarr`;\n\n  return (\n    <>\n      <Head>\n        <title>{metaTitle}</title>\n      </Head>\n      <Flex h=\"100dvh\" display=\"flex\" w=\"100%\" direction=\"column\" align=\"center\" justify=\"center\">\n        <FloatingBackground />\n        <ThemeSchemeToggle pos=\"absolute\" top={20} right={20} />\n        <Stack spacing={40} align=\"center\" w=\"100%\">\n          <Stack spacing={0} align=\"center\">\n            <Image src=\"/imgs/logo/logo.svg\" width={80} height={80} alt=\"\" />\n            <Text\n              sx={(theme) => ({\n                color: theme.colorScheme === 'dark' ? theme.colors.gray[5] : theme.colors.dark[6],\n                fontSize: '4rem',\n                fontWeight: 800,\n                lineHeight: 1,\n              })}\n              align=\"center\"\n            >\n              Homarr\n            </Text>\n          </Stack>\n          {isDemo && (\n            <Alert title=\"Demo credentials\">\n              For demo purposes, you can login with the login <b>demo</b> and password :{' '}\n              <b>demodemo</b>\n            </Alert>\n          )}\n          {oidcAutoLogin ? (\n            <Card withBorder shadow=\"md\" p=\"xl\" radius=\"md\" w=\"90%\" maw={450}>\n              <Text size=\"lg\" align=\"center\" m=\"md\">\n                Signing in with OIDC provider\n              </Text>\n            </Card>\n          ) : (\n            <Card withBorder shadow=\"md\" p=\"xl\" radius=\"md\" w=\"90%\" maw={450}>\n              <Title style={{ whiteSpace: 'nowrap' }} align=\"center\" weight={900}>\n                {t('title')}\n              </Title>\n\n              {(providers.length < 1 && (\n                <Alert\n                  icon={<IconAlertTriangle size=\"1rem\" />}\n                  title={t('form.providersEmpty.title')}\n                  mt={5}\n                >\n                  {t('form.providersEmpty.message')}\n                </Alert>\n              )) || (\n                <Text color=\"dimmed\" size=\"sm\" align=\"center\" mt={5} mb=\"md\">\n                  {t('text')}\n                </Text>\n              )}\n\n              {isError && (\n                <Alert icon={<IconAlertTriangle size=\"1rem\" />} color=\"red\">\n                  {t('alert')}\n                </Alert>\n              )}\n              {hasCredentialsInput && (\n                <form onSubmit={form.onSubmit(handleSubmit)}>\n                  <Stack>\n                    <TextInput\n                      variant=\"filled\"\n                      label={t('form.fields.username.label')}\n                      autoComplete=\"homarr-username\"\n                      withAsterisk\n                      {...form.getInputProps('name')}\n                    />\n\n                    <PasswordInput\n                      variant=\"filled\"\n                      label={t('form.fields.password.label')}\n                      autoComplete=\"homarr-password\"\n                      withAsterisk\n                      {...form.getInputProps('password')}\n                    />\n\n                    {providers.includes('credentials') && (\n                      <Button\n                        mt=\"xs\"\n                        variant=\"light\"\n                        fullWidth\n                        type=\"submit\"\n                        disabled={isLoading && form.values.provider != 'credentials'}\n                        loading={isLoading && form.values.provider == 'credentials'}\n                        name=\"credentials\"\n                        onClick={() => form.setFieldValue('provider', 'credentials')}\n                      >\n                        {t('form.buttons.submit')}\n                      </Button>\n                    )}\n\n                    {providers.includes('ldap') && (\n                      <Button\n                        mt=\"xs\"\n                        variant=\"light\"\n                        fullWidth\n                        type=\"submit\"\n                        disabled={isLoading && form.values.provider != 'ldap'}\n                        loading={isLoading && form.values.provider == 'ldap'}\n                        name=\"ldap\"\n                        onClick={() => form.setFieldValue('provider', 'ldap')}\n                      >\n                        {t('form.buttons.submit')} - LDAP\n                      </Button>\n                    )}\n\n                    {redirectAfterLogin && (\n                      <Text color=\"dimmed\" align=\"center\" size=\"xs\">\n                        {t('form.afterLoginRedirection', { url: redirectAfterLogin })}\n                      </Text>\n                    )}\n                  </Stack>\n                </form>\n              )}\n              {hasCredentialsInput && providers.includes('oidc') && (\n                <Divider label=\"OIDC\" labelPosition=\"center\" mt=\"xl\" mb=\"md\" />\n              )}\n              {providers.includes('oidc') && (\n                <Button\n                  mt=\"xs\"\n                  variant=\"light\"\n                  fullWidth\n                  onClick={() =>\n                    signIn('oidc', {\n                      redirect: false,\n                      callbackUrl: '/',\n                    })\n                  }\n                >\n                  {t('form.buttons.submit')} - {oidcProviderName}\n                </Button>\n              )}\n            </Card>\n          )}\n        </Stack>\n      </Flex>\n    </>\n  );\n}\n\nconst regexExp = /^\\/{1}[A-Za-z\\/]*$/;\n\nexport const getServerSideProps = async ({\n  locale,\n  req,\n  res,\n  query,\n}: GetServerSidePropsContext) => {\n  const session = await getServerAuthSession({ req, res });\n\n  const zodResult = await z\n    .object({ redirectAfterLogin: z.string().regex(regexExp) })\n    .safeParseAsync(query);\n  const redirectAfterLogin = zodResult.success ? zodResult.data.redirectAfterLogin : null;\n\n  if (session) {\n    return {\n      redirect: {\n        destination: '/',\n        permanent: false,\n      },\n    };\n  }\n\n  const isDemo = env.DEMO_MODE === 'true';\n\n  return {\n    props: {\n      ...(await getServerSideTranslations(['authentication/login'], locale, req, res)),\n      redirectAfterLogin,\n      providers: env.AUTH_PROVIDER,\n      oidcProviderName: env.AUTH_OIDC_CLIENT_NAME || null,\n      oidcAutoLogin: env.AUTH_OIDC_AUTO_LOGIN || null,\n      isDemo,\n    },\n  };\n};\n"
  },
  {
    "path": "src/pages/b/[slug]/customize.tsx",
    "content": "export { default, getServerSideProps } from '../../board/[slug]/customize';\n"
  },
  {
    "path": "src/pages/b/[slug].tsx",
    "content": "export { default, getServerSideProps } from '../board/[slug]';\n"
  },
  {
    "path": "src/pages/b/index.tsx",
    "content": "export { default, getServerSideProps } from '../board';\n"
  },
  {
    "path": "src/pages/board/[slug]/customize.tsx",
    "content": "import { Affix, Button, Card, Container, Group, Paper, rem, Stack, Text, Title, Transition } from '@mantine/core';\nimport { showNotification, updateNotification } from '@mantine/notifications';\nimport {\n  IconArrowLeft,\n  IconBrush,\n  IconChartCandle,\n  IconCheck,\n  IconDragDrop,\n  IconLayout,\n  IconLock,\n  IconX,\n  TablerIconsProps,\n} from '@tabler/icons-react';\nimport { GetServerSideProps, InferGetServerSidePropsType } from 'next';\nimport { useTranslation } from 'next-i18next';\nimport Head from 'next/head';\nimport Link from 'next/link';\nimport { useRouter } from 'next/router';\nimport { ReactNode } from 'react';\nimport { z } from 'zod';\nimport { AccessCustomization } from '~/components/Board/Customize/Access/AccessCustomization';\nimport { AppearanceCustomization } from '~/components/Board/Customize/Appearance/AppearanceCustomization';\nimport { GridstackCustomization } from '~/components/Board/Customize/Gridstack/GridstackCustomization';\nimport { LayoutCustomization } from '~/components/Board/Customize/Layout/LayoutCustomization';\nimport { PageMetadataCustomization } from '~/components/Board/Customize/PageMetadata/PageMetadataCustomization';\nimport { BoardCustomizationFormProvider, useBoardCustomizationForm } from '~/components/Board/Customize/form';\nimport { useBoardLink } from '~/components/layout/Templates/BoardLayout';\nimport { MainLayout } from '~/components/layout/Templates/MainLayout';\nimport { createTrpcServersideHelpers } from '~/server/api/helper';\nimport { configRouter } from '~/server/api/routers/config';\nimport { getServerAuthSession } from '~/server/auth';\nimport { getServerSideTranslations } from '~/tools/server/getServerSideTranslations';\nimport { checkForSessionOrAskForLogin } from '~/tools/server/loginBuilder';\nimport { firstUpperCase } from '~/tools/shared/strings';\nimport { ConfigType } from '~/types/config';\nimport { api } from '~/utils/api';\nimport { useI18nZodResolver } from '~/utils/i18n-zod-resolver';\nimport { boardCustomizationSchema } from '~/validations/boards';\n\nconst notificationId = 'board-customization-notification';\n\nexport default function CustomizationPage({\n  initialConfig,\n}: InferGetServerSidePropsType<typeof getServerSideProps>) {\n  const query = useRouter().query as {\n    slug: string;\n  };\n  const utils = api.useContext();\n  const {\n    data: config,\n    error,\n    isError,\n  } = api.config.byName.useQuery(\n    { name: query.slug },\n    {\n      initialData: initialConfig,\n      refetchOnMount: false,\n      useErrorBoundary: false,\n      suspense: false,\n    }\n  );\n  const { mutateAsync: saveCustomization, isLoading } = api.config.saveCustomization.useMutation();\n  const { i18nZodResolver } = useI18nZodResolver();\n  const { t } = useTranslation('boards/customize');\n  const form = useBoardCustomizationForm({\n    initialValues: {\n      access: {\n        allowGuests: config?.settings.access.allowGuests ?? false,\n      },\n      layout: {\n        leftSidebarEnabled: config?.settings.customization.layout.enabledLeftSidebar ?? false,\n        rightSidebarEnabled: config?.settings.customization.layout.enabledRightSidebar ?? false,\n        pingsEnabled: config?.settings.customization.layout.enabledPing ?? false,\n      },\n      appearance: {\n        backgroundSrc: config?.settings.customization.backgroundImageUrl ?? '',\n        primaryColor: config?.settings.customization.colors.primary ?? 'red',\n        secondaryColor: config?.settings.customization.colors.secondary ?? 'orange',\n        shade: (config?.settings.customization.colors.shade as number | undefined) ?? 8,\n        opacity: config?.settings.customization.appOpacity ?? 50,\n        customCss: config?.settings.customization.customCss ?? '',\n        backgroundImageAttachment: config?.settings.customization.backgroundImageAttachment ?? 'fixed',\n        backgroundImageRepeat: config?.settings.customization.backgroundImageRepeat ?? 'no-repeat',\n        backgroundImageSize: config?.settings.customization.backgroundImageSize ?? 'cover',\n      },\n      gridstack: {\n        sm: config?.settings.customization.gridstack?.columnCountSmall ?? 3,\n        md: config?.settings.customization.gridstack?.columnCountMedium ?? 6,\n        lg: config?.settings.customization.gridstack?.columnCountLarge ?? 12,\n      },\n      pageMetadata: {\n        pageTitle: config?.settings.customization.pageTitle ?? '',\n        metaTitle: config?.settings.customization.metaTitle ?? '',\n        logoSrc: config?.settings.customization.logoImageUrl ?? '',\n        faviconSrc: config?.settings.customization.faviconUrl ?? '',\n      },\n    },\n    validate: i18nZodResolver(boardCustomizationSchema),\n    validateInputOnChange: true,\n    validateInputOnBlur: true,\n  });\n\n  const backToBoardHref = useBoardLink(`/board/${query.slug}`);\n\n  const handleSubmit = async (values: z.infer<typeof boardCustomizationSchema>) => {\n    if (isLoading) return;\n    showNotification({\n      id: notificationId,\n      title: t('notifications.pending.title'),\n      message: t('notifications.pending.message'),\n      loading: true,\n    });\n    await saveCustomization(\n      {\n        name: query.slug,\n        ...values,\n      },\n      {\n        onSettled() {\n          void utils.config.byName.invalidate({ name: query.slug });\n        },\n        onSuccess() {\n          updateNotification({\n            id: notificationId,\n            title: t('notifications.success.title'),\n            message: t('notifications.success.message'),\n            color: 'green',\n            icon: <IconCheck />,\n          });\n          form.resetDirty();\n        },\n        onError() {\n          updateNotification({\n            id: notificationId,\n            title: t('notifications.error.title'),\n            message: t('notifications.error.message'),\n            color: 'red',\n            icon: <IconX />,\n          });\n        },\n      }\n    );\n  };\n\n  const metaTitle = `${t('metaTitle', {\n    name: firstUpperCase(query.slug),\n  })} • Homarr`;\n\n  if (isError || error) {\n    return {\n      notFound: true,\n    };\n  }\n\n  return (\n    <MainLayout\n      contentComponents={\n        <Button\n          component={Link}\n          passHref\n          color={config?.settings.customization.colors.primary ?? 'red'}\n          href={backToBoardHref}\n          variant=\"light\"\n          leftIcon={<IconArrowLeft size={16} />}\n        >\n          {t('backToBoard')}\n        </Button>\n      }\n    >\n      <Head>\n        <title>{metaTitle}</title>\n      </Head>\n      <Affix position={{ bottom: rem(20), left: rem(20), right: rem(20) }}>\n        <Transition transition=\"slide-up\" mounted={form.isDirty()}>\n          {(transitionStyles) => (\n            <Card\n              style={transitionStyles}\n              sx={(theme) => ({\n                background:\n                  theme.colorScheme === 'dark' ? theme.colors.dark[8] : theme.colors.gray[1],\n              })}\n              shadow=\"md\"\n              withBorder\n            >\n              <Group position=\"apart\" noWrap>\n                <Text weight=\"bold\">{t('save.note')}</Text>\n                <Group spacing=\"md\">\n                  <Button\n                    onClick={() => {\n                      form.reset();\n                    }}\n                    variant=\"subtle\"\n                    type=\"button\"\n                  >\n                    {t('common:cancel')}\n                  </Button>\n                  <Button\n                    onClick={() => {\n                      if (!form.isValid()) {\n                        form.validate();\n                        return;\n                      }\n\n                      handleSubmit(form.values);\n                    }}\n                    loading={isLoading}\n                    color=\"green\"\n                  >\n                    {t('save.button')}\n                  </Button>\n                </Group>\n              </Group>\n            </Card>\n          )}\n        </Transition>\n      </Affix>\n      <Container pb=\"6rem\">\n        <Paper p=\"xl\" py=\"sm\" mih=\"100%\" withBorder>\n          <Stack>\n            <Group position=\"apart\">\n              <Title order={2}>\n                {t('pageTitle', {\n                  name: firstUpperCase(query.slug),\n                })}\n              </Title>\n            </Group>\n            <BoardCustomizationFormProvider form={form}>\n              <Stack spacing=\"xl\">\n                <Stack spacing=\"xs\">\n                  <SectionTitle type=\"layout\" icon={IconLayout} />\n                  <LayoutCustomization />\n                </Stack>\n                <Stack spacing=\"xs\">\n                  <SectionTitle type=\"access\" icon={IconLock} />\n                  <AccessCustomization />\n                </Stack>\n                <Stack spacing=\"xs\">\n                  <SectionTitle type=\"gridstack\" icon={IconDragDrop} />\n                  <GridstackCustomization />\n                </Stack>\n                <Stack spacing=\"xs\">\n                  <SectionTitle type=\"pageMetadata\" icon={IconChartCandle} />\n                  <PageMetadataCustomization />\n                </Stack>\n                <Stack spacing=\"xs\">\n                  <SectionTitle type=\"appereance\" icon={IconBrush} />\n                  <AppearanceCustomization />\n                </Stack>\n              </Stack>\n            </BoardCustomizationFormProvider>\n          </Stack>\n        </Paper>\n      </Container>\n    </MainLayout>\n  );\n}\n\ntype SectionTitleProps = {\n  type: 'layout' | 'gridstack' | 'pageMetadata' | 'appereance' | 'access';\n  icon: (props: TablerIconsProps) => ReactNode;\n};\n\nconst SectionTitle = ({ type, icon: Icon }: SectionTitleProps) => {\n  const { t } = useTranslation('settings/customization/general');\n\n  return (\n    <Stack spacing={0}>\n      <Group spacing=\"xs\">\n        <Icon size={16} />\n        <Title order={5}>{t(`accordeon.${type}.name`)}</Title>\n      </Group>\n      <Text color=\"dimmed\">{t(`accordeon.${type}.description`)}</Text>\n    </Stack>\n  );\n};\n\nconst routeParamsSchema = z.object({\n  slug: z.string(),\n});\n\nexport const getServerSideProps: GetServerSideProps = async (context) => {\n  const routeParams = routeParamsSchema.safeParse(context.params);\n  if (!routeParams.success) {\n    return {\n      notFound: true,\n    };\n  }\n\n  const session = await getServerAuthSession({ req: context.req, res: context.res });\n\n  const result = checkForSessionOrAskForLogin(\n    context,\n    session,\n    () => session?.user.isAdmin == true\n  );\n  if (result) {\n    return result;\n  }\n\n  const helpers = await createTrpcServersideHelpers({ req: context.req, res: context.res });\n  const caller = configRouter.createCaller({\n    session: session,\n    cookies: context.req.cookies,\n  });\n\n  let config: ConfigType;\n  try {\n    config = await caller.byName({ name: routeParams.data.slug });\n  } catch {\n    return {\n      notFound: true\n    };\n  }\n\n  const translations = await getServerSideTranslations(\n    [\n      'boards/customize',\n      'settings/common',\n      'settings/customization/general',\n      'settings/customization/page-appearance',\n      'settings/customization/shade-selector',\n      'settings/customization/opacity-selector',\n      'settings/customization/gridstack',\n      'settings/customization/access',\n    ],\n    context.locale,\n    context.req,\n    context.res\n  );\n\n  return {\n    props: {\n      initialConfig: config,\n      primaryColor: config.settings.customization.colors.primary,\n      secondaryColor: config.settings.customization.colors.secondary,\n      primaryShade: config.settings.customization.colors.shade,\n      trpcState: helpers.dehydrate(),\n      ...translations,\n    },\n  };\n};\n"
  },
  {
    "path": "src/pages/board/[slug].tsx",
    "content": "import { GetServerSidePropsContext, InferGetServerSidePropsType } from 'next';\nimport { z } from 'zod';\nimport { Dashboard } from '~/components/Dashboard/Dashboard';\nimport { BoardLayout } from '~/components/layout/Templates/BoardLayout';\nimport { useInitConfig } from '~/config/init';\nimport { dockerRouter } from '~/server/api/routers/docker/router';\nimport { getServerAuthSession } from '~/server/auth';\nimport { configExists } from '~/tools/config/configExists';\nimport { getFrontendConfig } from '~/tools/config/getFrontendConfig';\nimport { getServerSideTranslations } from '~/tools/server/getServerSideTranslations';\nimport { checkForSessionOrAskForLogin } from '~/tools/server/loginBuilder';\nimport { boardNamespaces } from '~/tools/server/translation-namespaces';\nimport { api } from '~/utils/api';\nimport { env } from 'process';\nimport fs from 'fs';\n\nexport default function BoardPage({\n  config: initialConfig,\n  isDockerEnabled: isDockerEnabled\n}: InferGetServerSidePropsType<typeof getServerSideProps>) {\n  useInitConfig(initialConfig);\n\n  return (\n    <BoardLayout isDockerEnabled={isDockerEnabled}>\n      <Dashboard />\n    </BoardLayout>\n  );\n}\n\nconst routeParamsSchema = z.object({\n  slug: z.string(),\n});\n\nexport const getServerSideProps = async (context: GetServerSidePropsContext) => {\n  const routeParams = routeParamsSchema.safeParse(context.params);\n  if (!routeParams.success) {\n    return {\n      notFound: true,\n    };\n  }\n\n  const isPresent = configExists(routeParams.data.slug);\n  if (!isPresent) {\n    return {\n      notFound: true,\n    };\n  }\n\n  const config = await getFrontendConfig(routeParams.data.slug);\n  const translations = await getServerSideTranslations(\n    boardNamespaces,\n    context.locale,\n    context.req,\n    context.res\n  );\n\n  const session = await getServerAuthSession({ req: context.req, res: context.res });\n\n  const result = checkForSessionOrAskForLogin(\n    context,\n    session,\n    () => config.settings.access.allowGuests || session?.user != undefined\n  );\n  if (result) {\n    return result;\n  }\n\n  const isDockerEnabled: boolean = !!env.DOCKER_HOST || !!env.DOCKER_PORT || fs.existsSync('/var/run/docker.sock');\n\n  return {\n    props: {\n      config,\n      primaryColor: config.settings.customization.colors.primary,\n      secondaryColor: config.settings.customization.colors.secondary,\n      primaryShade: config.settings.customization.colors.shade,\n      isDockerEnabled: isDockerEnabled,\n      ...translations,\n    },\n  };\n};\n"
  },
  {
    "path": "src/pages/board/index.tsx",
    "content": "import { GetServerSidePropsContext, InferGetServerSidePropsType } from 'next';\nimport { Dashboard } from '~/components/Dashboard/Dashboard';\nimport { BoardLayout } from '~/components/layout/Templates/BoardLayout';\nimport { useInitConfig } from '~/config/init';\nimport { getServerAuthSession } from '~/server/auth';\nimport { getDefaultBoardAsync } from '~/server/db/queries/userSettings';\nimport { getFrontendConfig } from '~/tools/config/getFrontendConfig';\nimport { getServerSideTranslations } from '~/tools/server/getServerSideTranslations';\nimport { checkForSessionOrAskForLogin } from '~/tools/server/loginBuilder';\nimport { boardNamespaces } from '~/tools/server/translation-namespaces';\nimport { api } from '~/utils/api';\nimport { env } from 'process';\nimport fs from 'fs';\n\nexport default function BoardPage({\n  config: initialConfig,\n  isDockerEnabled: isDockerEnabled,\n}: InferGetServerSidePropsType<typeof getServerSideProps>) {\n  useInitConfig(initialConfig);\n\n  return (\n    <BoardLayout isDockerEnabled={isDockerEnabled}>\n      <Dashboard />\n    </BoardLayout>\n  );\n}\n\nexport const getServerSideProps = async (context: GetServerSidePropsContext) => {\n  const session = await getServerAuthSession(context);\n  const boardName = await getDefaultBoardAsync(session?.user?.id, 'default');\n\n  const translations = await getServerSideTranslations(\n    boardNamespaces,\n    context.locale,\n    context.req,\n    context.res\n  );\n  const config = await getFrontendConfig(boardName);\n\n  const result = checkForSessionOrAskForLogin(\n    context,\n    session,\n    () => config.settings.access.allowGuests || session?.user != undefined\n  );\n  if (result) {\n    return result;\n  }\n\n  const isDockerEnabled: boolean = !!env.DOCKER_HOST || !!env.DOCKER_PORT || fs.existsSync('/var/run/docker.sock');\n\n  return {\n    props: {\n      config,\n      primaryColor: config.settings.customization.colors.primary,\n      secondaryColor: config.settings.customization.colors.secondary,\n      primaryShade: config.settings.customization.colors.shade,\n      isDockerEnabled: isDockerEnabled,\n      ...translations,\n    },\n  };\n};\n"
  },
  {
    "path": "src/pages/manage/about.tsx",
    "content": "import {\n  Accordion,\n  ActionIcon,\n  Anchor,\n  Badge,\n  createStyles,\n  Divider,\n  Group,\n  HoverCard,\n  Kbd,\n  Stack,\n  Table,\n  Text,\n} from '@mantine/core';\nimport { IconAnchor, IconKey, IconLanguage, IconSchema, IconVersions, IconVocabulary } from '@tabler/icons-react';\nimport { useQuery } from '@tanstack/react-query';\nimport { InitOptions } from 'i18next';\nimport { GetServerSidePropsContext } from 'next';\nimport { i18n, Trans, useTranslation } from 'next-i18next';\nimport Head from 'next/head';\nimport { ReactNode } from 'react';\nimport { ManageLayout } from '~/components/layout/Templates/ManageLayout';\nimport { Contributors, ContributorsTable } from '~/components/layout/header/About/Contributors';\nimport Credits from '~/components/layout/header/About/Credits';\nimport Tip from '~/components/layout/header/About/Tip';\nimport { TranslatorsTable } from '~/components/layout/header/About/Translators';\nimport { useConfigContext } from '~/config/provider';\nimport { usePackageAttributesStore } from '~/tools/client/zustands/usePackageAttributesStore';\nimport { useColorTheme } from '~/tools/color';\nimport { getServerSideTranslations } from '~/tools/server/getServerSideTranslations';\n\nimport { REPO_URL } from '../../../data/constants';\n\ninterface InformationTableItem {\n  icon: ReactNode;\n  label: string;\n  content: ReactNode;\n}\n\ninterface ExtendedInitOptions extends InitOptions {\n  locales: string[];\n}\n\nconst useInformationTableItems = (newVersionAvailable?: string): InformationTableItem[] => {\n  const { attributes } = usePackageAttributesStore();\n  const { primaryColor } = useColorTheme();\n  const { t } = useTranslation(['layout/modals/about']);\n\n  const { configVersion } = useConfigContext();\n\n  let items: InformationTableItem[] = [];\n\n  if (i18n?.reportNamespaces) {\n    const usedI18nNamespaces = i18n.reportNamespaces.getUsedNamespaces();\n    const initOptions = i18n.options as ExtendedInitOptions;\n\n    items = [\n      ...items,\n      {\n        icon: <IconLanguage size={20} />,\n        label: 'i18n',\n        content: (\n          <Badge variant=\"light\" color={primaryColor}>\n            {usedI18nNamespaces.length}\n          </Badge>\n        ),\n      },\n      {\n        icon: <IconVocabulary size={20} />,\n        label: 'locales',\n        content: (\n          <Badge variant=\"light\" color={primaryColor}>\n            {initOptions.locales.length}\n          </Badge>\n        ),\n      },\n    ];\n  }\n\n  items = [\n    {\n      icon: <IconSchema size={20} />,\n      label: 'configurationSchemaVersion',\n      content: (\n        <Badge variant=\"light\" color={primaryColor}>\n          {configVersion}\n        </Badge>\n      ),\n    },\n    {\n      icon: <IconVersions size={20} />,\n      label: 'version',\n      content: (\n        <Group position=\"right\">\n          <Badge variant=\"light\" color={primaryColor}>\n            {attributes.packageVersion ?? 'Unknown'}\n          </Badge>\n          {newVersionAvailable && (\n            <HoverCard shadow=\"md\" position=\"top\" withArrow>\n              <HoverCard.Target>\n                <Badge color=\"teal\" variant=\"light\">\n                  {t('version.new', { newVersion: newVersionAvailable })}\n                </Badge>\n              </HoverCard.Target>\n              <HoverCard.Dropdown>\n                <Text>\n                  {\n                    t('version.dropdown', { currentVersion: attributes.packageVersion }).split(\n                      '{{newVersion}}'\n                    )[0]\n                  }\n                  <b>\n                    <Anchor\n                      target=\"_blank\"\n                      href={`https://github.com/ajnart/homarr/releases/tag/${newVersionAvailable}`}\n                    >\n                      {newVersionAvailable}\n                    </Anchor>\n                  </b>\n                  {\n                    t('version.dropdown', { currentVersion: attributes.packageVersion }).split(\n                      '{{newVersion}}'\n                    )[1]\n                  }\n                </Text>\n              </HoverCard.Dropdown>\n            </HoverCard>\n          )}\n        </Group>\n      ),\n    },\n    {\n      icon: <IconAnchor size={20} />,\n      label: 'nodeEnvironment',\n      content: (\n        <Badge variant=\"light\" color={primaryColor}>\n          {attributes.environment}\n        </Badge>\n      ),\n    },\n    ...items,\n  ];\n\n  return items;\n};\n\nconst useStyles = createStyles(() => ({\n  informationTableColumn: {\n    textAlign: 'right',\n  },\n  informationIcon: {\n    cursor: 'default',\n  },\n}));\n\nexport const Page = ({ contributors }: { contributors: Contributors[] }) => {\n  const { data } = useQuery({\n    queryKey: ['github/latest'],\n    cacheTime: 1000 * 60 * 60 * 24,\n    staleTime: 1000 * 60 * 60 * 5,\n    queryFn: () =>\n      fetch(`https://api.github.com/repos/${REPO_URL}/releases/latest`, {\n        cache: 'force-cache',\n      }).then((res) => res.json()),\n  });\n  const { attributes } = usePackageAttributesStore();\n  if (!i18n) {\n    return;\n  }\n  const initOptions = i18n.options as ExtendedInitOptions;\n\n  const newVersionAvailable =\n    data?.tag_name > `v${attributes.packageVersion}` ? data?.tag_name : undefined;\n  const informations = useInformationTableItems(newVersionAvailable);\n  const { t } = useTranslation(['layout/modals/about']);\n  const { classes } = useStyles();\n\n  const keybinds = [\n    { key: 'Mod + J', shortcut: t('layout/modals/about:actions.toggleTheme') },\n    { key: 'Mod + K', shortcut: t('layout/modals/about:actions.focusSearchBar') },\n    { key: 'Mod + B', shortcut: t('layout/modals/about:actions.openDocker') },\n    { key: 'Mod + E', shortcut: t('layout/modals/about:actions.toggleEdit') },\n  ];\n  const rows = keybinds.map((element) => (\n    <tr key={element.key}>\n      <td>\n        <Kbd>{element.key}</Kbd>\n      </td>\n      <td>\n        <Text>{element.shortcut}</Text>\n      </td>\n    </tr>\n  ));\n\n  return (\n    <ManageLayout>\n      <Head>\n        <title>About • Homarr</title>\n      </Head>\n      <Stack>\n        <Text>\n          <Trans i18nKey=\"layout/modals/about:description\" />\n        </Text>\n\n        <Table withBorder>\n          <tbody>\n            {informations.map((item, index) => (\n              <tr key={index}>\n                <td>\n                  <Group spacing=\"xs\">\n                    <ActionIcon className={classes.informationIcon} variant=\"default\">\n                      {item.icon}\n                    </ActionIcon>\n                    <Text>\n                      <Trans\n                        i18nKey={`layout/modals/about:metrics.${item.label}`}\n                        components={{ b: <b /> }}\n                      />\n                    </Text>\n                  </Group>\n                </td>\n                <td className={classes.informationTableColumn} style={{ maxWidth: 200 }}>\n                  {item.content}\n                </td>\n              </tr>\n            ))}\n          </tbody>\n        </Table>\n        <Accordion mb={5} variant=\"contained\" radius=\"md\">\n          <Accordion.Item value=\"keybinds\">\n            <Accordion.Control icon={<IconKey size={20} />}>\n              {t('layout/modals/about:keybinds')}\n            </Accordion.Control>\n            <Accordion.Panel>\n              <Table mb={5}>\n                <thead>\n                  <tr>\n                    <th>{t('layout/modals/about:key')}</th>\n                    <th>{t('layout/modals/about:action')}</th>\n                  </tr>\n                </thead>\n                <tbody>{rows}</tbody>\n              </Table>\n              <Tip>{t('layout/modals/about:tip')}</Tip>\n            </Accordion.Panel>\n          </Accordion.Item>\n        </Accordion>\n\n        <TranslatorsTable loadedLanguages={initOptions.locales.length} />\n        <Divider />\n        <ContributorsTable contributors={contributors} />\n        <Credits />\n      </Stack>\n    </ManageLayout>\n  );\n};\n\nexport async function getServerSideProps(ctx: GetServerSidePropsContext) {\n  const contributors = (await fetch(\n    `https://api.github.com/repos/${REPO_URL}/contributors?per_page=100`,\n    {\n      cache: 'force-cache',\n    }\n  ).then((res) => res.json())) as Contributors[];\n  return {\n    props: {\n      contributors,\n      ...(await getServerSideTranslations(\n        ['layout/manage', 'manage/index'],\n        ctx.locale,\n        ctx.req,\n        ctx.res\n      )),\n    },\n  };\n}\n\nexport default Page;\n"
  },
  {
    "path": "src/pages/manage/boards/index.tsx",
    "content": "import {\n  ActionIcon,\n  Badge,\n  Button,\n  Card,\n  Group,\n  LoadingOverlay,\n  Menu,\n  Modal,\n  SimpleGrid,\n  Stack,\n  Text,\n  Title,\n} from '@mantine/core';\nimport { useDisclosure, useListState } from '@mantine/hooks';\nimport { notifications } from '@mantine/notifications';\nimport {\n  IconBox,\n  IconCategory,\n  IconCopy,\n  IconCursorText,\n  IconDeviceFloppy,\n  IconDotsVertical,\n  IconDownload,\n  IconFolderFilled,\n  IconLock,\n  IconLockOff,\n  IconPlus,\n  IconStack,\n  IconStarFilled,\n  IconTrash,\n} from '@tabler/icons-react';\nimport { GetServerSidePropsContext, InferGetServerSidePropsType } from 'next';\nimport { useTranslation } from 'next-i18next';\nimport Head from 'next/head';\nimport Link from 'next/link';\nimport { useState } from 'react';\nimport { RenameBoardModal } from '~/components/Dashboard/Modals/RenameBoard/RenameBoardModal';\nimport { openCreateBoardModal } from '~/components/Manage/Board/create-board.modal';\nimport { openDeleteBoardModal } from '~/components/Manage/Board/delete-board.modal';\nimport { ManageLayout } from '~/components/layout/Templates/ManageLayout';\nimport { boardRouter } from '~/server/api/routers/board';\nimport { getServerAuthSession } from '~/server/auth';\nimport { sleep } from '~/tools/client/time';\nimport { getServerSideTranslations } from '~/tools/server/getServerSideTranslations';\nimport { checkForSessionOrAskForLogin } from '~/tools/server/loginBuilder';\nimport { manageNamespaces } from '~/tools/server/translation-namespaces';\nimport { api } from '~/utils/api';\n\n// Infer return type from the `getServerSideProps` function\nexport default function BoardsPage({\n  boards,\n  session,\n}: InferGetServerSidePropsType<typeof getServerSideProps>) {\n  const [openedRenameBoardModal, { open: openRenameBoardModal, close: closeRenameBoardModal }] =\n    useDisclosure(false);\n  const [renameBoardName, setRenameBoardName] = useState<{ boardName: string }>();\n\n  const { data, refetch } = api.boards.all.useQuery(undefined, {\n    initialData: boards,\n    cacheTime: 1000 * 60 * 5, // Cache for 5 minutes\n  });\n  const { mutateAsync } = api.user.makeDefaultDashboard.useMutation({\n    onSettled: () => {\n      void refetch();\n    },\n  });\n\n  const utils = api.useUtils();\n\n  const { mutateAsync: mutateDuplicateBoardAsync } = api.boards.duplicateBoard.useMutation({\n    onSettled: () => {\n      void utils.boards.all.invalidate();\n    },\n    onError: (error) => {\n      notifications.show({\n        title: 'An error occurred while duplicating',\n        message: error.message,\n      });\n    },\n  });\n\n  const [deletingDashboards, { append, filter }] = useListState<string>([]);\n  const downloadAllBoards = async () => {\n    const a = document.createElement('a');\n    a.href = `/api/download`;\n    a.click();\n  };\n\n  const { t } = useTranslation('manage/boards');\n\n  const metaTitle = `${t('metaTitle')} • Homarr`;\n\n  return (\n    <ManageLayout>\n      <Head>\n        <title>{metaTitle}</title>\n      </Head>\n\n      <Modal\n        opened={openedRenameBoardModal}\n        onClose={closeRenameBoardModal}\n        title={t('cards.menu.rename.modal.title', { name: renameBoardName?.boardName })}\n      >\n        <RenameBoardModal\n          boardName={renameBoardName?.boardName as string}\n          configNames={data.map((board) => board.name)}\n          onClose={closeRenameBoardModal}\n        />\n      </Modal>\n\n      <Group position=\"apart\">\n        <Title mb=\"xl\">{t('pageTitle')}</Title>\n        {session?.user.isAdmin && (\n          <Group>\n            <Button\n              variant=\"outline\"\n              onClick={downloadAllBoards}\n              leftIcon={<IconDownload size=\"1rem\" />}\n            >\n              Download all boards\n            </Button>\n            <Button\n              onClick={openCreateBoardModal}\n              leftIcon={<IconPlus size=\"1rem\" />}\n              variant=\"default\"\n            >\n              {t('buttons.create')}\n            </Button>\n          </Group>\n        )}\n      </Group>\n\n      <SimpleGrid\n        cols={3}\n        spacing=\"lg\"\n        breakpoints={[\n          { maxWidth: '62rem', cols: 2, spacing: 'lg' },\n          { maxWidth: '48rem', cols: 1, spacing: 'lg' },\n        ]}\n      >\n        {data.map((board, index) => (\n          <Card key={index} shadow=\"sm\" padding=\"lg\" radius=\"md\" pos=\"relative\" withBorder>\n            <LoadingOverlay visible={deletingDashboards.includes(board.name)} />\n\n            <Group mb=\"xl\" position=\"apart\" noWrap>\n              <Text weight={500} mb=\"xs\">\n                {board.name}\n              </Text>\n              <Group spacing=\"xs\" noWrap>\n                <Badge leftSection={<IconFolderFilled size=\".7rem\" />} color=\"pink\" variant=\"light\">\n                  {t('cards.badges.fileSystem')}\n                </Badge>\n                <Badge\n                  leftSection={\n                    board.allowGuests ? <IconLock size=\".7rem\" /> : <IconLockOff size=\".7rem\" />\n                  }\n                  color=\"green\"\n                  variant=\"light\"\n                >\n                  {board.allowGuests ? t('common:public') : t('common:restricted')}\n                </Badge>\n                {board.isDefaultForUser && (\n                  <Badge\n                    leftSection={<IconStarFilled size=\".7rem\" />}\n                    color=\"yellow\"\n                    variant=\"light\"\n                  >\n                    {t('cards.badges.default')}\n                  </Badge>\n                )}\n              </Group>\n            </Group>\n\n            <Stack spacing={3}>\n              <Group position=\"apart\">\n                <Group spacing=\"xs\">\n                  <IconBox opacity={0.7} size=\"1rem\" />\n                  <Text color=\"dimmed\">{t('cards.statistics.apps')}</Text>\n                </Group>\n                <Text>{board.countApps}</Text>\n              </Group>\n\n              <Group position=\"apart\">\n                <Group spacing=\"xs\">\n                  <IconStack opacity={0.7} size=\"1rem\" />\n                  <Text color=\"dimmed\">{t('cards.statistics.widgets')}</Text>\n                </Group>\n                <Text>{board.countWidgets}</Text>\n              </Group>\n\n              <Group position=\"apart\">\n                <Group spacing=\"xs\">\n                  <IconCategory opacity={0.7} size=\"1rem\" />\n                  <Text color=\"dimmed\">{t('cards.statistics.categories')}</Text>\n                </Group>\n                <Text>{board.countCategories}</Text>\n              </Group>\n            </Stack>\n\n            <Group mt=\"md\">\n              <Button\n                component={Link}\n                style={{ flexGrow: 1 }}\n                variant=\"default\"\n                color=\"blue\"\n                radius=\"md\"\n                href={`/board/${board.name}`}\n              >\n                {t('cards.buttons.view')}\n              </Button>\n              <Menu width={240} withinPortal position=\"bottom-end\">\n                <Menu.Target>\n                  <ActionIcon h={34} w={34} variant=\"default\">\n                    <IconDotsVertical size=\"1rem\" />\n                  </ActionIcon>\n                </Menu.Target>\n                <Menu.Dropdown>\n                  <Menu.Item\n                    onClick={async () => {\n                      await mutateDuplicateBoardAsync({\n                        boardName: board.name,\n                      });\n                    }}\n                    icon={<IconCopy size={'1rem'} />}\n                  >\n                    {t('cards.menu.duplicate')}\n                  </Menu.Item>\n                  <Menu.Item\n                    onClick={() => {\n                      setRenameBoardName({\n                        boardName: board.name as string,\n                      });\n                      openRenameBoardModal();\n                    }}\n                    icon={<IconCursorText size={'1rem'} />}\n                    disabled={board.name === 'default'}\n                  >\n                    {t('cards.menu.rename.label')}\n                  </Menu.Item>\n                  <Menu.Item\n                    icon={<IconDeviceFloppy size=\"1rem\" />}\n                    onClick={async () => {\n                      void mutateAsync({\n                        board: board.name,\n                      });\n                    }}\n                  >\n                    <Text size=\"sm\">{t('cards.menu.setAsDefault')}</Text>\n                  </Menu.Item>\n                  {session?.user.isAdmin && (\n                    <>\n                      <Menu.Item\n                        onClick={async () => {\n                          openDeleteBoardModal({\n                            boardName: board.name,\n                            onConfirm: async () => {\n                              append(board.name);\n                              // give user feedback, that it's being deleted\n                              await sleep(500);\n                              filter((item, _) => item !== board.name);\n                            },\n                          });\n                        }}\n                        disabled={board.name === 'default'}\n                        icon={<IconTrash size=\"1rem\" />}\n                        color=\"red\"\n                      >\n                        <Text size=\"sm\">{t('cards.menu.delete.label')}</Text>\n                        {board.name === 'default' && (\n                          <Text size=\"xs\">{t('cards.menu.delete.disabled')}</Text>\n                        )}\n                      </Menu.Item>\n                    </>\n                  )}\n                </Menu.Dropdown>\n              </Menu>\n            </Group>\n          </Card>\n        ))}\n      </SimpleGrid>\n    </ManageLayout>\n  );\n}\n\nexport const getServerSideProps = async (context: GetServerSidePropsContext) => {\n  const session = await getServerAuthSession({ req: context.req, res: context.res });\n  const result = checkForSessionOrAskForLogin(\n    context,\n    session,\n    () => session?.user.isAdmin == true\n  );\n  if (result !== undefined) {\n    return result;\n  }\n\n  const caller = boardRouter.createCaller({\n    session: session,\n    cookies: context.req.cookies,\n  });\n\n  const boards = await caller.all();\n\n  const translations = await getServerSideTranslations(\n    manageNamespaces,\n    context.locale,\n    context.req,\n    context.res\n  );\n\n  return {\n    props: {\n      boards,\n      session,\n      ...translations,\n    },\n  };\n};\n"
  },
  {
    "path": "src/pages/manage/index.tsx",
    "content": "import { Box, Card, createStyles, Group, Image, SimpleGrid, Stack, Text, Title, UnstyledButton } from '@mantine/core';\nimport { IconArrowRight } from '@tabler/icons-react';\nimport { GetServerSideProps } from 'next';\nimport { useSession } from 'next-auth/react';\nimport { useTranslation } from 'next-i18next';\nimport Head from 'next/head';\nimport Link from 'next/link';\nimport { ManageLayout } from '~/components/layout/Templates/ManageLayout';\nimport { useScreenLargerThan } from '~/hooks/useScreenLargerThan';\nimport { getServerAuthSession } from '~/server/auth';\nimport { getServerSideTranslations } from '~/tools/server/getServerSideTranslations';\nimport { OnlyKeysWithStructure } from '~/types/helpers';\n\nimport { type quickActions } from '../../../public/locales/en/manage/index.json';\nimport { checkForSessionOrAskForLogin } from '~/tools/server/loginBuilder';\n\nconst ManagementPage = () => {\n  const { t } = useTranslation('manage/index');\n  const { classes } = useStyles();\n  const largerThanMd = useScreenLargerThan('md');\n  const { data: sessionData } = useSession();\n\n  const metaTitle = `${t('metaTitle')} • Homarr`;\n  return (\n    <ManageLayout>\n      <Head>\n        <title>{metaTitle}</title>\n      </Head>\n      <Box className={classes.box} w=\"100%\" mih={150} p=\"xl\" mb={50}>\n        <Group position=\"apart\" noWrap>\n          <Stack spacing={15}>\n            <Title className={classes.boxTitle} order={2}>\n              {t('hero.title', {\n                username: sessionData?.user?.name ?? t('hero.fallbackUsername'),\n              })}\n            </Title>\n            <Text>{t('hero.subtitle')}</Text>\n          </Stack>\n          <Box bg=\"blue\" w={100} h=\"100%\" pos=\"relative\">\n            <Box\n              pos=\"absolute\"\n              bottom={largerThanMd ? -100 : undefined}\n              top={largerThanMd ? undefined : -120}\n              right={largerThanMd ? 0 : -40}\n            >\n              <Image\n                src=\"/imgs/logo/logo.png\"\n                width={largerThanMd ? 200 : 100}\n                height={largerThanMd ? 150 : 60}\n                alt=\"Homarr Logo\"\n              />\n            </Box>\n          </Box>\n        </Group>\n      </Box>\n\n      <Text weight=\"bold\" mb=\"md\">\n        {t('quickActions.title')}\n      </Text>\n      <SimpleGrid\n        cols={3}\n        spacing=\"xl\"\n        breakpoints={[\n          { maxWidth: '62rem', cols: 2, spacing: 'lg' },\n          { maxWidth: '48rem', cols: 1, spacing: 'md' },\n        ]}\n      >\n        <QuickActionCard type=\"boards\" href=\"/manage/boards\" />\n        <QuickActionCard type=\"inviteUsers\" href=\"/manage/users/invites\" />\n        <QuickActionCard type=\"manageUsers\" href=\"/manage/users\" />\n      </SimpleGrid>\n    </ManageLayout>\n  );\n};\n\ntype QuickActionType = OnlyKeysWithStructure<\n  typeof quickActions,\n  {\n    title: string;\n    subtitle: string;\n  }\n>;\n\ntype QuickActionCardProps = {\n  type: QuickActionType;\n  href: string;\n};\n\nconst QuickActionCard = ({ type, href }: QuickActionCardProps) => {\n  const { t } = useTranslation('manage/index');\n  const { classes } = useStyles();\n\n  return (\n    <UnstyledButton component={Link} href={href}>\n      <Card className={classes.quickActionCard}>\n        <Group position=\"apart\" noWrap>\n          <Stack spacing={0}>\n            <Text weight={500}>{t(`quickActions.${type}.title`)}</Text>\n            <Text>{t(`quickActions.${type}.subtitle`)}</Text>\n          </Stack>\n          <IconArrowRight />\n        </Group>\n      </Card>\n    </UnstyledButton>\n  );\n};\n\nexport const getServerSideProps: GetServerSideProps = async (ctx) => {\n  const session = await getServerAuthSession(ctx);\n\n  const result = checkForSessionOrAskForLogin(ctx, session, () => true);\n  if (result) {\n    return result;\n  }\n\n  const translations = await getServerSideTranslations(\n    ['layout/manage', 'manage/index'],\n    ctx.locale,\n    ctx.req,\n    ctx.res\n  );\n  return {\n    props: {\n      ...translations,\n    },\n  };\n};\n\nexport default ManagementPage;\n\nconst useStyles = createStyles((theme) => ({\n  box: {\n    borderRadius: theme.radius.md,\n    backgroundColor:\n      theme.colorScheme === 'dark' ? theme.fn.rgba(theme.colors.red[8], 0.1) : theme.colors.red[1],\n  },\n  boxTitle: {\n    color: theme.colors.red[6],\n  },\n  quickActionCard: {\n    height: '100%',\n    backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[6] : theme.colors.gray[2],\n    '&:hover': {\n      backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[5] : theme.colors.gray[3],\n    },\n  },\n}));\n"
  },
  {
    "path": "src/pages/manage/tools/docker.tsx",
    "content": "import { Alert, Stack, Title } from '@mantine/core';\nimport { IconInfoCircle } from '@tabler/icons-react';\nimport Consola from 'consola';\nimport { ContainerInfo } from 'dockerode';\nimport { GetServerSideProps, InferGetServerSidePropsType } from 'next';\nimport { useTranslation } from 'next-i18next';\nimport { useState } from 'react';\nimport ContainerActionBar from '~/components/Manage/Tools/Docker/ContainerActionBar';\nimport ContainerTable from '~/components/Manage/Tools/Docker/ContainerTable';\nimport { ManageLayout } from '~/components/layout/Templates/ManageLayout';\nimport { dockerRouter } from '~/server/api/routers/docker/router';\nimport { getServerAuthSession } from '~/server/auth';\nimport { getServerSideTranslations } from '~/tools/server/getServerSideTranslations';\nimport { checkForSessionOrAskForLogin } from '~/tools/server/loginBuilder';\nimport { boardNamespaces } from '~/tools/server/translation-namespaces';\nimport { api } from '~/utils/api';\n\nexport default function DockerPage({\n  initialContainers,\n  dockerIsConfigured,\n}: InferGetServerSidePropsType<typeof getServerSideProps>) {\n  const [selection, setSelection] = useState<ContainerInfo[]>([]);\n  const { data, refetch, isRefetching } = api.docker.containers.useQuery(undefined, {\n    initialData: initialContainers,\n    cacheTime: 60 * 1000 * 5,\n    staleTime: 60 * 1000 * 1,\n    enabled: dockerIsConfigured,\n  });\n\n  const { t } = useTranslation('tools/docker');\n\n  const reload = () => {\n    refetch();\n    setSelection([]);\n  };\n\n  if (!dockerIsConfigured) {\n    return (\n      <ManageLayout>\n        <Title mb=\"lg\">{t('title')}</Title>\n        <Alert icon={<IconInfoCircle size=\"1rem\" />} color=\"blue\">\n          {t('alerts.notConfigured.text')}\n        </Alert>\n      </ManageLayout>\n    );\n  }\n\n  return (\n    <ManageLayout>\n      <Stack>\n        <ContainerActionBar selected={selection} reload={reload} isLoading={isRefetching} />\n        <ContainerTable containers={data ?? []} selection={selection} setSelection={setSelection} />\n      </Stack>\n    </ManageLayout>\n  );\n}\n\nexport const getServerSideProps: GetServerSideProps = async (context) => {\n  const session = await getServerAuthSession({ req: context.req, res: context.res });\n  const result = checkForSessionOrAskForLogin(context, session, () => session?.user.isAdmin == true);\n  if (result) {\n    return result;\n  }\n\n  const caller = dockerRouter.createCaller({\n    session: session,\n    cookies: context.req.cookies,\n  });\n\n  const translations = await getServerSideTranslations(\n    [...boardNamespaces, 'layout/manage', 'tools/docker'],\n    context.locale,\n    context.req,\n    context.res\n  );\n\n  let containers = [];\n  try {\n    containers = await caller.containers();\n  } catch (error) {\n    Consola.error(`The docker integration failed with the following error: ${error}`);\n    return {\n      props: {\n        dockerIsConfigured: false,\n        ...translations,\n      },\n    };\n  }\n\n  return {\n    props: {\n      initialContainers: containers,\n      dockerIsConfigured: true,\n      ...translations,\n    },\n  };\n};\n"
  },
  {
    "path": "src/pages/manage/tools/migrate.tsx",
    "content": "import {\n  Alert,\n  Button,\n  Checkbox,\n  CopyButton,\n  Input,\n  Modal,\n  PasswordInput,\n  Stack,\n  Text,\n  Title,\n} from '@mantine/core';\nimport { GetServerSideProps } from 'next';\nimport { useTranslation } from 'next-i18next';\nimport Head from 'next/head';\nimport { useState } from 'react';\nimport { ManageLayout } from '~/components/layout/Templates/ManageLayout';\nimport { getServerAuthSession } from '~/server/auth';\nimport { getServerSideTranslations } from '~/tools/server/getServerSideTranslations';\nimport { checkForSessionOrAskForLogin } from '~/tools/server/loginBuilder';\nimport { api } from '~/utils/api';\n\n/**\n * 1. Send selected options to the server\n * 2. Create a download token and send it back to the client\n * 3. Client downloads the ZIP file\n * 4. Client shows the encryption key in a modal\n */\n\nconst ManagementPage = () => {\n  const { t } = useTranslation('manage/migrate');\n  const metaTitle = `${t('metaTitle')} • Homarr`;\n  const { mutateAsync } = api.migrate.createToken.useMutation();\n  const [options, setOptions] = useState({\n    boards: true,\n    integrations: true,\n    users: true,\n  });\n  const [token, setToken] = useState<string | null>(null);\n  const [opened, setOpened] = useState(false);\n  const onClick = async () => {\n    await mutateAsync(options, {\n      onSuccess: (token) => {\n        // Download ZIP file\n        const link = document.createElement('a');\n        const baseUrl = window.location.origin;\n        link.href = `${baseUrl}/api/migrate?token=${token}`;\n        link.download = 'migration.zip';\n        link.click();\n\n        // Token is only needed when exporting users or integrations\n        if (options.users || options.integrations) {\n          setToken(token);\n          setOpened(true);\n        }\n      },\n    });\n  };\n\n  return (\n    <ManageLayout>\n      <Head>\n        <title>{metaTitle}</title>\n      </Head>\n\n      <Stack>\n        <Title order={1}>{t('pageTitle')}</Title>\n        <Text>{t('description')}</Text>\n\n        <Alert color=\"blue\" title={t('securityNote.title')}>\n          {t('securityNote.text')}\n        </Alert>\n\n        <Input.Wrapper label={t('form.label')}>\n          <Stack ml=\"md\" mt=\"md\">\n            <Checkbox\n              label={t('form.option.boards.label')}\n              checked={options.boards}\n              onChange={(event) =>\n                setOptions((prev) => ({\n                  ...prev,\n                  boards: event.target.checked,\n                  integrations: false,\n                }))\n              }\n            />\n            <Checkbox\n              label={t('form.option.integrations.label')}\n              disabled={!options.boards}\n              checked={options.integrations}\n              onChange={(event) =>\n                setOptions((prev) => ({ ...prev, integrations: event.target.checked }))\n              }\n              description={t('form.option.integrations.description')}\n            />\n            <Checkbox\n              label={t('form.option.users.label')}\n              checked={options.users}\n              onChange={(event) => setOptions((prev) => ({ ...prev, users: event.target.checked }))}\n              description={t('form.option.users.description')}\n            />\n          </Stack>\n        </Input.Wrapper>\n\n        <Button onClick={onClick}>{t('action.export')}</Button>\n      </Stack>\n\n      <Modal opened={opened} onClose={() => setOpened(false)} title={t('modal.title')}>\n        {token && (\n          <Stack>\n            <Text>{t('modal.description')}</Text>\n            <PasswordInput value={token} />\n            <CopyButton value={token}>\n              {({ copy }) => (\n                <Button\n                  onClick={() => {\n                    copy();\n                    setToken(null);\n                    setOpened(false);\n                  }}\n                >\n                  {t('modal.copyDismiss')}\n                </Button>\n              )}\n            </CopyButton>\n          </Stack>\n        )}\n      </Modal>\n    </ManageLayout>\n  );\n};\n\nexport const getServerSideProps: GetServerSideProps = async (ctx) => {\n  const session = await getServerAuthSession(ctx);\n\n  const result = checkForSessionOrAskForLogin(ctx, session, () => Boolean(session?.user.isAdmin));\n  if (result) {\n    return result;\n  }\n\n  const translations = await getServerSideTranslations(\n    ['layout/manage', 'manage/migrate'],\n    ctx.locale,\n    ctx.req,\n    ctx.res\n  );\n  return {\n    props: {\n      ...translations,\n    },\n  };\n};\n\nexport default ManagementPage;\n"
  },
  {
    "path": "src/pages/manage/tools/swagger.tsx",
    "content": "import { GetServerSidePropsContext } from 'next';\nimport dynamic from 'next/dynamic';\nimport 'swagger-ui-react/swagger-ui.css';\nimport React, { useEffect } from 'react';\nimport { ManageLayout } from '~/components/layout/Templates/ManageLayout';\nimport { getServerSideTranslations } from '~/tools/server/getServerSideTranslations';\nimport Head from 'next/head';\nimport { ActionIcon, Button, Group, Text, TextInput, Title, Tooltip, useMantineTheme } from '@mantine/core';\nimport { IconCopy, IconLockAccess } from '@tabler/icons-react';\nimport { useClipboard, useDisclosure } from '@mantine/hooks';\nimport Cookies from 'cookies';\nimport { getServerAuthSession } from '~/server/auth';\nimport { checkForSessionOrAskForLogin } from '~/tools/server/loginBuilder';\n\nconst SwaggerUI = dynamic(() => import('swagger-ui-react'), { ssr: false });\n\nconst SwaggerApiPage = ({ authenticationToken }: { authenticationToken: string }) => {\n  const [accessTokenRevealed, { toggle: toggleAccessTokenReveal, close: hideAccessToken }] = useDisclosure(false);\n  const clipboard = useClipboard({ timeout: 2500 });\n\n  useEffect(() => {\n    if (clipboard.copied) {\n      return;\n    }\n\n    hideAccessToken();\n  }, [clipboard.copied]);\n\n  const theme = useMantineTheme();\n\n  return <ManageLayout>\n    <Head>\n      <title>API • Homarr</title>\n    </Head>\n\n    <Title mb={'md'}>API</Title>\n    <Text mb={'xl'}>Advanced users can use the API to interface with Homarr. The documentation is completely local,\n      interactive\n      and complies with the Open API standard. Any compatible client can import for easy usage.</Text>\n\n\n    <Group>\n      <Button onClick={toggleAccessTokenReveal} leftIcon={<IconLockAccess size={'1rem'} />} variant={'light'}>\n        Show your personal access token\n      </Button>\n      {accessTokenRevealed && (\n        <TextInput\n          rightSection={\n            <Tooltip opened={clipboard.copied} label={\"Copied\"}>\n              <ActionIcon\n                onClick={() => {\n                  clipboard.copy(authenticationToken);\n                }}>\n                <IconCopy size={'1rem'} />\n              </ActionIcon>\n            </Tooltip>}\n          value={authenticationToken} />\n      )}\n    </Group>\n\n    <div data-color-scheme={theme.colorScheme} className={\"open-api-container\"}>\n      <SwaggerUI url=\"/api/openapi.json\" />\n    </div>\n  </ManageLayout>;\n};\n\nexport async function getServerSideProps(ctx: GetServerSidePropsContext) {\n\n  const session = await getServerAuthSession(ctx);\n  const result = checkForSessionOrAskForLogin(ctx, session, () => true);\n  if (result) {\n    return result;\n  }\n\n  // Create a cookies instance\n  const cookies = new Cookies(ctx.req, ctx.res);\n\n  const authenticationToken = cookies.get('next-auth.session-token');\n\n  return {\n    props: {\n      authenticationToken: authenticationToken,\n      ...(await getServerSideTranslations(\n        ['layout/manage', 'manage/index'],\n        ctx.locale,\n        ctx.req,\n        ctx.res,\n      )),\n    },\n  };\n}\n\nexport default SwaggerApiPage;"
  },
  {
    "path": "src/pages/manage/users/[userId]/edit.tsx",
    "content": "import { Avatar, Divider, Group, Loader, Stack, Text, ThemeIcon, Title, UnstyledButton } from '@mantine/core';\nimport { IconArrowLeft } from '@tabler/icons-react';\nimport { GetServerSideProps } from 'next';\nimport { useTranslation } from 'next-i18next';\nimport Head from 'next/head';\nimport Link from 'next/link';\nimport { useRouter } from 'next/router';\nimport { ManageUserGeneralForm } from '~/components/Manage/User/Edit/GeneralForm';\nimport { ManageUserDanger } from '~/components/Manage/User/Edit/ManageUserDanger';\nimport { ManageUserSecurityForm } from '~/components/Manage/User/Edit/ManageUserSecurityForm';\nimport { ManageLayout } from '~/components/layout/Templates/ManageLayout';\nimport { getServerAuthSession } from '~/server/auth';\nimport { getServerSideTranslations } from '~/tools/server/getServerSideTranslations';\nimport { checkForSessionOrAskForLogin } from '~/tools/server/loginBuilder';\nimport { manageNamespaces } from '~/tools/server/translation-namespaces';\nimport { api } from '~/utils/api';\nimport { ManageUserRoles } from '~/components/Manage/User/Edit/ManageUserRoles';\n\nconst EditPage = () => {\n  const { t } = useTranslation('manage/users/edit');\n\n  const router = useRouter();\n\n  const { data } = api.user.details.useQuery({ userId: router.query.userId as string });\n\n  const metaTitle = `${t('metaTitle', {\n    username: data?.name,\n  })} • Homarr`;\n\n  return (\n    <ManageLayout>\n      <Head>\n        <title>{metaTitle}</title>\n      </Head>\n      <UnstyledButton component={Link} href='/manage/users'>\n        <Group mb='md'>\n          <ThemeIcon variant='default'>\n            <IconArrowLeft size='1rem' />\n          </ThemeIcon>\n          <Text>{t('back')}</Text>\n        </Group>\n      </UnstyledButton>\n\n      <Group mb='xl'>\n        <Avatar>{data?.name?.slice(0, 2).toUpperCase()}</Avatar>\n        <Title>{data?.name}</Title>\n      </Group>\n\n      {data ? (\n        <Stack>\n          <ManageUserGeneralForm\n            defaultUsername={data?.name ?? ''}\n            defaultEmail={data?.email ?? ''}\n            userId={data.id}\n          />\n          <Divider />\n          <ManageUserSecurityForm userId={data.id} />\n          <Divider />\n          <ManageUserRoles user={data} />\n          <Divider />\n          <ManageUserDanger userId={data.id} username={data.name} />\n        </Stack>\n      ) : (\n        <Loader />\n      )}\n    </ManageLayout>\n  );\n};\n\nexport const getServerSideProps: GetServerSideProps = async (ctx) => {\n  const session = await getServerAuthSession(ctx);\n  const result = checkForSessionOrAskForLogin(ctx, session, () => session?.user.isAdmin == true);\n  if (result) {\n    return result;\n  }\n\n  const translations = await getServerSideTranslations(\n    manageNamespaces,\n    ctx.locale,\n    undefined,\n    undefined,\n  );\n  return {\n    props: {\n      ...translations,\n    },\n  };\n};\n\nexport default EditPage;\n"
  },
  {
    "path": "src/pages/manage/users/create.tsx",
    "content": "import { Alert, Button, Group, Stepper } from '@mantine/core';\nimport { useForm } from '@mantine/form';\nimport { IconArrowLeft, IconKey, IconMailCheck, IconUser, IconUserPlus } from '@tabler/icons-react';\nimport { GetServerSideProps } from 'next';\nimport { useTranslation } from 'next-i18next';\nimport Head from 'next/head';\nimport Link from 'next/link';\nimport { useState } from 'react';\nimport { z } from 'zod';\nimport {\n  CreateAccountStep,\n  createAccountStepValidationSchema,\n} from '~/components/Manage/User/Create/create-account-step';\nimport { ReviewInputStep } from '~/components/Manage/User/Create/review-input-step';\nimport {\n  CreateAccountSecurityStep,\n  createAccountSecurityStepValidationSchema,\n} from '~/components/Manage/User/Create/security-step';\nimport { ManageLayout } from '~/components/layout/Templates/ManageLayout';\nimport { getServerAuthSession } from '~/server/auth';\nimport { getServerSideTranslations } from '~/tools/server/getServerSideTranslations';\nimport { checkForSessionOrAskForLogin } from '~/tools/server/loginBuilder';\nimport { manageNamespaces } from '~/tools/server/translation-namespaces';\nimport { useI18nZodResolver } from '~/utils/i18n-zod-resolver';\n\nconst CreateNewUserPage = () => {\n  const { t } = useTranslation('manage/users/create');\n  const [active, setActive] = useState(0);\n  const nextStep = () => setActive((current) => (current < 3 ? current + 1 : current));\n  const prevStep = () => setActive((current) => (current > 0 ? current - 1 : current));\n  const { i18nZodResolver } = useI18nZodResolver();\n\n  const form = useForm<CreateAccountSchema>({\n    initialValues: {\n      account: {\n        username: '',\n        eMail: '',\n      },\n      security: {\n        password: '',\n      },\n    },\n    validate: i18nZodResolver(createAccountSchema),\n  });\n\n  const metaTitle = `${t('metaTitle')} • Homarr`;\n  return (\n    <ManageLayout>\n      <Head>\n        <title>{metaTitle}</title>\n      </Head>\n\n      <Stepper active={active} onStepClick={setActive} breakpoint=\"sm\" mih=\"100%\">\n        <Stepper.Step\n          allowStepClick={false}\n          allowStepSelect={false}\n          icon={<IconUser />}\n          label={t('steps.account.title')}\n          description={t('steps.account.text')}\n        >\n          <CreateAccountStep\n            defaultUsername={form.values.account.username}\n            defaultEmail={form.values.account.eMail}\n            nextStep={(value) => {\n              form.setFieldValue('account', value);\n              nextStep();\n            }}\n          />\n        </Stepper.Step>\n        <Stepper.Step\n          allowStepClick={false}\n          allowStepSelect={false}\n          icon={<IconKey />}\n          label={t('steps.security.title')}\n          description={t('steps.security.text')}\n        >\n          <CreateAccountSecurityStep\n            defaultPassword={form.values.security.password}\n            nextStep={(value) => {\n              form.setFieldValue('security', value);\n              nextStep();\n            }}\n            prevStep={prevStep}\n          />\n        </Stepper.Step>\n        <Stepper.Step\n          allowStepClick={false}\n          allowStepSelect={false}\n          icon={<IconMailCheck />}\n          label={t('steps.finish.title')}\n          description={t('steps.finish.title')}\n        >\n          <ReviewInputStep values={form.values} prevStep={prevStep} nextStep={nextStep} />\n        </Stepper.Step>\n        <Stepper.Completed>\n          <Alert title={t('steps.completed.alert.title')} color=\"green\" mb=\"md\">\n            {t('steps.completed.alert.text')}\n          </Alert>\n\n          <Group>\n            <Button\n              onClick={() => {\n                form.reset();\n                setActive(0);\n              }}\n              leftIcon={<IconUserPlus size=\"1rem\" />}\n              variant=\"default\"\n            >\n              {t('buttons.createAnother')}\n            </Button>\n            <Button\n              component={Link}\n              leftIcon={<IconArrowLeft size=\"1rem\" />}\n              variant=\"default\"\n              href=\"/manage/users\"\n            >\n              {t('common:back')}\n            </Button>\n          </Group>\n        </Stepper.Completed>\n      </Stepper>\n    </ManageLayout>\n  );\n};\n\nconst createAccountSchema = z.object({\n  account: createAccountStepValidationSchema,\n  security: createAccountSecurityStepValidationSchema,\n});\n\nexport type CreateAccountSchema = z.infer<typeof createAccountSchema>;\n\nexport const getServerSideProps: GetServerSideProps = async (ctx) => {\n  const session = await getServerAuthSession(ctx);\n\n  const result = checkForSessionOrAskForLogin(ctx, session, () => session?.user.isAdmin == true);\n  if (result) {\n    return result;\n  }\n\n  const translations = await getServerSideTranslations(\n    [...manageNamespaces, 'password-requirements'],\n    ctx.locale,\n    ctx.req,\n    ctx.res\n  );\n  return {\n    props: {\n      ...translations,\n    },\n  };\n};\n\nexport default CreateNewUserPage;\n"
  },
  {
    "path": "src/pages/manage/users/index.tsx",
    "content": "import {\n  Avatar,\n  Badge,\n  Button,\n  Flex,\n  Grid,\n  Group,\n  Loader,\n  NavLink,\n  Pagination,\n  Table,\n  Text,\n  TextInput,\n  Title,\n} from '@mantine/core';\nimport { useForm, zodResolver } from '@mantine/form';\nimport { useDebouncedValue } from '@mantine/hooks';\nimport { IconPencil, IconUser, IconUserPlus, IconUserShield, IconUserStar, IconX } from '@tabler/icons-react';\nimport { GetServerSideProps } from 'next';\nimport { useTranslation } from 'next-i18next';\nimport Head from 'next/head';\nimport Link from 'next/link';\nimport { useState } from 'react';\nimport { z } from 'zod';\nimport { ManageLayout } from '~/components/layout/Templates/ManageLayout';\nimport { getServerAuthSession } from '~/server/auth';\nimport { getServerSideTranslations } from '~/tools/server/getServerSideTranslations';\nimport { checkForSessionOrAskForLogin } from '~/tools/server/loginBuilder';\nimport { manageNamespaces } from '~/tools/server/translation-namespaces';\nimport { api } from '~/utils/api';\n\nexport const PossibleRoleFilter = [\n  {\n    id: 'all',\n    icon: IconUser,\n  },\n  {\n    id: 'owner',\n    icon: IconUserStar,\n  },\n  {\n    id: 'admin',\n    icon: IconUserShield,\n  },\n  {\n    id: 'normal',\n    icon: IconUser,\n  },\n];\n\nconst ManageUsersPage = () => {\n  const [activePage, setActivePage] = useState(0);\n  const form = useForm({\n    initialValues: {\n      fullTextSearch: '',\n      role: PossibleRoleFilter[0].id,\n    },\n    validate: zodResolver(\n      z.object({\n        fullTextSearch: z.string(),\n        role: z\n          .string()\n          .transform((value) => (value.length > 0 ? value : undefined))\n          .optional(),\n      })\n    ),\n  });\n  const [debouncedForm] = useDebouncedValue(form, 200);\n  const { data, isLoading } = api.user.all.useQuery({\n    page: activePage,\n    search: debouncedForm.values,\n  });\n\n  const { t } = useTranslation(['manage/users', 'common']);\n\n  const metaTitle = `${t('metaTitle')} • Homarr`;\n\n  return (\n    <ManageLayout>\n      <Head>\n        <title>{metaTitle}</title>\n      </Head>\n\n      <Title mb=\"md\">{t('pageTitle')}</Title>\n\n      <Flex columnGap={10} mb=\"md\">\n        <TextInput\n          rightSection={\n            <IconX\n              onClick={() => {\n                form.setFieldValue('fullTextSearch', '');\n              }}\n              size=\"1rem\"\n            />\n          }\n          style={{\n            flexGrow: 1,\n          }}\n          placeholder=\"Filter\"\n          variant=\"filled\"\n          {...form.getInputProps('fullTextSearch')}\n        />\n        <Button\n          component={Link}\n          leftIcon={<IconUserPlus size=\"1rem\" />}\n          href=\"/manage/users/create\"\n          color=\"green\"\n          variant=\"light\"\n          px=\"xl\"\n        >\n          {t('buttons.create')}\n        </Button>\n      </Flex>\n\n      <Grid>\n        <Grid.Col xs={12} md={4}>\n          <Text color=\"dimmed\" size=\"sm\" mb=\"xs\">\n            Roles\n          </Text>\n          {PossibleRoleFilter.map((role) => (\n            <NavLink\n              key={role.id}\n              icon={<role.icon size=\"1rem\" />}\n              rightSection={!isLoading && data && <Badge>{data?.stats.roles[role.id]}</Badge>}\n              label={t(`filter.roles.${role.id}`)}\n              active={form.values.role === role.id}\n              onClick={() => {\n                form.setFieldValue('role', role.id);\n              }}\n              sx={(theme) => ({\n                borderRadius: theme.radius.md,\n                marginBottom: 5,\n              })}\n            />\n          ))}\n        </Grid.Col>\n        <Grid.Col xs={12} md={8}>\n          <Table mb=\"md\" withBorder highlightOnHover>\n            <tbody>\n              {isLoading && (\n                <tr>\n                  <td colSpan={4}>\n                    <Group position=\"center\" p=\"lg\">\n                      <Loader variant=\"dots\" />\n                    </Group>\n                  </td>\n                </tr>\n              )}\n              {data?.users.length === 0 && (\n                <tr>\n                  <td colSpan={4}>\n                    <Text p=\"lg\" color=\"dimmed\">\n                      {t('searchDoesntMatch')}\n                    </Text>\n                  </td>\n                </tr>\n              )}\n              {data?.users.map((user, index) => (\n                <tr key={index}>\n                  <td width=\"1%\">\n                    <Avatar size=\"sm\" />\n                  </td>\n                  <td>\n                    <Grid grow>\n                      <Grid.Col span={6} p={0}>\n                        <Group spacing=\"xs\" noWrap>\n                          <Text>{user.name}</Text>\n                          {user.isOwner && (\n                            <Badge color=\"pink\" size=\"sm\">\n                              Owner\n                            </Badge>\n                          )}\n                          {user.isAdmin && (\n                            <Badge color=\"red\" size=\"sm\">\n                              Admin\n                            </Badge>\n                          )}\n                        </Group>\n                      </Grid.Col>\n                      <Grid.Col span={6} p={0}>\n                        {user.email ? (\n                          <Text>{user.email}</Text>\n                        ) : (\n                          <Text color=\"dimmed\">No E-Mail</Text>\n                        )}\n                      </Grid.Col>\n                    </Grid>\n                  </td>\n                  <td width=\"1%\">\n                    <Button\n                      component={Link}\n                      href={`/manage/users/${user.id}/edit`}\n                      leftIcon={<IconPencil size=\"1rem\" />}\n                      variant=\"default\"\n                    >\n                      {t('common:edit')}\n                    </Button>\n                  </td>\n                </tr>\n              ))}\n            </tbody>\n          </Table>\n        </Grid.Col>\n        <Group position=\"right\" w=\"100%\" px=\"sm\">\n          <Pagination\n            onNextPage={() => {\n              setActivePage((prev) => prev + 1);\n            }}\n            onPreviousPage={() => {\n              setActivePage((prev) => prev - 1);\n            }}\n            onChange={(targetPage) => {\n              setActivePage(targetPage - 1);\n            }}\n            total={data?.countPages ?? 0}\n            value={activePage + 1}\n            withControls\n          />\n        </Group>\n      </Grid>\n    </ManageLayout>\n  );\n};\n\nexport const getServerSideProps: GetServerSideProps = async (ctx) => {\n  const session = await getServerAuthSession(ctx);\n  const result = checkForSessionOrAskForLogin(ctx, session, () => session?.user.isAdmin == true);\n  if (result) {\n    return result;\n  }\n\n  const translations = await getServerSideTranslations(\n    manageNamespaces,\n    ctx.locale,\n    ctx.req,\n    ctx.res\n  );\n\n  return {\n    props: {\n      ...translations,\n    },\n  };\n};\n\nexport default ManageUsersPage;\n"
  },
  {
    "path": "src/pages/manage/users/invites.tsx",
    "content": "import { ActionIcon, Button, Center, createStyles, Flex, Pagination, Table, Text, Title } from '@mantine/core';\nimport { modals } from '@mantine/modals';\nimport { IconPlus, IconTrash } from '@tabler/icons-react';\nimport dayjs from 'dayjs';\nimport { GetServerSideProps } from 'next';\nimport { useTranslation } from 'next-i18next';\nimport Head from 'next/head';\nimport { useState } from 'react';\nimport { openCreateInviteModal } from '~/components/Manage/User/Invite/create-invite.modal';\nimport { ManageLayout } from '~/components/layout/Templates/ManageLayout';\nimport { getServerAuthSession } from '~/server/auth';\nimport { getServerSideTranslations } from '~/tools/server/getServerSideTranslations';\nimport { checkForSessionOrAskForLogin } from '~/tools/server/loginBuilder';\nimport { manageNamespaces } from '~/tools/server/translation-namespaces';\nimport { api } from '~/utils/api';\n\nconst ManageUserInvitesPage = () => {\n  const { classes } = useStyles();\n  const { t } = useTranslation('manage/users/invites');\n  const [activePage, setActivePage] = useState(0);\n  const { data: invites } = api.invites.all.useQuery({\n    page: activePage,\n  });\n\n  const nextPage = () => {\n    setActivePage((prev) => prev + 1);\n  };\n\n  const previousPage = () => {\n    setActivePage((prev) => prev - 1);\n  };\n\n  const metaTitle = `${t('metaTitle')} • Homarr`;\n  return (\n    <ManageLayout>\n      <Head>\n        <title>{metaTitle}</title>\n      </Head>\n      <Title mb=\"md\">{t('pageTitle')}</Title>\n      <Text mb=\"xl\">{t('description')}</Text>\n\n      <Flex justify=\"end\" mb=\"md\">\n        <Button\n          onClick={openCreateInviteModal}\n          leftIcon={<IconPlus size=\"1rem\" />}\n          variant=\"default\"\n        >\n          {t('button.createInvite')}\n        </Button>\n      </Flex>\n\n      {invites && (\n        <>\n          <Table mb=\"md\" withBorder highlightOnHover>\n            <thead>\n              <tr>\n                <th>{t('table.header.id')}</th>\n                <th>{t('table.header.creator')}</th>\n                <th>{t('table.header.expires')}</th>\n                <th>{t('table.header.action')}</th>\n              </tr>\n            </thead>\n            <tbody>\n              {invites.invites.map((invite, index) => (\n                <tr key={index}>\n                  <td className={classes.tableGrowCell}>\n                    <Text lineClamp={1}>{invite.id}</Text>\n                  </td>\n                  <td className={classes.tableGrowCell}>\n                    <Text lineClamp={1}>{invite.creator}</Text>\n                  </td>\n                  <td className={classes.tableCell}>\n                    {dayjs(dayjs()).isAfter(invite.expires) ? (\n                      <Text>\n                        {t('table.data.expiresAt', { at: dayjs(invite.expires).fromNow() })}\n                      </Text>\n                    ) : (\n                      <Text>\n                        {t('table.data.expiresIn', { in: dayjs(invite.expires).fromNow(true) })}\n                      </Text>\n                    )}\n                  </td>\n                  <td className={classes.tableCell}>\n                    <ActionIcon\n                      onClick={() => {\n                        modals.openContextModal({\n                          modal: 'deleteInviteModal',\n                          title: <Text weight=\"bold\">{t('button.deleteInvite')}</Text>,\n                          innerProps: {\n                            tokenId: invite.id,\n                          },\n                        });\n                      }}\n                      color=\"red\"\n                      variant=\"light\"\n                    >\n                      <IconTrash size=\"1rem\" />\n                    </ActionIcon>\n                  </td>\n                </tr>\n              ))}\n              {invites.invites.length === 0 && (\n                <tr>\n                  <td colSpan={4}>\n                    <Center p=\"md\">\n                      <Text color=\"dimmed\">{t('noInvites')}</Text>\n                    </Center>\n                  </td>\n                </tr>\n              )}\n            </tbody>\n          </Table>\n          <Pagination\n            total={invites.countPages}\n            value={activePage + 1}\n            onChange={(targetPage) => {\n              setActivePage(targetPage - 1);\n            }}\n            onNextPage={nextPage}\n            onPreviousPage={previousPage}\n            onFirstPage={() => {\n              setActivePage(0);\n            }}\n            onLastPage={() => {\n              setActivePage(invites.countPages - 1);\n            }}\n            withEdges\n          />\n        </>\n      )}\n    </ManageLayout>\n  );\n};\n\nconst useStyles = createStyles(() => ({\n  tableGrowCell: {\n    width: '50%',\n  },\n  tableCell: {\n    whiteSpace: 'nowrap',\n  },\n}));\n\nexport const getServerSideProps: GetServerSideProps = async (ctx) => {\n  const session = await getServerAuthSession(ctx);\n  const result = checkForSessionOrAskForLogin(ctx, session, () => session?.user.isAdmin == true);\n  if (result) {\n    return result;\n  }\n\n  const translations = await getServerSideTranslations(\n    manageNamespaces,\n    ctx.locale,\n    ctx.req,\n    ctx.res\n  );\n\n  return {\n    props: {\n      ...translations,\n    },\n  };\n};\n\nexport default ManageUserInvitesPage;\n"
  },
  {
    "path": "src/pages/onboard.tsx",
    "content": "import { Button, Center, Image, Stack, Text, Title, useMantineTheme } from '@mantine/core';\nimport { useDisclosure } from '@mantine/hooks';\nimport { IconArrowRight } from '@tabler/icons-react';\nimport Consola from 'consola';\nimport fs from 'fs';\nimport fsPromises from 'fs/promises';\nimport { GetServerSideProps, InferGetServerSidePropsType } from 'next';\nimport Head from 'next/head';\nimport { DatabaseNotWriteable } from '~/components/Onboarding/database-not-writeable';\nimport { OnboardingSteps } from '~/components/Onboarding/onboarding-steps';\nimport { ThemeSchemeToggle } from '~/components/ThemeSchemeToggle/ThemeSchemeToggle';\nimport { FloatingBackground } from '~/components/layout/Background/FloatingBackground';\nimport { env } from '~/env';\nimport { getTotalUserCountAsync } from '~/server/db/queries/user';\nimport { getConfig } from '~/tools/config/getConfig';\nimport { getServerSideTranslations } from '~/tools/server/getServerSideTranslations';\n\nexport default function OnboardPage({\n  configSchemaVersions,\n  databaseNotWriteable,\n  stringifiedError,\n  errorMessage,\n}: InferGetServerSidePropsType<typeof getServerSideProps>) {\n  const { fn, colors, colorScheme } = useMantineTheme();\n  const background = colorScheme === 'dark' ? 'dark.6' : 'gray.1';\n\n  const [onboardingSteps, { open: showOnboardingSteps }] = useDisclosure(false);\n\n  const isUpgradeFromSchemaOne = configSchemaVersions.includes(1);\n\n  return (\n    <>\n      <Head>\n        <title>Onboard • Homarr</title>\n      </Head>\n\n      <FloatingBackground />\n\n      <ThemeSchemeToggle pos=\"absolute\" top={20} right={20} variant=\"default\" />\n\n      <Stack h=\"100dvh\" bg={background} spacing={0}>\n        <Center bg={fn.linearGradient(145, colors.red[7], colors.red[5])} mih={150} h={150}>\n          <Center bg={background} w={100} h={100} style={{ borderRadius: 64 }}>\n            <Image width={70} src=\"/imgs/logo/logo-color.svg\" alt=\"Homarr Logo\" />\n          </Center>\n        </Center>\n\n        {databaseNotWriteable == true ? (\n          <DatabaseNotWriteable stringifiedError={stringifiedError} errorMessage={errorMessage} />\n        ) : (\n          <>\n            {onboardingSteps ? (\n              <OnboardingSteps isUpdate={isUpgradeFromSchemaOne} />\n            ) : (\n              <Center h=\"100%\">\n                <Stack align=\"center\" p=\"lg\">\n                  <Title order={1} weight={800} size=\"3rem\" opacity={0.8}>\n                    Welcome to Homarr!\n                  </Title>\n                  <Text size=\"lg\" mb={40}>\n                    Your favorite dashboard has received a big upgrade.\n                    <br />\n                    We'll help you update within the next few steps\n                  </Text>\n\n                  <Button\n                    onClick={showOnboardingSteps}\n                    rightIcon={<IconArrowRight size=\"1rem\" />}\n                    variant=\"default\"\n                  >\n                    Start update process\n                  </Button>\n                </Stack>\n              </Center>\n            )}\n          </>\n        )}\n      </Stack>\n    </>\n  );\n}\n\nexport const getServerSideProps: GetServerSideProps = async (ctx) => {\n  const userCount = await getTotalUserCountAsync();\n  if (userCount >= 1) {\n    return {\n      notFound: true,\n    };\n  }\n\n  const files = fs.readdirSync('./data/configs').filter((file) => file.endsWith('.json'));\n  const configs = files.map((file) => getConfig(file));\n  const configSchemaVersions = configs.map((config) => config.schemaVersion);\n\n  const translations = await getServerSideTranslations(\n    ['password-requirements'],\n    ctx.locale,\n    ctx.req,\n    ctx.res\n  );\n\n  if (env.DATABASE_URL.startsWith('file:')) {\n    const rawDatabaseUrl = env.DATABASE_URL.substring('file:'.length);\n    Consola.info(\n      `Instance is using a database on the file system. Checking if file '${rawDatabaseUrl}' is writable...`\n    );\n    try {\n      await fsPromises.access(rawDatabaseUrl, fs.constants.W_OK);\n    } catch (error) {\n      // this usually occurs when the database path is not mounted in Docker\n      Consola.error(`Database '${rawDatabaseUrl}' is not writable.`, error);\n      return {\n        props: {\n          ...translations,\n          configSchemaVersions: configSchemaVersions,\n          databaseNotWriteable: true,\n          errorMessage: 'Database is not writeable',\n          stringifiedError: JSON.stringify(error),\n        },\n      };\n    }\n    Consola.info('Database is writeable');\n  }\n\n  return {\n    props: {\n      ...translations,\n      configSchemaVersions: configSchemaVersions,\n      databaseNotWriteable: false,\n    },\n  };\n};\n"
  },
  {
    "path": "src/pages/user/preferences.tsx",
    "content": "import { Button, Container, Group, LoadingOverlay, Paper, Select, Stack, Text, Title } from '@mantine/core';\nimport { createFormContext } from '@mantine/form';\nimport { IconArrowLeft } from '@tabler/icons-react';\nimport { GetServerSideProps } from 'next';\nimport { useTranslation } from 'next-i18next';\nimport Head from 'next/head';\nimport { useRouter } from 'next/router';\nimport { forwardRef } from 'react';\nimport { z } from 'zod';\nimport { AccessibilitySettings } from '~/components/User/Preferences/AccessibilitySettings';\nimport { SearchEngineSettings } from '~/components/User/Preferences/SearchEngineSelector';\nimport { MainLayout } from '~/components/layout/Templates/MainLayout';\nimport { createTrpcServersideHelpers } from '~/server/api/helper';\nimport { getServerAuthSession } from '~/server/auth';\nimport { languages } from '~/tools/language';\nimport { getServerSideTranslations } from '~/tools/server/getServerSideTranslations';\nimport { api, RouterOutputs } from '~/utils/api';\nimport { useI18nZodResolver } from '~/utils/i18n-zod-resolver';\nimport { updateSettingsValidationSchema } from '~/validations/user';\n\nconst PreferencesPage = () => {\n  const { data } = api.user.withSettings.useQuery();\n  const { data: boardsData } = api.boards.all.useQuery();\n  const { t } = useTranslation('user/preferences');\n  const headTitle = `${t('metaTitle')} • Homarr`;\n\n  return (\n    <MainLayout\n      showExperimental\n      contentComponents={\n        <Button component=\"a\" href=\"/board/\" variant=\"light\" leftIcon={<IconArrowLeft size={16} />}>\n          {t('common:back')}\n        </Button>\n      }\n    >\n      <Container>\n        <Paper p=\"xl\" mih=\"100%\" withBorder>\n          <Head>\n            <title>{headTitle}</title>\n          </Head>\n          <Title mb=\"xl\">{t('pageTitle')}</Title>\n\n          {data && boardsData && (\n            <SettingsComponent settings={data.settings} boardsData={boardsData} />\n          )}\n        </Paper>\n      </Container>\n    </MainLayout>\n  );\n};\n\nexport const [FormProvider, useUserPreferencesFormContext, useForm] =\n  createFormContext<z.infer<typeof updateSettingsValidationSchema>>();\n\nconst SettingsComponent = ({\n  settings,\n  boardsData,\n}: {\n  settings: RouterOutputs['user']['withSettings']['settings'];\n  boardsData: RouterOutputs['boards']['all'];\n}) => {\n  const languagesData = languages.map((language) => ({\n    label: language.originalName,\n    description: language.translatedName,\n    value: language.shortName,\n    country: language.country,\n  }));\n\n  const { t, i18n } = useTranslation(['user/preferences', 'common']);\n\n  const { i18nZodResolver } = useI18nZodResolver();\n  const { pathname, query, asPath, push } = useRouter();\n\n  const form = useForm({\n    initialValues: {\n      defaultBoard: settings.defaultBoard,\n      language: settings.language,\n      firstDayOfWeek: settings.firstDayOfWeek,\n      disablePingPulse: settings.disablePingPulse,\n      replaceDotsWithIcons: settings.replacePingWithIcons,\n      searchTemplate: settings.searchTemplate,\n      openSearchInNewTab: settings.openSearchInNewTab,\n      autoFocusSearch: settings.autoFocusSearch,\n    },\n    validate: i18nZodResolver(updateSettingsValidationSchema),\n    validateInputOnBlur: true,\n    validateInputOnChange: true,\n  });\n\n  const context = api.useContext();\n  const { mutate, isLoading } = api.user.updateSettings.useMutation({\n    onSettled: () => {\n      void context.boards.all.invalidate();\n      void context.user.withSettings.invalidate();\n    },\n  });\n\n  const handleSubmit = (values: z.infer<typeof updateSettingsValidationSchema>) => {\n    mutate(values, {\n      onSuccess: () => {\n        if (values.language !== settings.language) {\n          i18n.changeLanguage(values.language).then(() => {\n            push(\n              {\n                pathname,\n                query,\n              },\n              asPath,\n              { locale: values.language }\n            );\n          });\n        }\n      },\n    });\n  };\n\n  return (\n    <FormProvider form={form}>\n      <form style={{ position: 'relative' }} onSubmit={form.onSubmit(handleSubmit)}>\n        <LoadingOverlay visible={isLoading} overlayBlur={2} />\n        <Stack spacing={5}>\n          <Select\n            label={t('boards.defaultBoard.label')}\n            data={boardsData.map((board) => board.name)}\n            searchable\n            maxDropdownHeight={400}\n            filter={(value, item) => item.label!.toLowerCase().includes(value.toLowerCase().trim())}\n            withAsterisk\n            {...form.getInputProps('defaultBoard')}\n          />\n\n          <Select\n            label=\"Language\"\n            itemComponent={SelectItem}\n            data={languagesData}\n            searchable\n            maxDropdownHeight={400}\n            filter={(value, item) =>\n              item.label!.toLowerCase().includes(value.toLowerCase().trim()) ||\n              item.description.toLowerCase().includes(value.toLowerCase().trim())\n            }\n            defaultValue={settings.language}\n            withAsterisk\n            mb=\"xs\"\n            {...form.getInputProps('language')}\n          />\n\n          <Select\n            label={t('localization.firstDayOfWeek.label')}\n            withAsterisk\n            data={firstDayOfWeekOptions.map((day) => ({\n              label: t(`localization.firstDayOfWeek.options.${day}`) as string,\n              value: day,\n            }))}\n            {...form.getInputProps('firstDayOfWeek')}\n          />\n\n          <Title order={2} size=\"lg\" mt=\"lg\" mb=\"md\">\n            {t('accessibility.title')}\n          </Title>\n\n          <AccessibilitySettings />\n\n          <Title order={2} size=\"lg\" mt=\"lg\" mb=\"md\">\n            {t('searchEngine.title')}\n          </Title>\n\n          <SearchEngineSettings />\n\n          <Button type=\"submit\" fullWidth mt=\"md\">\n            {t('common:save')}\n          </Button>\n        </Stack>\n      </form>\n    </FormProvider>\n  );\n};\n\ninterface ItemProps extends React.ComponentPropsWithoutRef<'div'> {\n  image: string;\n  label: string;\n  description: string;\n  country: string;\n}\n\nconst SelectItem = forwardRef<HTMLDivElement, ItemProps>(\n  ({ image, label, description, country, ...others }: ItemProps, ref) => (\n    <div ref={ref} {...others}>\n      <Group noWrap>\n        {country !== 'CROWDIN' && <span className={`fi fi-${country?.toLowerCase()}`}></span>}\n        {country === 'CROWDIN' && <img src={'https://support.crowdin.com/assets/logos/crowdin-dark-symbol.png'} alt={label} width={16} height={16} />}\n        <div>\n          <Text size=\"sm\">{label}</Text>\n          <Text size=\"xs\" opacity={0.65}>\n            {description}\n          </Text>\n        </div>\n      </Group>\n    </div>\n  )\n);\n\nconst firstDayOfWeekOptions = ['monday', 'sunday', 'saturday'] as const;\n\nexport const getServerSideProps: GetServerSideProps = async ({ req, res, locale }) => {\n  const session = await getServerAuthSession({ req, res });\n  if (!session) {\n    return {\n      notFound: true,\n    };\n  }\n\n  const helpers = await createTrpcServersideHelpers({ req, res });\n\n  await helpers.user.withSettings.prefetch();\n  await helpers.boards.all.prefetch();\n\n  const translations = await getServerSideTranslations(['user/preferences'], locale, req, res);\n  return {\n    props: {\n      ...translations,\n      locale: locale,\n      trpcState: helpers.dehydrate(),\n    },\n  };\n};\n\nexport default PreferencesPage;\n"
  },
  {
    "path": "src/server/api/helper.ts",
    "content": "import { createServerSideHelpers } from '@trpc/react-query/server';\nimport { CreateNextContextOptions } from '@trpc/server/adapters/next';\nimport { GetServerSidePropsContext } from 'next';\nimport superjson from 'superjson';\n\nimport { rootRouter } from './root';\nimport { createTRPCContext } from './trpc';\n\nexport const createTrpcServersideHelpers = async (\n  props: Pick<GetServerSidePropsContext, 'req' | 'res'>\n) =>\n  createServerSideHelpers({\n    router: rootRouter,\n    ctx: await createTRPCContext(props as CreateNextContextOptions),\n    transformer: superjson,\n  });\n"
  },
  {
    "path": "src/server/api/root.ts",
    "content": "import { tdarrRouter } from '~/server/api/routers/tdarr';\nimport { createTRPCRouter } from '~/server/api/trpc';\n\nimport { appRouter } from './routers/app';\nimport { boardRouter } from './routers/board';\nimport { calendarRouter } from './routers/calendar';\nimport { configRouter } from './routers/config';\nimport { dashDotRouter } from './routers/dash-dot';\nimport { dnsHoleRouter } from './routers/dns-hole/router';\nimport { dockerRouter } from './routers/docker/router';\nimport { downloadRouter } from './routers/download';\nimport { healthMonitoringRouter } from './routers/health-monitoring/router';\nimport { iconRouter } from './routers/icon';\nimport { indexerManagerRouter } from './routers/indexer-manager';\nimport { inviteRouter } from './routers/invite/invite-router';\nimport { mediaRequestsRouter } from './routers/media-request';\nimport { mediaServerRouter } from './routers/media-server';\nimport { migrateRouter } from './routers/migrate';\nimport { notebookRouter } from './routers/notebook';\nimport { overseerrRouter } from './routers/overseerr';\nimport { passwordRouter } from './routers/password';\nimport { rssRouter } from './routers/rss';\nimport { smartHomeEntityStateRouter } from './routers/smart-home/entity-state';\nimport { usenetRouter } from './routers/usenet/router';\nimport { userRouter } from './routers/user';\nimport { weatherRouter } from './routers/weather';\n\n/**\n * This is the primary router for your server.\n *\n * All routers added in /api/routers should be manually added here.\n */\nexport const rootRouter = createTRPCRouter({\n  app: appRouter,\n  rss: rssRouter,\n  user: userRouter,\n  calendar: calendarRouter,\n  indexerManager: indexerManagerRouter,\n  config: configRouter,\n  dashDot: dashDotRouter,\n  dnsHole: dnsHoleRouter,\n  docker: dockerRouter,\n  download: downloadRouter,\n  icon: iconRouter,\n  mediaRequest: mediaRequestsRouter,\n  mediaServer: mediaServerRouter,\n  overseerr: overseerrRouter,\n  usenet: usenetRouter,\n  weather: weatherRouter,\n  invites: inviteRouter,\n  boards: boardRouter,\n  password: passwordRouter,\n  notebook: notebookRouter,\n  smartHomeEntityState: smartHomeEntityStateRouter,\n  healthMonitoring: healthMonitoringRouter,\n  tdarr: tdarrRouter,\n  migrate: migrateRouter,\n});\n\n// export type definition of API\nexport type RootRouter = typeof rootRouter;\n"
  },
  {
    "path": "src/server/api/routers/app.ts",
    "content": "import { TRPCError } from '@trpc/server';\nimport axios, { AxiosError } from 'axios';\nimport Consola from 'consola';\nimport * as https from 'https';\nimport { z } from 'zod';\nimport { isStatusOk } from '~/components/Dashboard/Tiles/Apps/AppPing';\nimport { getConfig } from '~/tools/config/getConfig';\nimport { AppType } from '~/types/app';\n\nimport { createTRPCRouter, publicProcedure } from '../trpc';\n\nexport const appRouter = createTRPCRouter({\n  ping: publicProcedure\n    .meta({ openapi: { method: 'GET', path: '/app/ping', tags: ['app'] } })\n    .input(\n      z.object({\n        id: z.string(),\n        configName: z.string(),\n      })\n    )\n    .output(\n      z.object({\n        status: z.number(),\n        statusText: z.string(),\n        state: z.string(),\n      })\n    )\n    .query(async ({ input }) => {\n      const config = getConfig(input.configName);\n      const app = config.apps.find((app) => app.id === input.id);\n\n      if (!app?.url) {\n        Consola.error(`App ${input} not found`);\n        throw new TRPCError({\n          code: 'NOT_FOUND',\n          cause: input,\n          message: `App ${input.id} was not found`,\n        });\n      }\n\n      const agent = new https.Agent({\n        rejectUnauthorized: false,\n        requestCert: false,\n      });\n\n      return await axios\n        .get(app.url, {\n          httpsAgent: agent,\n          timeout: 12 * 1000, // 12 seconds\n        })\n        .then((response) => ({\n          status: response.status,\n          statusText: response.statusText,\n          state: isStatusOk(app as AppType, response.status) ? 'online' : 'offline',\n        }))\n        .catch((error: AxiosError) => {\n          if (error.response) {\n            return {\n              state: isStatusOk(app as AppType, error.response.status) ? 'online' : 'offline',\n              status: error.response.status,\n              statusText: error.response.statusText,\n            };\n          }\n\n          if (error.code === 'ECONNABORTED') {\n            Consola.error(\n              `Ping timed out for app with id '${input.id}' in config '${input.configName}' -> url: ${app.url})`\n            );\n            throw new TRPCError({\n              code: 'TIMEOUT',\n              cause: input,\n              message: `Ping timed out`,\n            });\n          }\n\n          Consola.error(`Unexpected response: ${error.message}`);\n          throw new TRPCError({\n            code: 'UNPROCESSABLE_CONTENT',\n            cause: input,\n            message: `Unexpected response: ${error.message}`,\n          });\n        });\n    }),\n});\n"
  },
  {
    "path": "src/server/api/routers/board.ts",
    "content": "import { TRPCError } from '@trpc/server';\nimport Consola from 'consola';\nimport fs from 'fs';\nimport { z } from 'zod';\nimport { getDefaultBoardAsync } from '~/server/db/queries/userSettings';\nimport { configExists } from '~/tools/config/configExists';\nimport { getConfig } from '~/tools/config/getConfig';\nimport { getFrontendConfig } from '~/tools/config/getFrontendConfig';\nimport { writeConfig } from '~/tools/config/writeConfig';\nimport { generateDefaultApp } from '~/tools/shared/app';\nimport { configNameSchema } from '~/validations/boards';\n\nimport { adminProcedure, createTRPCRouter, protectedProcedure } from '../trpc';\n\nexport const boardRouter = createTRPCRouter({\n  all: protectedProcedure\n    .meta({ openapi: { method: 'GET', path: '/boards/all', tags: ['board'] } })\n    .input(z.void())\n    .output(\n      z.array(\n        z.object({\n          name: z.string(),\n          allowGuests: z.boolean(),\n          countApps: z.number().min(0),\n          countWidgets: z.number().min(0),\n          countCategories: z.number().min(0),\n          isDefaultForUser: z.boolean(),\n        })\n      )\n    )\n    .query(async ({ ctx }) => {\n      const files = fs.readdirSync('./data/configs').filter((file) => file.endsWith('.json'));\n\n      const defaultBoard = await getDefaultBoardAsync(ctx.session.user.id, 'default');\n\n      return await Promise.all(\n        files.map(async (file) => {\n          const name = file.replace('.json', '');\n          const config = await getFrontendConfig(name);\n\n          const countApps = config.apps.length;\n\n          return {\n            name: name,\n            allowGuests: config.settings.access.allowGuests,\n            countApps: countApps,\n            countWidgets: config.widgets.length,\n            countCategories: config.categories.length,\n            isDefaultForUser: name === defaultBoard,\n          };\n        })\n      );\n    }),\n  addAppsForContainers: adminProcedure\n    .meta({ openapi: { method: 'POST', path: '/boards/add-apps', tags: ['board'] } })\n    .output(z.void())\n    .input(\n      z.object({\n        boardName: configNameSchema,\n        apps: z.array(\n          z.object({\n            name: z.string(),\n            icon: z.string().optional(),\n            port: z.number().optional(),\n          })\n        ),\n      })\n    )\n    .mutation(async ({ input }) => {\n      if (!configExists(input.boardName)) {\n        throw new TRPCError({\n          code: 'NOT_FOUND',\n          message: 'Board not found',\n        });\n      }\n      const config = getConfig(input.boardName);\n      const lowestWrapper = config?.wrappers.sort((a, b) => a.position - b.position)[0];\n\n      const newConfig = {\n        ...config,\n        apps: [\n          ...config.apps,\n          ...input.apps.map((container) => {\n            const defaultApp = generateDefaultApp(lowestWrapper.id);\n            const address = container.port\n              ? `http://localhost:${container.port}`\n              : 'http://localhost';\n            return {\n              ...defaultApp,\n              name: container.name,\n              url: address,\n              appearance: {\n                ...defaultApp.appearance,\n                iconUrl: container.icon,\n              },\n              behaviour: {\n                ...defaultApp.behaviour,\n                externalUrl: address,\n              },\n            };\n          }),\n        ],\n      };\n\n      const targetPath = `data/configs/${input.boardName}.json`;\n      fs.writeFileSync(targetPath, JSON.stringify(newConfig, null, 2), 'utf8');\n    }),\n  renameBoard: adminProcedure\n    .meta({ openapi: { method: 'PUT', path: '/boards/rename', tags: ['board'] } })\n    .input(\n      z.object({\n        oldName: configNameSchema,\n        newName: configNameSchema,\n      })\n    )\n    .output(z.void())\n    .mutation(async ({ input }) => {\n      if (input.oldName === 'default') {\n        Consola.error(`Attempted to rename default configuration. Aborted deletion.`);\n        throw new TRPCError({\n          code: 'CONFLICT',\n          message: 'Cannot rename default board',\n        });\n      }\n\n      if (!configExists(input.oldName)) {\n        Consola.error(`Specified configuration ${input.oldName} does not exist on file system`);\n        throw new TRPCError({\n          code: 'NOT_FOUND',\n          message: 'Board not found',\n        });\n      }\n\n      if (configExists(input.newName)) {\n        Consola.error(`Target name of rename conflicts with existing board`);\n        throw new TRPCError({\n          code: 'CONFLICT',\n          message: 'Board conflicts with existing board',\n        });\n      }\n\n      const config = getConfig(input.oldName);\n      config.configProperties.name = input.newName;\n      writeConfig(config);\n      Consola.info(`Deleting ${input.oldName} from the file system`);\n      const targetPath = `data/configs/${input.oldName}.json`;\n      fs.unlinkSync(targetPath);\n      Consola.info(`Deleted ${input.oldName} from file system`);\n    }),\n  duplicateBoard: adminProcedure\n    .meta({ openapi: { method: 'POST', path: '/boards/duplicate', tags: ['board'] } })\n    .input(\n      z.object({\n        boardName: z.string(),\n      })\n    )\n    .output(z.void())\n    .mutation(async ({ input }) => {\n      if (!configExists(input.boardName)) {\n        Consola.error(\n          `Tried to duplicate ${input.boardName} but this configuration does not exist.`\n        );\n        throw new TRPCError({\n          code: 'NOT_FOUND',\n          message: 'Board not found',\n        });\n      }\n\n      const targetName = attemptGenerateDuplicateName(input.boardName, 10);\n\n      Consola.info(`Target duplication name ${targetName} does not exist`);\n\n      const config = getConfig(input.boardName);\n      config.configProperties.name = targetName;\n      writeConfig(config);\n\n      Consola.info(`Wrote config to name '${targetName}'`);\n    }),\n});\n\nconst duplicationName = /^(\\w+)\\s{1}\\(([0-9]+)\\)$/;\n\nconst attemptGenerateDuplicateName = (baseName: string, maxAttempts: number) => {\n  for (let i = 0; i < maxAttempts; i++) {\n    const newName = generateDuplicateName(baseName, i);\n    if (configExists(newName)) {\n      continue;\n    }\n\n    return newName;\n  }\n\n  Consola.error(`Duplication name ${baseName} conflicts with an existing configuration`);\n  throw new TRPCError({\n    code: 'CONFLICT',\n    message: 'Board conflicts with an existing board',\n  });\n};\n\nconst generateDuplicateName = (baseName: string, increment: number) => {\n  const result = duplicationName.exec(baseName);\n\n  if (result && result.length === 3) {\n    const originalName = result.at(1);\n    const counter = Number(result.at(2));\n    return `${originalName} (${counter + 1 + increment})`;\n  }\n\n  return `${baseName} (2)`;\n};\n"
  },
  {
    "path": "src/server/api/routers/calendar.ts",
    "content": "import axios from 'axios';\nimport Consola from 'consola';\nimport { z } from 'zod';\nimport { checkIntegrationsType } from '~/tools/client/app-properties';\nimport { getConfig } from '~/tools/config/getConfig';\nimport { AppIntegrationType, IntegrationType } from '~/types/app';\n\nimport { createTRPCRouter, publicProcedure } from '../trpc';\n\nexport const calendarRouter = createTRPCRouter({\n  medias: publicProcedure\n    .input(\n      z.object({\n        configName: z.string(),\n        month: z.number().min(1).max(12),\n        year: z.number().min(1900).max(2300),\n        options: z.object({\n          showUnmonitored: z.boolean().optional().default(false),\n        }),\n      })\n    )\n    .query(async ({ input }) => {\n      const { configName, month, year, options } = input;\n      const config = getConfig(configName);\n\n      const mediaAppIntegrationTypes = [\n        'sonarr',\n        'radarr',\n        'readarr',\n        'lidarr',\n      ] as const satisfies readonly IntegrationType[];\n      const mediaApps = config.apps.filter((app) =>\n        checkIntegrationsType(app.integration, mediaAppIntegrationTypes)\n      );\n\n      const integrationTypeEndpointMap = new Map<AppIntegrationType['type'], string>([\n        ['sonarr', '/api/v3/calendar'],\n        ['radarr', '/api/v3/calendar'],\n        ['lidarr', '/api/v1/calendar'],\n        ['readarr', '/api/v1/calendar'],\n      ]);\n\n      const promises = mediaApps.map(async (app) => {\n        const integration = app.integration!;\n        const endpoint = integrationTypeEndpointMap.get(integration.type);\n        if (!endpoint) {\n          return {\n            type: integration.type,\n            items: [],\n            success: false,\n          };\n        }\n\n        // Get the origin URL\n        let { href: origin } = new URL(app.url);\n        if (origin.endsWith('/')) {\n          origin = origin.slice(0, -1);\n        }\n\n        const start = new Date(year, month - 1, 1); // First day of month\n        const end = new Date(year, month, 0); // Last day of month\n\n        const apiKey = integration.properties.find((x) => x.field === 'apiKey')?.value;\n        if (!apiKey) return { type: integration.type, items: [], success: false };\n        return axios\n          .get(\n            `${origin}${endpoint}?apiKey=${apiKey}&end=${end.toISOString()}&start=${start.toISOString()}&includeSeries=true&includeEpisodeFile=true&includeEpisodeImages=true&&unmonitored=${\n              input.options.showUnmonitored\n            }`\n          )\n          .then((x) => ({ type: integration.type, items: x.data as any[], success: true }))\n          .catch((err) => {\n            Consola.error(\n              `failed to process request to app '${integration.type}' (${app.id}): ${err}`\n            );\n            return {\n              type: integration.type,\n              items: [],\n              success: false,\n            };\n          });\n      });\n\n      const medias = await Promise.all(promises);\n\n      const countFailed = medias.filter((x) => !x.success).length;\n      if (countFailed > 0) {\n        Consola.warn(`A total of ${countFailed} apps for the calendar widget failed`);\n      }\n\n      return {\n        tvShows: medias.filter((m) => m.type === 'sonarr').flatMap((m) => m.items),\n        movies: medias.filter((m) => m.type === 'radarr').flatMap((m) => m.items),\n        books: medias.filter((m) => m.type === 'readarr').flatMap((m) => m.items),\n        musics: medias.filter((m) => m.type === 'lidarr').flatMap((m) => m.items),\n        totalCount: medias.reduce((p, c) => p + c.items.length, 0),\n      };\n    }),\n});\n"
  },
  {
    "path": "src/server/api/routers/config.ts",
    "content": "import { MantineTheme } from '@mantine/core';\nimport { TRPCError } from '@trpc/server';\nimport Consola from 'consola';\nimport fs from 'fs';\nimport path from 'path';\nimport { z } from 'zod';\nimport { configExists } from '~/tools/config/configExists';\nimport { getConfig } from '~/tools/config/getConfig';\nimport { getFrontendConfig } from '~/tools/config/getFrontendConfig';\nimport { BackendConfigType, ConfigType } from '~/types/config';\nimport { boardCustomizationSchema, configNameSchema } from '~/validations/boards';\nimport { IRssWidget } from '~/widgets/rss/RssWidgetTile';\n\nimport { adminProcedure, createTRPCRouter, publicProcedure } from '../trpc';\n\nexport const configRouter = createTRPCRouter({\n  delete: adminProcedure\n    .meta({ openapi: { method: 'DELETE', path: '/configs', tags: ['config'] } })\n    .input(\n      z.object({\n        name: configNameSchema,\n      })\n    )\n    .output(z.object({ message: z.string() }))\n    .mutation(async ({ input }) => {\n      if (input.name === 'default') {\n        Consola.error(\"Rejected config deletion because default configuration can't be deleted\");\n        throw new TRPCError({\n          code: 'FORBIDDEN',\n          message: \"Default config can't be deleted\",\n        });\n      }\n\n      // Loop over all the files in the /data/configs directory\n      // Get all the configs in the /data/configs folder\n      // All the files that end in \".json\"\n      const files = fs.readdirSync('./data/configs').filter((file) => file.endsWith('.json'));\n      // Match one file if the configProperties.name is the same as the slug\n      const matchedFile = files.find((file) => {\n        const config = JSON.parse(fs.readFileSync(path.join('data/configs', file), 'utf8'));\n        return config.configProperties.name === input.name;\n      });\n\n      // If the target is not in the list of files, return an error\n      if (!matchedFile) {\n        Consola.error(\n          `Rejected config deletion request because config name '${input.name}' was not included in present configurations`\n        );\n        throw new TRPCError({\n          code: 'NOT_FOUND',\n          message: 'Target not found',\n        });\n      }\n\n      // Delete the file\n      fs.unlinkSync(path.join('data/configs', matchedFile));\n      Consola.info(`Successfully deleted configuration '${input.name}' from your file system`);\n      return {\n        message: 'Configuration deleted with success',\n      };\n    }),\n  save: adminProcedure\n    .input(\n      z.object({\n        name: configNameSchema,\n        config: z.custom<ConfigType>((x) => !!x && typeof x === 'object'),\n        create: z.boolean().optional(),\n      })\n    )\n    .mutation(async ({ input }) => {\n      if (input.create && configExists(input.name))\n        throw new TRPCError({ message: 'Config already exists.', code: 'CONFLICT' });\n\n      Consola.info(`Saving updated configuration of '${input.name}' config.`);\n\n      const previousConfig = getConfig(input.name);\n\n      let newConfig: BackendConfigType = {\n        ...input.config,\n        apps: [\n          ...input.config.apps.map((app) => ({\n            ...app,\n            network: {\n              ...app.network,\n              statusCodes:\n                app.network.okStatus === undefined\n                  ? app.network.statusCodes\n                  : app.network.okStatus.map((x) => x.toString()),\n              okStatus: undefined,\n            },\n            integration: {\n              ...app.integration,\n              properties: app.integration.properties.map((property) => {\n                if (property.type === 'public') {\n                  return {\n                    field: property.field,\n                    type: property.type,\n                    value: property.value,\n                  };\n                }\n\n                const previousApp = previousConfig.apps.find(\n                  (previousApp) => previousApp.id === app.id\n                );\n\n                const previousProperty = previousApp?.integration?.properties.find(\n                  (previousProperty) => previousProperty.field === property.field\n                );\n\n                if (property.value !== undefined && property.value !== null) {\n                  Consola.info(\n                    'Detected credential change of private secret. Value will be overwritten in configuration'\n                  );\n                  return {\n                    field: property.field,\n                    type: property.type,\n                    value: property.value,\n                  };\n                }\n\n                return {\n                  field: property.field,\n                  type: property.type,\n                  value: previousProperty?.value,\n                };\n              }),\n            },\n          })),\n        ],\n        // Settings can only be changed in the configuration file\n        settings: previousConfig.settings,\n      };\n\n      newConfig = {\n        ...newConfig,\n        widgets: [\n          ...newConfig.widgets.map((x) => {\n            if (x.type !== 'rss') {\n              return x;\n            }\n\n            const rssWidget = x as IRssWidget;\n\n            return {\n              ...rssWidget,\n              properties: {\n                ...rssWidget.properties,\n                rssFeedUrl:\n                  typeof rssWidget.properties.rssFeedUrl === 'string'\n                    ? [rssWidget.properties.rssFeedUrl]\n                    : rssWidget.properties.rssFeedUrl,\n              },\n            } as IRssWidget;\n          }),\n        ],\n      };\n\n      // Save the body in the /data/config folder with the slug as filename\n      const targetPath = path.join('data/configs', `${input.name}.json`);\n      fs.writeFileSync(targetPath, JSON.stringify(newConfig, null, 2), 'utf8');\n\n      Consola.debug(`Config '${input.name}' has been updated and flushed to '${targetPath}'.`);\n\n      return {\n        message: 'Configuration saved with success',\n      };\n    }),\n  byName: publicProcedure\n    .meta({\n      openapi: {\n        method: 'GET',\n        path: '/configs/byName',\n        tags: ['config'],\n        deprecated: true,\n        summary:\n          'Retrieve content of the JSON configuration. Deprecated because JSON will be removed in a future version and be replaced with a relational database.',\n      },\n    })\n    .input(\n      z.object({\n        name: configNameSchema,\n      })\n    )\n    .output(z.custom<ConfigType>())\n    .query(async ({ ctx, input }) => {\n      if (!configExists(input.name)) {\n        throw new TRPCError({\n          code: 'NOT_FOUND',\n          message: 'Configuration not found',\n        });\n      }\n\n      return await getFrontendConfig(input.name);\n    }),\n  saveCustomization: adminProcedure\n    .input(boardCustomizationSchema.and(z.object({ name: configNameSchema })))\n    .output(z.void())\n    .mutation(async ({ input }) => {\n      const previousConfig = getConfig(input.name);\n      const newConfig = {\n        ...previousConfig,\n        settings: {\n          ...previousConfig.settings,\n          access: {\n            ...previousConfig.settings.access,\n            allowGuests: input.access.allowGuests,\n          },\n          customization: {\n            ...previousConfig.settings.customization,\n            appOpacity: input.appearance.opacity,\n            backgroundImageUrl: input.appearance.backgroundSrc,\n            backgroundImageAttachment: input.appearance.backgroundImageAttachment,\n            backgroundImageRepeat: input.appearance.backgroundImageRepeat,\n            backgroundImageSize: input.appearance.backgroundImageSize,\n            colors: {\n              primary: input.appearance.primaryColor,\n              secondary: input.appearance.secondaryColor,\n              shade: input.appearance.shade as MantineTheme['primaryShade'],\n            },\n            customCss: input.appearance.customCss,\n            faviconUrl: input.pageMetadata.faviconSrc,\n            gridstack: {\n              columnCountSmall: input.gridstack.sm,\n              columnCountMedium: input.gridstack.md,\n              columnCountLarge: input.gridstack.lg,\n            },\n            layout: {\n              ...previousConfig.settings.customization.layout,\n              enabledLeftSidebar: input.layout.leftSidebarEnabled,\n              enabledRightSidebar: input.layout.rightSidebarEnabled,\n              enabledPing: input.layout.pingsEnabled,\n            },\n            logoImageUrl: input.pageMetadata.logoSrc,\n            metaTitle: input.pageMetadata.metaTitle,\n            pageTitle: input.pageMetadata.pageTitle,\n          },\n        },\n      } satisfies BackendConfigType;\n      const targetPath = path.join('data/configs', `${input.name}.json`);\n      fs.writeFileSync(targetPath, JSON.stringify(newConfig, null, 2), 'utf8');\n    }),\n  // publicProcedure is not optimal, but should be fince, since there is no input and output data nor can you break the config\n  updateConfigurationSchemaToLatest: publicProcedure.mutation(async () => {\n    const files = fs.readdirSync('./data/configs').filter((file) => file.endsWith('.json'));\n\n    console.log('updating the schema version of', files.length, 'configurations');\n\n    for (const file of files) {\n      const name = file.replace('.json', '');\n      const config = await getFrontendConfig(name);\n\n      config.schemaVersion = 2;\n      const targetPath = `data/configs/${name}.json`;\n      fs.writeFileSync(targetPath, JSON.stringify(config, null, 2), 'utf8');\n\n      console.log('updated', name, 'to schema version', config.schemaVersion);\n    }\n  }),\n});\n"
  },
  {
    "path": "src/server/api/routers/dash-dot.ts",
    "content": "import { TRPCError } from '@trpc/server';\nimport axios from 'axios';\nimport { z } from 'zod';\n\nimport { createTRPCRouter, publicProcedure } from '../trpc';\n\nconst dashDotUrlSchema = z.string().url();\n\nconst removeLeadingSlash = (x: string) => (x.endsWith('/') ? x.substring(0, x.length - 1) : x);\n\nexport const dashDotRouter = createTRPCRouter({\n  info: publicProcedure\n    .input(\n      z.object({\n        url: dashDotUrlSchema.transform(removeLeadingSlash),\n      })\n    )\n    .output(\n      z.object({\n        storage: z.array(\n          z.object({\n            size: z.number(),\n          })\n        ),\n        network: z.object({\n          speedUp: z.number(),\n          speedDown: z.number(),\n        }),\n      })\n    )\n    .query(async ({ input }) => {\n      const response = await axios.get(`${input.url}/info`).catch((error) => {\n        if (error.response.status === 404) {\n          throw new TRPCError({\n            code: 'NOT_FOUND',\n            message: 'Unable to find specified dash-dot instance',\n          });\n        }\n\n        throw new TRPCError({\n          code: 'INTERNAL_SERVER_ERROR',\n        });\n      });\n      return response.data;\n    }),\n  storage: publicProcedure\n    .input(\n      z.object({\n        url: dashDotUrlSchema.transform(removeLeadingSlash),\n      })\n    )\n    .output(z.array(z.number()))\n    .query(async ({ input }) => {\n      const response = await axios.get(`${input.url}/load/storage`).catch((error) => {\n        if (error.response.status === 404) {\n          throw new TRPCError({\n            code: 'NOT_FOUND',\n            message: 'Unable to find specified dash-dot',\n          });\n        }\n\n        throw new TRPCError({\n          code: 'INTERNAL_SERVER_ERROR',\n        });\n      });\n      return response.data;\n    }),\n});\n"
  },
  {
    "path": "src/server/api/routers/dns-hole/router.ts",
    "content": "import Consola from 'consola';\nimport { z } from 'zod';\nimport { findAppProperty } from '~/tools/client/app-properties';\nimport { getConfig } from '~/tools/config/getConfig';\nimport { AdGuard } from '~/tools/server/sdk/adGuard/adGuard';\nimport { PiHoleClient } from '~/tools/server/sdk/pihole/piHole';\nimport { ConfigAppType } from '~/types/app';\nimport { AdStatistics } from '~/widgets/dnshole/type';\n\nimport { adminProcedure, createTRPCRouter, publicProcedure } from '../../trpc';\n\nexport const dnsHoleRouter = createTRPCRouter({\n  control: adminProcedure\n    .input(\n      z.object({\n        action: z.enum(['enable', 'disable']),\n        duration: z.number(),\n        configName: z.string(),\n        appsToChange: z.optional(z.array(z.string())),\n      })\n    )\n    .mutation(async ({ input }) => {\n      const config = getConfig(input.configName);\n\n      const applicableApps = config.apps.filter(\n        (app) =>\n          app.id &&\n          app.integration?.type &&\n          input.appsToChange?.includes(app.id) &&\n          ['pihole', 'adGuardHome'].includes(app.integration?.type)\n      );\n\n      await Promise.all(\n        applicableApps.map(async (app) => {\n          if (app.integration?.type === 'pihole') {\n            await processPiHole(app, input.action === 'enable', input.duration);\n\n            return;\n          }\n\n          await processAdGuard(app, input.action === 'enable', input.duration);\n        })\n      );\n    }),\n  summary: publicProcedure\n    .input(\n      z.object({\n        configName: z.string(),\n      })\n    )\n    .query(async ({ input }) => {\n      const config = getConfig(input.configName);\n\n      const applicableApps = config.apps.filter(\n        (x) => x.integration?.type && ['pihole', 'adGuardHome'].includes(x.integration?.type)\n      );\n\n      const result = await Promise.all(\n        applicableApps.map(async (app) =>\n          app.integration?.type === 'pihole'\n            ? collectPiHoleSummary(app)\n            : collectAdGuardSummary(app)\n        )\n      );\n\n      const data = result\n        .filter((x) => x !== null)\n        .reduce(\n          (prev: AdStatistics, curr) => ({\n            domainsBeingBlocked: prev.domainsBeingBlocked + curr!.domainsBeingBlocked,\n            adsBlockedToday: prev.adsBlockedToday + curr!.adsBlockedToday,\n            dnsQueriesToday: prev.dnsQueriesToday + curr!.dnsQueriesToday,\n            status: [...prev.status, curr!.status],\n            adsBlockedTodayPercentage: 0,\n          }),\n          {\n            domainsBeingBlocked: 0,\n            adsBlockedToday: 0,\n            adsBlockedTodayPercentage: 0,\n            dnsQueriesToday: 0,\n            status: [],\n          }\n        );\n\n      data.adsBlockedTodayPercentage = data.adsBlockedToday / data.dnsQueriesToday;\n      if (Number.isNaN(data.adsBlockedTodayPercentage)) {\n        data.adsBlockedTodayPercentage = 0;\n      }\n      return data;\n    }),\n});\n\nconst processAdGuard = async (app: ConfigAppType, enable: boolean, duration: number = 0) => {\n  const adGuard = new AdGuard(\n    app.url,\n    findAppProperty(app, 'username'),\n    findAppProperty(app, 'password')\n  );\n\n  if (enable) {\n    try {\n      await adGuard.enable();\n    } catch (error) {\n      Consola.error((error as Error).message);\n    }\n    return;\n  }\n\n  try {\n    await adGuard.disable(duration);\n  } catch (error) {\n    Consola.error((error as Error).message);\n  }\n};\n\nconst processPiHole = async (app: ConfigAppType, enable: boolean, duration: number = 0) => {\n  const pihole = new PiHoleClient(app.url, findAppProperty(app, 'apiKey'));\n\n  if (enable) {\n    try {\n      await pihole.enable();\n    } catch (error) {\n      Consola.error((error as Error).message);\n    }\n    return;\n  }\n\n  try {\n    await pihole.disable(duration);\n  } catch (error) {\n    Consola.error((error as Error).message);\n  }\n};\n\nconst collectPiHoleSummary = async (app: ConfigAppType) => {\n  const piHole = new PiHoleClient(app.url, findAppProperty(app, 'apiKey'));\n  const summary = await piHole.getSummary().catch(() => {\n    return null;\n  });\n\n  if (!summary) {\n    return null;\n  }\n\n  return {\n    domainsBeingBlocked: summary.domains_being_blocked,\n    adsBlockedToday: summary.ads_blocked_today,\n    dnsQueriesToday: summary.dns_queries_today,\n    status: {\n      status: summary.status,\n      appId: app.id,\n    },\n    adsBlockedTodayPercentage: summary.ads_percentage_today,\n  };\n};\n\nconst collectAdGuardSummary = async (app: ConfigAppType) => {\n  const adGuard = new AdGuard(\n    app.url,\n    findAppProperty(app, 'username'),\n    findAppProperty(app, 'password')\n  );\n\n  const stats = await adGuard.getStats().catch(() => {\n    return null;\n  });\n\n  if (!stats) {\n    return null;\n  }\n\n  const status = await adGuard.getStatus();\n  const countFilteredDomains = await adGuard.getCountFilteringDomains();\n\n  const blockedQueriesToday =\n    stats.time_units === 'days'\n      ? stats.blocked_filtering[stats.blocked_filtering.length - 1]\n      : stats.blocked_filtering.reduce((prev, sum) => prev + sum, 0);\n  const queriesToday =\n    stats.time_units === 'days'\n      ? stats.dns_queries[stats.dns_queries.length - 1]\n      : stats.dns_queries.reduce((prev, sum) => prev + sum, 0);\n\n  return {\n    domainsBeingBlocked: countFilteredDomains,\n    adsBlockedToday: blockedQueriesToday,\n    dnsQueriesToday: queriesToday,\n    status: {\n      status: status.protection_enabled ? ('enabled' as const) : ('disabled' as const),\n      appId: app.id,\n    },\n    adsBlockedTodayPercentage: (queriesToday / blockedQueriesToday) * 100,\n  };\n};\n"
  },
  {
    "path": "src/server/api/routers/docker/DockerSingleton.ts",
    "content": "import Docker from 'dockerode';\nimport { env } from '~/env';\n\nexport default class DockerSingleton extends Docker {\n  private static dockerInstance: DockerSingleton;\n\n  private constructor() {\n    super();\n  }\n\n  public static getInstance(): DockerSingleton {\n    if (!DockerSingleton.dockerInstance) {\n      DockerSingleton.dockerInstance = new Docker({\n        host: env.DOCKER_HOST,\n        port: env.DOCKER_PORT,\n      });\n    }\n    return DockerSingleton.dockerInstance;\n  }\n}\n"
  },
  {
    "path": "src/server/api/routers/docker/router.ts",
    "content": "import { TRPCError } from '@trpc/server';\nimport Dockerode from 'dockerode';\nimport { z } from 'zod';\n\nimport { adminProcedure, createTRPCRouter } from '../../trpc';\nimport { IconRespositories } from '../icon';\nimport DockerSingleton from './DockerSingleton';\n\nconst dockerActionSchema = z.enum(['remove', 'start', 'stop', 'restart']);\n\nexport const dockerRouter = createTRPCRouter({\n  containers: adminProcedure.query(async () => {\n    try {\n      const docker = new Dockerode({});\n      const containers = await docker.listContainers({ all: true });\n      const fetches = IconRespositories.map((rep) => rep.fetch());\n      const data = await Promise.all(fetches);\n      const returnedData = containers.map((container) => {\n        const imageParsed = container.Image.split('/');\n        // Remove the version\n        const image = imageParsed[imageParsed.length - 1].split(':')[0];\n        const foundIcon = data\n          .flatMap((repository) =>\n            repository.entries.map((entry) => ({\n              ...entry,\n              repository: repository.name,\n            }))\n          )\n          .find((entry) => entry.name.toLowerCase().includes(image.toLowerCase()));\n\n        return {\n          ...container,\n          icon: foundIcon?.url ?? '/public/imgs/logo/logo.svg'\n        };\n      });\n      return returnedData;\n    } catch (err) {\n      throw new TRPCError({\n        code: 'INTERNAL_SERVER_ERROR',\n        message: 'Unable to get containers',\n      });\n    }\n  }),\n  action: adminProcedure\n    .input(\n      z.object({\n        id: z.string(),\n        action: dockerActionSchema,\n      })\n    )\n    .mutation(async ({ input }) => {\n      const docker = DockerSingleton.getInstance();\n      // Get the container with the ID\n      const container = docker.getContainer(input.id);\n      if (!container) {\n        throw new TRPCError({\n          code: 'NOT_FOUND',\n          message: 'Container not found',\n        });\n      }\n\n      // Perform the action\n      try {\n        await startAction(container, input.action);\n        return {\n          statusCode: 200,\n          message: `Container ${input.id} ${input.action}ed`,\n        };\n      } catch (err) {\n        throw new TRPCError({\n          code: 'INTERNAL_SERVER_ERROR',\n          message: `Unable to ${input.action} container ${input.id}`,\n        });\n      }\n    }),\n});\n\nconst startAction = async (\n  container: Dockerode.Container,\n  action: z.infer<typeof dockerActionSchema>\n) => {\n  switch (action) {\n    case 'remove':\n      return container.remove();\n    case 'start':\n      return container.start();\n    case 'stop':\n      return container.stop();\n    case 'restart':\n      return container.restart();\n    default:\n      return Promise;\n  }\n};\n"
  },
  {
    "path": "src/server/api/routers/download.ts",
    "content": "import { Deluge } from '@ctrl/deluge';\nimport { QBittorrent } from '@ctrl/qbittorrent';\nimport { AllClientData } from '@ctrl/shared-torrent';\nimport { Transmission } from '@ctrl/transmission';\nimport Consola from 'consola';\nimport dayjs from 'dayjs';\nimport { Client } from 'sabnzbd-api';\nimport { z } from 'zod';\nimport { NzbgetClient } from '~/server/api/routers/usenet/nzbget/nzbget-client';\nimport { NzbgetQueueItem, NzbgetStatus } from '~/server/api/routers/usenet/nzbget/types';\nimport { findAppProperty } from '~/tools/client/app-properties';\nimport { getConfig } from '~/tools/config/getConfig';\nimport {\n  NormalizedDownloadAppStat,\n  NormalizedDownloadQueueResponse,\n} from '~/types/api/downloads/queue/NormalizedDownloadQueueResponse';\nimport { ConfigAppType, IntegrationField } from '~/types/app';\nimport { UsenetQueueItem } from '~/widgets/useNet/types';\n\nimport { createTRPCRouter, publicProcedure } from '../trpc';\n\nexport const downloadRouter = createTRPCRouter({\n  get: publicProcedure\n    .input(\n      z.object({\n        configName: z.string(),\n      }),\n    )\n    .query(async ({ input }) => {\n      const config = getConfig(input.configName);\n\n      const failedClients: string[] = [];\n\n      const clientData: Promise<NormalizedDownloadAppStat>[] = config.apps.map(async (app) => {\n        try {\n          const response = await GetDataFromClient(app);\n\n          if (!response) {\n            return {\n              success: false,\n            } as NormalizedDownloadAppStat;\n          }\n\n          return response;\n        } catch (err: any) {\n          Consola.error(\n            `Error communicating with your download client '${app.name}' (${app.id}): ${err}`,\n          );\n          failedClients.push(app.id);\n          return {\n            success: false,\n          } as NormalizedDownloadAppStat;\n        }\n      });\n\n      const settledPromises = await Promise.allSettled(clientData);\n\n      const data: NormalizedDownloadAppStat[] = settledPromises\n        .filter((x) => x.status === 'fulfilled')\n        .map((promise) => (promise as PromiseFulfilledResult<NormalizedDownloadAppStat>).value)\n        .filter((x) => x !== undefined && x.type !== undefined);\n\n      const responseBody = {\n        apps: data,\n        failedApps: failedClients,\n      } as NormalizedDownloadQueueResponse;\n\n      if (failedClients.length > 0) {\n        Consola.warn(\n          `${failedClients.length} download clients failed. Please check your configuration and the above log`,\n        );\n      }\n\n      return responseBody;\n    }),\n});\n\nconst GetDataFromClient = async (\n  app: ConfigAppType,\n): Promise<NormalizedDownloadAppStat | undefined> => {\n  const reduceTorrent = (data: AllClientData): NormalizedDownloadAppStat => ({\n    type: 'torrent',\n    appId: app.id,\n    success: true,\n    torrents: data.torrents.map((torrent) => ({\n      name: torrent.name,\n      eta: torrent.eta,\n      state: torrent.state,\n      progress: torrent.progress,\n      totalSeeds: torrent.totalSeeds,\n      totalSelected: torrent.totalSelected,\n      totalPeers: torrent.totalPeers,\n      ratio: torrent.ratio,\n      uploadSpeed: torrent.uploadSpeed,\n      downloadSpeed: torrent.downloadSpeed,\n      isCompleted: torrent.isCompleted,\n      totalDownloaded: torrent.totalDownloaded,\n      totalUploaded: torrent.totalUploaded,\n      label: torrent.label,\n      queuePosition: torrent.queuePosition,\n      stateMessage: torrent.stateMessage,\n      dateAdded: torrent.dateAdded\n    })),\n    totalDownload: data.torrents\n      .map((torrent) => torrent.downloadSpeed)\n      .reduce((acc, torrent) => acc + torrent, 0),\n    totalUpload: data.torrents\n      .map((torrent) => torrent.uploadSpeed)\n      .reduce((acc, torrent) => acc + torrent, 0),\n  });\n\n  const findField = (app: ConfigAppType, field: IntegrationField) =>\n    app.integration?.properties.find((x) => x.field === field)?.value ?? undefined;\n\n  switch (app.integration?.type) {\n    case 'deluge': {\n      return reduceTorrent(\n        await new Deluge({\n          baseUrl: app.url,\n          password: findField(app, 'password'),\n        }).getAllData(),\n      );\n    }\n    case 'transmission': {\n      return reduceTorrent(\n        await new Transmission({\n          baseUrl: app.url,\n          username: findField(app, 'username'),\n          password: findField(app, 'password'),\n        }).getAllData(),\n      );\n    }\n    case 'qBittorrent': {\n      return reduceTorrent(\n        await new QBittorrent({\n          baseUrl: app.url,\n          username: findField(app, 'username'),\n          password: findField(app, 'password'),\n        }).getAllData(),\n      );\n    }\n    case 'sabnzbd': {\n      const { origin } = new URL(app.url);\n      const client = new Client(origin, findField(app, 'apiKey') ?? '');\n      const queue = await client.queue();\n      const items: UsenetQueueItem[] = queue.slots.map((slot) => {\n        const [hours, minutes, seconds] = slot.timeleft.split(':');\n        const eta = dayjs.duration({\n          hour: parseInt(hours, 10),\n          minutes: parseInt(minutes, 10),\n          seconds: parseInt(seconds, 10),\n        } as any);\n\n        return {\n          id: slot.nzo_id,\n          eta: eta.asSeconds(),\n          name: slot.filename,\n          progress: parseFloat(slot.percentage),\n          size: parseFloat(slot.mb) * 1000 * 1000,\n          state: slot.status.toLowerCase() as any,\n        };\n      });\n      const killobitsPerSecond = Number(queue.kbpersec);\n      const bytesPerSecond = killobitsPerSecond * 1024; // convert killobytes to bytes\n      return {\n        type: 'usenet',\n        appId: app.id,\n        totalDownload: bytesPerSecond,\n        nzbs: items,\n        success: true,\n      };\n    }\n    case 'nzbGet': {\n      const url = new URL(app.url);\n      const options = {\n        host: url.hostname,\n        port: url.port || (url.protocol === 'https:' ? '443' : '80'),\n        login: findAppProperty(app, 'username'),\n        hash: findAppProperty(app, 'password'),\n      };\n\n      const nzbGet = NzbgetClient(options);\n      const nzbgetQueue: NzbgetQueueItem[] = await new Promise((resolve, reject) => {\n        nzbGet.listGroups((err: any, result: NzbgetQueueItem[]) => {\n          if (!err) {\n            resolve(result);\n          } else {\n            Consola.error(`Error while listing groups: ${err}`);\n            reject(err);\n          }\n        });\n      });\n      if (!nzbgetQueue) {\n        throw new Error('Error while getting NZBGet queue');\n      }\n\n      const nzbgetStatus: NzbgetStatus = await new Promise((resolve, reject) => {\n        nzbGet.status((err: any, result: NzbgetStatus) => {\n          if (!err) {\n            resolve(result);\n          } else {\n            Consola.error(`Error while retrieving NZBGet stats: ${err}`);\n            reject(err);\n          }\n        });\n      });\n\n      if (!nzbgetStatus) {\n        throw new Error('Error while getting NZBGet status');\n      }\n\n      const nzbgetItems: UsenetQueueItem[] = nzbgetQueue.map((item: NzbgetQueueItem) => ({\n        id: item.NZBID.toString(),\n        name: item.NZBName,\n        progress: (item.DownloadedSizeMB / item.FileSizeMB) * 100,\n        eta: (item.RemainingSizeMB * 1000000) / nzbgetStatus.DownloadRate,\n        // Multiple MB to get bytes\n        size: item.FileSizeMB * 1000 * 1000,\n        state: getNzbgetState(item.Status),\n      }));\n\n      return {\n        type: 'usenet',\n        appId: app.id,\n        nzbs: nzbgetItems,\n        success: true,\n        totalDownload: nzbgetStatus.DownloadRate,\n      };\n    }\n    default:\n      return undefined;\n  }\n};\n\nfunction getNzbgetState(status: string) {\n  switch (status) {\n    case 'QUEUED':\n      return 'queued';\n    case 'PAUSED ':\n      return 'paused';\n    default:\n      return 'downloading';\n  }\n}\n"
  },
  {
    "path": "src/server/api/routers/health-monitoring/openmediavault.ts",
    "content": "import axios from 'axios';\nimport Consola from 'consola';\nimport { checkIntegrationsType, findAppProperty } from '~/tools/client/app-properties';\nimport { getConfig } from '~/tools/config/getConfig';\nimport { ConfigAppType } from '~/types/app';\n\nlet sessionId: string | null = null;\nlet loginToken: string | null = null;\n\nasync function makeOpenMediaVaultRPCCall(\n  serviceName: string,\n  method: string,\n  params: Record<string, any>,\n  headers: Record<string, string>,\n  input: { configName: string }\n) {\n  const config = getConfig(input.configName);\n  const app = config.apps.find((app) => checkIntegrationsType(app.integration, ['openmediavault']));\n\n  if (!app) {\n    Consola.error(`App 'openmediavault' not found for configName '${input.configName}'`);\n    return null;\n  }\n\n  const appUrl = new URL(app.url);\n  const response = await axios.post(\n    `${appUrl.origin}/rpc.php`,\n    {\n      service: serviceName,\n      method: method,\n      params: params,\n    },\n    {\n      headers: {\n        'Content-Type': 'application/json',\n        ...headers,\n      },\n    }\n  );\n  return response;\n}\n\nexport async function makeOpenMediaVaultCalls(app: ConfigAppType, input: any) {\n  let authResponse: any = null;\n\n  if (!sessionId || !loginToken) {\n    if (!app) {\n      Consola.error(\n        `Failed to process request to app 'openmediavault'. Please check username & password`\n      );\n      return null;\n    }\n\n    authResponse = await makeOpenMediaVaultRPCCall(\n      'session',\n      'login',\n      {\n        username: findAppProperty(app, 'username'),\n        password: findAppProperty(app, 'password'),\n      },\n      {},\n      input\n    );\n\n    if (authResponse.data.response.sessionid) {\n      sessionId = authResponse.data.response.sessionid;\n    } else {\n      const cookies = authResponse.headers['set-cookie'] || [];\n      sessionId = cookies\n        .find(\n          (cookie: any) =>\n            cookie.includes('X-OPENMEDIAVAULT-SESSIONID') ||\n            cookie.includes('OPENMEDIAVAULT-SESSIONID')\n        )\n        ?.split(';')[0];\n\n      loginToken = cookies\n        .find(\n          (cookie: any) =>\n            cookie.includes('X-OPENMEDIAVAULT-LOGIN') || cookie.includes('OPENMEDIAVAULT-LOGIN')\n        )\n        ?.split(';')[0];\n    }\n\n    const responses = await Promise.allSettled([\n      makeOpenMediaVaultRPCCall(\n        'system',\n        'getInformation',\n        {},\n        loginToken\n          ? { Cookie: `${loginToken};${sessionId}` }\n          : { 'X-OPENMEDIAVAULT-SESSIONID': sessionId as string },\n        input\n      ),\n      makeOpenMediaVaultRPCCall(\n        'filesystemmgmt',\n        'enumerateMountedFilesystems',\n        { includeroot: true },\n        loginToken\n          ? { Cookie: `${loginToken};${sessionId}` }\n          : { 'X-OPENMEDIAVAULT-SESSIONID': sessionId as string },\n        input\n      ),\n      makeOpenMediaVaultRPCCall(\n        'cputemp',\n        'get',\n        {},\n        loginToken\n          ? { Cookie: `${loginToken};${sessionId}` }\n          : { 'X-OPENMEDIAVAULT-SESSIONID': sessionId as string },\n        input\n      ),\n    ]);\n\n    const systemInfoResponse =\n      responses[0].status === 'fulfilled' && responses[0].value\n        ? responses[0].value.data?.response\n        : null;\n    const fileSystemResponse =\n      responses[1].status === 'fulfilled' && responses[1].value\n        ? responses[1].value.data?.response\n        : null;\n    const cpuTempResponse =\n      responses[2].status === 'fulfilled' && responses[2].value\n        ? responses[2].value.data?.response\n        : null;\n\n    return {\n      systemInfo: systemInfoResponse,\n      fileSystem: fileSystemResponse,\n      cpuTemp: cpuTempResponse,\n    };\n  }\n}\n"
  },
  {
    "path": "src/server/api/routers/health-monitoring/proxmox.ts",
    "content": "import axios from 'axios';\nimport Consola from 'consola';\nimport https from 'https';\nimport { findAppProperty } from '~/tools/client/app-properties';\nimport { ConfigAppType } from '~/types/app';\nimport { ResourceData, ResourceSummary } from '~/widgets/health-monitoring/cluster/types';\n\nexport async function makeProxmoxStatusAPICall(app: ConfigAppType, input: any) {\n  if (!app) {\n    Consola.error(`App 'proxmox' not found for configName '${input.configName}'`);\n    return null;\n  }\n\n  const apiKey = findAppProperty(app, 'apiKey');\n  if (!apiKey) {\n    Consola.error(`'proxmox': Missing API key. Please check the configuration.`);\n    return null;\n  }\n\n  const appUrl = new URL('api2/json/cluster/resources', app.url);\n  const agent = input.ignoreCerts\n    ? new https.Agent({ rejectUnauthorized: false, requestCert: false })\n    : new https.Agent();\n\n  const result = await axios\n    .get(appUrl.toString(), {\n      headers: {\n        Authorization: `PVEAPIToken=${apiKey}`,\n      },\n      httpsAgent: agent,\n    })\n    .catch((error) => {\n      Consola.error(\n        `'proxmox': Error accessing service API: '${appUrl}'. The following error was returned: ${error}`\n      );\n      return null;\n    })\n    .then((res) => {\n      let resources: ResourceSummary = { vms: [], lxcs: [], nodes: [], storage: [] };\n\n      if (!res) return null;\n\n      res.data.data.forEach((item: any) => {\n        if (input.filterNode === '' || input.filterNode === item.node) {\n          let resource: ResourceData = {\n            id: item.id,\n            cpu: item.cpu ? item.cpu : 0,\n            maxCpu: item.maxcpu ? item.maxcpu : 0,\n            maxMem: item.maxmem ? item.maxmem : 0,\n            mem: item.mem ? item.mem : 0,\n            name: item.name,\n            node: item.node,\n            status: item.status,\n            running: false,\n            type: item.type,\n            uptime: item.uptime,\n            vmId: item.vmid,\n            netIn: item.netin,\n            netOut: item.netout,\n            diskRead: item.diskread,\n            diskWrite: item.diskwrite,\n            disk: item.disk,\n            maxDisk: item.maxdisk,\n            haState: item.hastate,\n            storagePlugin: item.plugintype,\n            storageShared: item.shared == 1,\n          };\n          if (item.template == 0) {\n            if (item.type === 'qemu') {\n              resource.running = resource.status === 'running';\n              resources.vms.push(resource);\n            } else if (item.type === 'lxc') {\n              resource.running = resource.status === 'running';\n              resources.lxcs.push(resource);\n            }\n          } else if (item.type === 'node') {\n            resource.name = item.node;\n            resource.running = resource.status === 'online';\n            resources.nodes.push(resource);\n          } else if (item.type === 'storage') {\n            resource.name = item.storage;\n            resource.running = resource.status === 'available';\n            resources.storage.push(resource);\n          }\n        }\n      });\n\n      // results must be sorted; proxmox api result order can change dynamically,\n      // so sort the data to keep the item positions consistent\n      const sorter = (a: ResourceData, b: ResourceData) => {\n        if (a.id < b.id) {\n          return -1;\n        }\n        if (a.id > b.id) {\n          return 1;\n        }\n        return 0;\n      };\n\n      resources.nodes.sort(sorter);\n      resources.lxcs.sort(sorter);\n      resources.storage.sort(sorter);\n      resources.vms.sort(sorter);\n\n      return resources;\n    });\n\n  return result;\n}\n"
  },
  {
    "path": "src/server/api/routers/health-monitoring/router.ts",
    "content": "import Consola from 'consola';\nimport { z } from 'zod';\nimport { checkIntegrationsType } from '~/tools/client/app-properties';\nimport { getConfig } from '~/tools/config/getConfig';\n\nimport { createTRPCRouter, publicProcedure } from '../../trpc';\nimport { makeOpenMediaVaultCalls } from './openmediavault';\nimport { makeProxmoxStatusAPICall } from './proxmox';\n\nexport const healthMonitoringRouter = createTRPCRouter({\n  integrations: publicProcedure\n    .input(\n      z.object({\n        configName: z.string(),\n      })\n    )\n    .query(async ({ input }) => {\n      const config = getConfig(input.configName);\n      const apps = config.apps.map((app) => {\n        if (checkIntegrationsType(app.integration, ['proxmox', 'openmediavault'])) {\n          return app.integration.type;\n        }\n      });\n\n      return apps;\n    }),\n  fetchData: publicProcedure\n    .input(\n      z.object({\n        configName: z.string(),\n        filterNode: z.string(),\n        ignoreCerts: z.boolean(),\n      })\n    )\n    .query(async ({ input }) => {\n      const config = getConfig(input.configName);\n      const omvApp = config.apps.find((app) =>\n        checkIntegrationsType(app.integration, ['openmediavault'])\n      );\n      const proxApp = config.apps.find((app) =>\n        checkIntegrationsType(app.integration, ['proxmox'])\n      );\n\n      if (!omvApp && !proxApp) {\n        Consola.error(`No valid integrations found for health monitoring in '${input.configName}'`);\n        return null;\n      }\n\n      let systemData: any;\n      let clusterData: any;\n\n      try {\n        const results = await Promise.all([\n          omvApp ? makeOpenMediaVaultCalls(omvApp, input) : null,\n          proxApp ? makeProxmoxStatusAPICall(proxApp, input) : null,\n        ]);\n\n        for (const response of results) {\n          if (response) {\n            if ('systemInfo' in response && response.systemInfo != null) {\n              systemData = response;\n            } else if ('nodes' in response) {\n              clusterData = response;\n            }\n          }\n        }\n      } catch (error) {\n        Consola.error(`Error executing health monitoring requests(s): ${error}`);\n        return null;\n      }\n\n      return {\n        system: systemData,\n        cluster: clusterData,\n      };\n    }),\n});\n"
  },
  {
    "path": "src/server/api/routers/icon.ts",
    "content": "import { GitHubIconsRepository } from '~/tools/server/images/github-icons-repository';\nimport { JsdelivrIconsRepository } from '~/tools/server/images/jsdelivr-icons-repository';\nimport { LocalIconsRepository } from '~/tools/server/images/local-icons-repository';\nimport { UnpkgIconsRepository } from '~/tools/server/images/unpkg-icons-repository';\n\nimport { createTRPCRouter, publicProcedure } from '../trpc';\nimport { z } from 'zod';\nimport { NormalizedIconRepositoryResult } from '~/tools/server/images/abstract-icons-repository';\n\nexport const IconRespositories = [\n  new LocalIconsRepository(),\n  new GitHubIconsRepository(\n    GitHubIconsRepository.walkxcode,\n    'Walkxcode Dashboard Icons',\n    'Walkxcode on Github',\n  ),\n  new UnpkgIconsRepository(\n    UnpkgIconsRepository.tablerRepository,\n    'Tabler Icons',\n    'Tabler Icons - GitHub (MIT)',\n  ),\n  new JsdelivrIconsRepository(\n    JsdelivrIconsRepository.papirusRepository,\n    'Papirus Icons',\n    'Papirus Development Team on GitHub (Apache 2.0)',\n  ),\n  new JsdelivrIconsRepository(\n    JsdelivrIconsRepository.homelabSvgAssetsRepository,\n    'Homelab Svg Assets',\n    'loganmarchione on GitHub (MIT)',\n  ),\n];\n\nexport const iconRouter = createTRPCRouter({\n  all: publicProcedure\n    .meta({ openapi: { method: 'GET', path: '/icons', tags: ['icon'] } })\n    .input(z.void())\n    .output(z.array(z.custom<NormalizedIconRepositoryResult>()))\n    .query(async () => {\n      const fetches = IconRespositories.map((rep) => rep.fetch());\n      return await Promise.all(fetches);\n    }),\n});\n"
  },
  {
    "path": "src/server/api/routers/indexer-manager.ts",
    "content": "import axios from 'axios';\nimport Consola from 'consola';\nimport { z } from 'zod';\nimport { checkIntegrationsType, findAppProperty } from '~/tools/client/app-properties';\nimport { getConfig } from '~/tools/config/getConfig';\nimport { IntegrationType } from '~/types/app';\n\nimport { createTRPCRouter, protectedProcedure, publicProcedure } from '../trpc';\n\nexport const indexerManagerRouter = createTRPCRouter({\n  indexers: publicProcedure\n    .input(\n      z.object({\n        configName: z.string(),\n      })\n    )\n    .query(async ({ input }) => {\n      const config = getConfig(input.configName);\n      const indexerAppIntegrationTypes = ['prowlarr'] as const satisfies readonly IntegrationType[];\n      const app = config.apps.find((app) =>\n        checkIntegrationsType(app.integration, indexerAppIntegrationTypes)\n      )!;\n      const apiKey = findAppProperty(app, 'apiKey');\n      if (!app || !apiKey) {\n        Consola.error(\n          `Failed to process request to indexer app (${app.id}): API key not found. Please check the configuration.`\n        );\n      }\n\n      const appUrl = new URL(app.url);\n      const data = await axios\n        .get(`${appUrl.origin}/api/v1/indexer`, {\n          headers: {\n            'X-Api-Key': apiKey,\n          },\n        })\n        .then((res) => res.data);\n      return data;\n    }),\n\n  statuses: publicProcedure\n    .input(\n      z.object({\n        configName: z.string(),\n      })\n    )\n    .query(async ({ input }) => {\n      const config = getConfig(input.configName);\n      const indexerAppIntegrationTypes = ['prowlarr'] as const satisfies readonly IntegrationType[];\n      const app = config.apps.find((app) =>\n        checkIntegrationsType(app.integration, indexerAppIntegrationTypes)\n      )!;\n      const apiKey = findAppProperty(app, 'apiKey');\n      if (!app || !apiKey) {\n        Consola.error(\n          `Failed to process request to indexer app (${app.id}): API key not found. Please check the configuration.`\n        );\n      }\n\n      const appUrl = new URL(app.url);\n      const data = await axios\n        .get(`${appUrl.origin}/api/v1/indexerstatus`, {\n          headers: {\n            'X-Api-Key': apiKey,\n          },\n        })\n        .then((res) => res.data);\n      return data;\n    }),\n\n  testAllIndexers: protectedProcedure\n    .input(\n      z.object({\n        configName: z.string(),\n      })\n    )\n    .mutation(async ({ input }) => {\n      const config = getConfig(input.configName);\n      const indexerAppIntegrationTypes = ['prowlarr'] as const satisfies readonly IntegrationType[];\n      const app = config.apps.find((app) =>\n        checkIntegrationsType(app.integration, indexerAppIntegrationTypes)\n      )!;\n      const apiKey = findAppProperty(app, 'apiKey');\n      if (!app || !apiKey) {\n        Consola.error(\n          `failed to process request to app '${app?.integration}' (${app?.id}). Please check api key`\n        );\n      }\n\n      const appUrl = new URL(app.url);\n      const result = await axios\n        .post(`${appUrl.origin}/api/v1/indexer/testall`, null, {\n          headers: {\n            'X-Api-Key': apiKey,\n          },\n        })\n        .then((res) => res.data)\n        .catch((err: any) => err.response.data);\n\n      return result;\n    }),\n});\n"
  },
  {
    "path": "src/server/api/routers/invite/invite-router.spec.ts",
    "content": "import dayjs from 'dayjs';\nimport { eq } from 'drizzle-orm';\nimport { migrate } from 'drizzle-orm/better-sqlite3/migrator';\nimport { Session, User } from 'next-auth';\nimport { v4 } from 'uuid';\nimport { afterEach, beforeEach, describe, expect, test, vi } from 'vitest';\nimport { db, sqlite } from '~/server/db';\nimport { invites, users } from '~/server/db/schema';\nimport { inviteRouter } from './invite-router';\n\nconst sessionMock = (user?: Partial<User>): Session => ({\n  user: {\n    id: user?.id ?? '123',\n    name: user?.name ?? 'John Doe',\n    language: user?.language ?? 'en',\n    colorScheme: user?.colorScheme ?? 'dark',\n    autoFocusSearch: user?.autoFocusSearch ?? false,\n    isAdmin: user?.isAdmin ?? false,\n  },\n  expires: '1',\n});\n\ndescribe('invite router', () => {\n  beforeEach(async () => {\n    vi.stubEnv('DATABASE_URL', ':memory:');\n    migrate(db, { migrationsFolder: './drizzle' });\n  });\n\n  afterEach(async () => {\n    // Delete all data from database\n    const tables = sqlite.prepare(`select name from sqlite_master where type = 'table';`).all() as {\n      name: string;\n    }[];\n    for (const table of tables) {\n      if (table.name.startsWith('__')) continue;\n      sqlite.prepare(`delete from ${table.name}`).run();\n    }\n  });\n\n  test('Admin procedure check', async () => {\n    const caller = inviteRouter.createCaller({\n      session: sessionMock(),\n      cookies: {},\n    });\n\n    await expect(\n      (async () => {\n        await caller.all({ page: 0 });\n      })()\n    ).rejects.toThrowError('FORBIDDEN');\n  });\n\n  test('All invites should return invites from database', async () => {\n    const expireDate = new Date(2021, 1, 1);\n    await db.insert(users).values({\n      id: '123',\n      name: 'John Doe',\n    });\n    await db.insert(invites).values({\n      id: '123',\n      createdById: '123',\n      expires: expireDate,\n      token: 'token',\n    });\n    await db.insert(invites).values({\n      id: v4(),\n      createdById: '123',\n      expires: expireDate,\n      token: v4(),\n    });\n\n    const caller = inviteRouter.createCaller({\n      session: sessionMock({ isAdmin: true }),\n      cookies: {},\n    });\n\n    const result = await caller.all({ page: 0, limit: 1 });\n\n    expect(result.countPages).toEqual(2);\n    expect(result.invites[0]).toStrictEqual({\n      id: '123',\n      creator: 'John Doe',\n      expires: expireDate,\n    });\n  });\n\n  test('Create should create new invite in database with expiration in 6 minutes', async () => {\n    const expireDate = dayjs().add(6, 'minutes').set('milliseconds', 0).toDate();\n    await db.insert(users).values({\n      id: '123',\n      name: 'John Doe',\n    });\n\n    const caller = inviteRouter.createCaller({\n      session: sessionMock({ isAdmin: true }),\n      cookies: {},\n    });\n\n    const result = await caller.create({ expiration: expireDate });\n\n    const dbInvite = await db.query.invites.findFirst({\n      where: eq(invites.id, result.id),\n    });\n\n    expect(result.id).toBeDefined();\n    expect(result.expires).toEqual(expireDate);\n    expect(result.token).toHaveLength(40);\n    expect(dbInvite).toStrictEqual({\n      id: result.id,\n      createdById: '123',\n      expires: expireDate,\n      token: result.token,\n    });\n  });\n\n  test('Create should create new invite in database with expiration in 30 days', async () => {\n    const expireDate = dayjs().add(6, 'months').add(-1, 'minute').set('milliseconds', 0).toDate();\n    await db.insert(users).values({\n      id: '123',\n      name: 'John Doe',\n    });\n\n    const caller = inviteRouter.createCaller({\n      session: sessionMock({ isAdmin: true }),\n      cookies: {},\n    });\n\n    const result = await caller.create({ expiration: expireDate });\n\n    const dbInvite = await db.query.invites.findFirst({\n      where: eq(invites.id, result.id),\n    });\n\n    expect(result.id).toBeDefined();\n    expect(result.expires).toEqual(expireDate);\n    expect(result.token).toHaveLength(40);\n    expect(dbInvite).toStrictEqual({\n      id: result.id,\n      createdById: '123',\n      expires: expireDate,\n      token: result.token,\n    });\n  });\n\n  test('Create should throw too_small with expiration in 4 minutes', async () => {\n    const expireDate = dayjs().add(4, 'minutes').set('milliseconds', 0).toDate();\n    await db.insert(users).values({\n      id: '123',\n      name: 'John Doe',\n    });\n\n    const caller = inviteRouter.createCaller({\n      session: sessionMock({ isAdmin: true }),\n      cookies: {},\n    });\n\n    const act = async () => await caller.create({ expiration: expireDate });\n\n    expect(act).rejects.toThrowError(/\"code\": \"too_small\"/);\n  });\n\n  test('Create should throw too_big with expiration in 7 months', async () => {\n    const expireDate = dayjs().add(7, 'months').set('milliseconds', 0).toDate();\n    await db.insert(users).values({\n      id: '123',\n      name: 'John Doe',\n    });\n\n    const caller = inviteRouter.createCaller({\n      session: sessionMock({ isAdmin: true }),\n      cookies: {},\n    });\n\n    const act = async () => await caller.create({ expiration: expireDate });\n\n    expect(act).rejects.toThrowError(/\"code\": \"too_big\"/);\n  });\n\n  test('Delete should delete invite from database', async () => {\n    const inviteId = '123';\n    await db.insert(users).values({\n      id: '123',\n      name: 'John Doe',\n    });\n    await db.insert(invites).values({\n      id: inviteId,\n      createdById: '123',\n      expires: new Date(2023, 1, 1),\n      token: 'token',\n    });\n\n    const caller = inviteRouter.createCaller({\n      session: sessionMock({ isAdmin: true }),\n      cookies: {},\n    });\n\n    await caller.delete({ id: inviteId });\n\n    const dbInvite = await db.query.invites.findFirst({\n      where: eq(invites.id, inviteId),\n    });\n\n    expect(dbInvite).toBeUndefined();\n  });\n\n  test('Delete should delete invite from database', async () => {\n    const inviteId = '123';\n    await db.insert(users).values({\n      id: '123',\n      name: 'John Doe',\n    });\n    await db.insert(invites).values({\n      id: inviteId,\n      createdById: '123',\n      expires: new Date(2023, 1, 1),\n      token: 'token',\n    });\n\n    const caller = inviteRouter.createCaller({\n      session: sessionMock({ isAdmin: true }),\n      cookies: {},\n    });\n\n    await caller.delete({ id: inviteId });\n\n    const dbInvite = await db.query.invites.findFirst({\n      where: eq(invites.id, inviteId),\n    });\n\n    expect(dbInvite).toBeUndefined();\n  });\n});\n"
  },
  {
    "path": "src/server/api/routers/invite/invite-router.ts",
    "content": "import { randomBytes, randomUUID } from 'crypto';\nimport dayjs from 'dayjs';\nimport { eq, sql } from 'drizzle-orm';\nimport { z } from 'zod';\nimport { db } from '~/server/db';\nimport { invites } from '~/server/db/schema';\n\nimport { adminProcedure, createTRPCRouter } from '../../trpc';\n\nexport const inviteRouter = createTRPCRouter({\n  all: adminProcedure\n    .meta({ openapi: { method: 'GET', path: '/invites', tags: ['invite'] } })\n    .input(\n      z.object({\n        limit: z.number().min(1).max(100).default(10),\n        page: z.number().min(0),\n      }),\n    )\n    .output(z.object({\n      invites: z.array(z.object({\n        id: z.string(),\n        expires: z.date(),\n        creator: z.string().or(z.null()),\n      })),\n      countPages: z.number().min(0),\n    }))\n    .query(async ({ input }) => {\n      const limit = input.limit;\n      const dbInvites = await db.query.invites.findMany({\n        limit: limit,\n        offset: limit * input.page,\n        with: {\n          createdBy: {\n            columns: {\n              name: true,\n            },\n          },\n        },\n      });\n\n      const inviteCount = await db\n        .select({ count: sql<number>`count(*)` })\n        .from(invites)\n        .then((rows) => rows[0].count);\n\n      return {\n        invites: dbInvites.map((token) => ({\n          id: token.id,\n          expires: token.expires,\n          creator: token.createdBy.name,\n        })),\n        countPages: Math.ceil(inviteCount / limit),\n      };\n    }),\n  create: adminProcedure\n    .meta({ openapi: { method: 'POST', path: '/invites', tags: ['invite'] } })\n    .input(\n      z.object({\n        expiration: z\n          .date()\n          .min(dayjs().add(5, 'minutes').toDate())\n          .max(dayjs().add(6, 'months').toDate()),\n      }),\n    )\n    .output(z.object({\n      id: z.string(),\n      token: z.string(),\n      expires: z.date(),\n    }))\n    .mutation(async ({ ctx, input }) => {\n      const inviteToInsert = {\n        id: randomUUID(),\n        expires: input.expiration,\n        createdById: ctx.session.user.id,\n        token: randomBytes(20).toString('hex'),\n      };\n      await db.insert(invites).values(inviteToInsert);\n\n      return {\n        id: inviteToInsert.id,\n        token: inviteToInsert.token,\n        expires: inviteToInsert.expires,\n      };\n    }),\n  delete: adminProcedure\n    .meta({ openapi: { method: 'DELETE', path: '/invites', tags: ['invite'] } })\n    .input(z.object({ id: z.string() }))\n    .output(z.void())\n    .mutation(async ({ input }) => {\n      await db.delete(invites).where(eq(invites.id, input.id));\n    }),\n});\n"
  },
  {
    "path": "src/server/api/routers/media-request.ts",
    "content": "import Consola from 'consola';\nimport { removeTrailingSlash } from 'next/dist/shared/lib/router/utils/remove-trailing-slash';\nimport { z } from 'zod';\nimport { checkIntegrationsType } from '~/tools/client/app-properties';\nimport { getConfig } from '~/tools/config/getConfig';\nimport { MediaRequestListWidget } from '~/widgets/media-requests/MediaRequestListTile';\nimport { MediaRequestStatsWidget } from '~/widgets/media-requests/MediaRequestStatsTile';\nimport { MediaRequest, Users } from '~/widgets/media-requests/media-request-types';\n\nimport { createTRPCRouter, publicProcedure } from '../trpc';\n\nexport const mediaRequestsRouter = createTRPCRouter({\n  allMedia: publicProcedure\n    .input(\n      z.object({\n        configName: z.string(),\n        widget: z.custom<MediaRequestListWidget>().or(z.custom<MediaRequestStatsWidget>()),\n      })\n    )\n    .query(async ({ input }) => {\n      const config = getConfig(input.configName);\n\n      const apps = config.apps.filter((app) =>\n        checkIntegrationsType(app.integration, ['overseerr', 'jellyseerr'])\n      );\n\n      const promises = apps.map((app): Promise<MediaRequest[]> => {\n        const apiKey =\n          app.integration?.properties.find((prop) => prop.field === 'apiKey')?.value ?? '';\n        const headers: HeadersInit = { 'X-Api-Key': apiKey };\n        return fetch(`${app.url}/api/v1/request?take=25&skip=0&sort=added`, {\n          headers,\n        })\n          .then(async (response) => {\n            const body = (await response.json()) as OverseerrResponse;\n            let appUrl =\n              input.widget.properties.replaceLinksWithExternalHost &&\n              app.behaviour.externalUrl?.length > 0\n                ? app.behaviour.externalUrl\n                : app.url;\n\n            appUrl = removeTrailingSlash(appUrl);\n\n            const requests = await Promise.all(\n              body.results.map(async (item): Promise<MediaRequest> => {\n                const genericItem = await retrieveDetailsForItem(\n                  app.url,\n                  item.type,\n                  headers,\n                  item.media.tmdbId\n                );\n                return {\n                  appId: app.id,\n                  createdAt: item.createdAt,\n                  id: item.id,\n                  rootFolder: item.rootFolder,\n                  type: item.type,\n                  name: genericItem.name,\n                  userName: item.requestedBy.displayName,\n                  userProfilePicture: constructAvatarUrl(appUrl, item.requestedBy.avatar),\n                  fallbackUserProfilePicture: constructAvatarUrl(appUrl, item.requestedBy.avatar,'avatarproxy'),\n                  userLink: `${appUrl}/users/${item.requestedBy.id}`,\n                  userRequestCount: item.requestedBy.requestCount,\n                  airDate: genericItem.airDate,\n                  status: item.status,\n                  availability: item.is4k ? item.media.status4k : item.media.status,\n                  backdropPath: `https://image.tmdb.org/t/p/original/${genericItem.backdropPath}`,\n                  posterPath: `https://image.tmdb.org/t/p/w600_and_h900_bestv2/${genericItem.posterPath}`,\n                  href: `${appUrl}/${item.type}/${item.media.tmdbId}`,\n                };\n              })\n            );\n\n            return Promise.resolve(requests);\n          })\n          .catch((err) => {\n            Consola.error(`Failed to request data from Overseerr: ${err}`);\n            return Promise.resolve([]);\n          });\n      });\n\n      const mediaRequests = (await Promise.all(promises)).reduce(\n        (prev, cur) => prev.concat(cur),\n        []\n      );\n\n      return mediaRequests;\n    }),\n  users: publicProcedure\n    .input(\n      z.object({\n        configName: z.string(),\n        widget: z.custom<MediaRequestListWidget>().or(z.custom<MediaRequestStatsWidget>()),\n      })\n    )\n    .query(async ({ input }) => {\n      const config = getConfig(input.configName);\n\n      const apps = config.apps.filter((app) =>\n        checkIntegrationsType(app.integration, ['overseerr', 'jellyseerr'])\n      );\n\n      const promises = apps.map((app): Promise<Users[]> => {\n        const apiKey =\n          app.integration?.properties.find((prop) => prop.field === 'apiKey')?.value ?? '';\n        const headers: HeadersInit = { 'X-Api-Key': apiKey };\n        return fetch(`${app.url}/api/v1/user?take=25&skip=0&sort=requests`, {\n          headers,\n        })\n          .then(async (response) => {\n            const body = (await response.json()) as OverseerrUsers;\n            const appUrl = input.widget.properties.replaceLinksWithExternalHost\n              ? app.behaviour.externalUrl\n              : app.url;\n\n            const users = await Promise.all(\n              body.results.map(async (user): Promise<Users> => {\n                return {\n                  app: app.integration?.type ?? 'overseerr',\n                  id: user.id,\n                  userName: user.displayName,\n                  userProfilePicture: constructAvatarUrl(appUrl, user.avatar),\n                  fallbackUserProfilePicture: constructAvatarUrl(appUrl, user.avatar,'avatarproxy'),\n                  userLink: `${appUrl}/users/${user.id}`,\n                  userRequestCount: user.requestCount,\n                };\n              })\n            );\n            return Promise.resolve(users);\n          })\n          .catch((err) => {\n            Consola.error(`Failed to request users from Overseerr: ${err}`);\n            return Promise.resolve([]);\n          });\n      });\n      const users = (await Promise.all(promises)).reduce((prev, cur) => prev.concat(cur), []);\n\n      return users;\n    }),\n});\n\nconst constructAvatarUrl = (appUrl: string, avatar: string, path?: string) => {\n  const isAbsolute = avatar.startsWith('http://') || avatar.startsWith('https://');\n\n  if (isAbsolute) {\n    return avatar;\n  }\n\n  return `${appUrl}/${path?.concat(\"/\") ?? \"\" }${avatar}`;\n};\n\nconst retrieveDetailsForItem = async (\n  baseUrl: string,\n  type: OverseerrResponseItem['type'],\n  headers: HeadersInit,\n  id: number\n): Promise<GenericOverseerrItem> => {\n  if (type === 'tv') {\n    const tvResponse = await fetch(`${baseUrl}/api/v1/tv/${id}`, {\n      headers,\n    });\n\n    const series = (await tvResponse.json()) as OverseerrSeries;\n\n    return {\n      name: series.name,\n      airDate: series.firstAirDate,\n      backdropPath: series.backdropPath,\n      posterPath: series.posterPath ?? series.backdropPath,\n    };\n  }\n\n  const movieResponse = await fetch(`${baseUrl}/api/v1/movie/${id}`, {\n    headers,\n  });\n\n  const movie = (await movieResponse.json()) as OverseerrMovie;\n\n  return {\n    name: movie.title,\n    airDate: movie.releaseDate,\n    backdropPath: movie.backdropPath,\n    posterPath: movie.posterPath,\n  };\n};\n\ntype GenericOverseerrItem = {\n  name: string;\n  airDate: string;\n  backdropPath: string;\n  posterPath: string;\n};\n\ntype OverseerrMovie = {\n  title: string;\n  releaseDate: string;\n  backdropPath: string;\n  posterPath: string;\n};\n\ntype OverseerrSeries = {\n  name: string;\n  firstAirDate: string;\n  backdropPath: string;\n  posterPath: string;\n};\n\ntype OverseerrResponse = {\n  results: OverseerrResponseItem[];\n};\n\ntype OverseerrUsers = {\n  results: OverseerrResponseItemUser[];\n};\n\ntype OverseerrResponseItem = {\n  id: number;\n  status: number;\n  createdAt: string;\n  type: 'movie' | 'tv';\n  is4k: boolean;\n  rootFolder: string;\n  requestedBy: OverseerrResponseItemUser;\n  media: OverseerrResponseItemMedia;\n};\n\ntype OverseerrResponseItemMedia = {\n  tmdbId: number;\n  status: number;\n  status4k: number;\n};\n\ntype OverseerrResponseItemUser = {\n  id: number;\n  displayName: string;\n  avatar: string;\n  requestCount: number;\n};\n"
  },
  {
    "path": "src/server/api/routers/media-server.ts",
    "content": "import { Jellyfin } from '@jellyfin/sdk';\nimport { BaseItemKind } from '@jellyfin/sdk/lib/generated-client/models';\nimport { getSessionApi } from '@jellyfin/sdk/lib/utils/api/session-api';\nimport { getSystemApi } from '@jellyfin/sdk/lib/utils/api/system-api';\nimport Consola from 'consola';\nimport { z } from 'zod';\nimport { checkIntegrationsType, findAppProperty } from '~/tools/client/app-properties';\nimport { getConfig } from '~/tools/config/getConfig';\nimport { PlexClient } from '~/tools/server/sdk/plex/plexClient';\nimport { trimStringEnding } from '~/tools/shared/strings';\nimport { GenericMediaServer } from '~/types/api/media-server/media-server';\nimport { MediaServersResponseType } from '~/types/api/media-server/response';\nimport { GenericCurrentlyPlaying, GenericSessionInfo } from '~/types/api/media-server/session-info';\nimport { ConfigAppType } from '~/types/app';\n\nimport { createTRPCRouter, publicProcedure } from '../trpc';\n\nconst jellyfin = new Jellyfin({\n  clientInfo: {\n    name: 'Homarr',\n    version: '0.0.1',\n  },\n  deviceInfo: {\n    name: 'Homarr Jellyfin Widget',\n    id: 'homarr-jellyfin-widget',\n  },\n});\n\nexport const mediaServerRouter = createTRPCRouter({\n  all: publicProcedure\n    .input(\n      z.object({\n        configName: z.string(),\n      })\n    )\n    .query(async ({ input }) => {\n      const config = getConfig(input.configName);\n\n      const apps = config.apps.filter((app) =>\n        checkIntegrationsType(app.integration, ['jellyfin', 'plex'])\n      );\n\n      const servers = await Promise.all(\n        apps.map(async (app): Promise<GenericMediaServer | undefined> => {\n          try {\n            return await handleServer(app);\n          } catch (error) {\n            Consola.error(\n              `failed to communicate with media server '${app.name}' (${app.id}): ${error}`\n            );\n            return {\n              serverAddress: app.url,\n              sessions: [],\n              success: false,\n              version: undefined,\n              type: undefined,\n              appId: app.id,\n            };\n          }\n        })\n      );\n\n      return {\n        servers: servers.filter(\n          (server): server is Exclude<typeof server, undefined> => server !== undefined\n        ),\n      } satisfies MediaServersResponseType;\n    }),\n});\n\nconst handleServer = async (app: ConfigAppType): Promise<GenericMediaServer | undefined> => {\n  switch (app.integration?.type) {\n    case 'jellyfin': {\n      const username = findAppProperty(app, 'username');\n\n      if (!username) {\n        return {\n          appId: app.id,\n          serverAddress: app.url,\n          sessions: [],\n          type: 'jellyfin',\n          version: undefined,\n          success: false,\n        };\n      }\n\n      const password = findAppProperty(app, 'password');\n\n      if (!password) {\n        return {\n          appId: app.id,\n          serverAddress: app.url,\n          sessions: [],\n          type: 'jellyfin',\n          version: undefined,\n          success: false,\n        };\n      }\n\n      const api = jellyfin.createApi(app.url);\n      const infoApi = await getSystemApi(api).getPublicSystemInfo();\n      await api.authenticateUserByName(username, password);\n      const sessionApi = await getSessionApi(api);\n      const { data: sessions } = await sessionApi.getSessions();\n      return {\n        type: 'jellyfin',\n        appId: app.id,\n        serverAddress: trimStringEnding(app.url, [\n          '/web/index.html#!/home.html',\n          '/web',\n          '/web/index.html',\n          '/web/',\n          '/web/index.html#',\n        ]),\n        version: infoApi.data.Version ?? undefined,\n        sessions: sessions\n          .filter((session) => session.NowPlayingItem)\n          .map(\n            (session): GenericSessionInfo => ({\n              id: session.Id ?? '?',\n              username: session.UserName ?? undefined,\n              sessionName: `${session.Client} (${session.DeviceName})`,\n              supportsMediaControl: session.SupportsMediaControl ?? false,\n              currentlyPlaying: session.NowPlayingItem\n                ? {\n                    name: `${session.NowPlayingItem.SeriesName ?? session.NowPlayingItem.Name}`,\n                    seasonName: session.NowPlayingItem.SeasonName as string,\n                    episodeName: session.NowPlayingItem.Name as string,\n                    albumName: session.NowPlayingItem.Album as string,\n                    episodeCount: session.NowPlayingItem.EpisodeCount ?? undefined,\n                    metadata: {\n                      video:\n                        session.NowPlayingItem &&\n                        session.NowPlayingItem.Width &&\n                        session.NowPlayingItem.Height\n                          ? {\n                              videoCodec: undefined,\n                              width: session.NowPlayingItem.Width ?? undefined,\n                              height: session.NowPlayingItem.Height ?? undefined,\n                              bitrate: undefined,\n                              videoFrameRate: session.TranscodingInfo?.Framerate\n                                ? String(session.TranscodingInfo?.Framerate)\n                                : undefined,\n                            }\n                          : undefined,\n                      audio: session.TranscodingInfo\n                        ? {\n                            audioChannels: session.TranscodingInfo.AudioChannels ?? undefined,\n                            audioCodec: session.TranscodingInfo.AudioCodec ?? undefined,\n                          }\n                        : undefined,\n                      transcoding: session.TranscodingInfo\n                        ? {\n                            audioChannels: session.TranscodingInfo.AudioChannels ?? -1,\n                            audioCodec: session.TranscodingInfo.AudioCodec ?? undefined,\n                            container: session.TranscodingInfo.Container ?? undefined,\n                            width: session.TranscodingInfo.Width ?? undefined,\n                            height: session.TranscodingInfo.Height ?? undefined,\n                            videoCodec: session.TranscodingInfo?.VideoCodec ?? undefined,\n                            audioDecision: undefined,\n                            context: undefined,\n                            duration: undefined,\n                            error: undefined,\n                            sourceAudioCodec: undefined,\n                            sourceVideoCodec: undefined,\n                            timeStamp: undefined,\n                            transcodeHwRequested: undefined,\n                            videoDecision: undefined,\n                          }\n                        : undefined,\n                    },\n                    type: convertJellyfinType(session.NowPlayingItem.Type),\n                  }\n                : undefined,\n              userProfilePicture: undefined,\n            })\n          ),\n        success: true,\n      };\n    }\n    case 'plex': {\n      const apiKey = findAppProperty(app, 'apiKey');\n\n      if (!apiKey) {\n        return {\n          serverAddress: trimStringEnding(app.url, [\n            '/web',\n            '/web/index.html',\n            '/web/index.html#!',\n            '/web/index.html#!/settings/web/general',\n            '/web/',\n          ]),\n          sessions: [],\n          type: 'plex',\n          appId: app.id,\n          version: undefined,\n          success: false,\n        };\n      }\n\n      const plexClient = new PlexClient(app.url, apiKey);\n      const sessions = await plexClient.getSessions();\n      return {\n        serverAddress: app.url,\n        sessions,\n        type: 'plex',\n        version: undefined,\n        appId: app.id,\n        success: true,\n      };\n    }\n    default: {\n      Consola.warn(\n        `media-server api entered a fallback case. This should normally not happen and must be reported. Cause: '${app.name}' (${app.id})`\n      );\n      return undefined;\n    }\n  }\n};\n\nconst convertJellyfinType = (kind: BaseItemKind | undefined): GenericCurrentlyPlaying['type'] => {\n  switch (kind) {\n    case BaseItemKind.Audio:\n    case BaseItemKind.MusicVideo:\n      return 'audio';\n    case BaseItemKind.Episode:\n    case BaseItemKind.Video:\n      return 'video';\n    case BaseItemKind.Movie:\n      return 'movie';\n    case BaseItemKind.TvChannel:\n    case BaseItemKind.TvProgram:\n    case BaseItemKind.LiveTvChannel:\n    case BaseItemKind.LiveTvProgram:\n      return 'tv';\n    default:\n      return undefined;\n  }\n};\n"
  },
  {
    "path": "src/server/api/routers/migrate.ts",
    "content": "import { randomBytes } from 'crypto';\nimport dayjs from 'dayjs';\nimport { v4 } from 'uuid';\nimport { z } from 'zod';\nimport { db } from '~/server/db';\nimport { migrateTokens } from '~/server/db/schema';\n\nimport { adminProcedure, createTRPCRouter } from '../trpc';\n\nexport const migrateRouter = createTRPCRouter({\n  createToken: adminProcedure\n    .input(z.object({ boards: z.boolean(), users: z.boolean(), integrations: z.boolean() }))\n    .mutation(async ({ input }) => {\n      const id = v4();\n      const token = randomBytes(32).toString('hex');\n\n      await db.insert(migrateTokens).values({\n        id,\n        token,\n        ...input,\n        expires: dayjs().add(5, 'minutes').toDate(),\n      });\n\n      return token;\n    }),\n});\n"
  },
  {
    "path": "src/server/api/routers/notebook.ts",
    "content": "import { TRPCError } from '@trpc/server';\nimport fs from 'fs';\nimport path from 'path';\nimport { z } from 'zod';\nimport { getConfig } from '~/tools/config/getConfig';\nimport { BackendConfigType } from '~/types/config';\nimport { INotebookWidget } from '~/widgets/notebook/NotebookWidgetTile';\n\nimport { adminProcedure, createTRPCRouter } from '../trpc';\n\nexport const notebookRouter = createTRPCRouter({\n  update: adminProcedure\n    .input(z.object({ widgetId: z.string(), content: z.string(), configName: z.string() }))\n    .mutation(async ({ input }) => {\n      const config = getConfig(input.configName);\n      const widget = config.widgets.find((widget) => widget.id === input.widgetId) as\n        | INotebookWidget\n        | undefined;\n\n      if (!widget) {\n        throw new TRPCError({\n          code: 'BAD_REQUEST',\n          message: 'Specified widget was not found',\n        });\n      }\n\n      widget.properties.content = input.content;\n\n      const newConfig: BackendConfigType = {\n        ...config,\n        widgets: [...config.widgets.filter((w) => w.id !== widget.id), widget],\n      };\n\n      const targetPath = path.join('data/configs', `${input.configName}.json`);\n      fs.writeFileSync(targetPath, JSON.stringify(newConfig, null, 2), 'utf8');\n    }),\n});\n"
  },
  {
    "path": "src/server/api/routers/overseerr.ts",
    "content": "import { TRPCError } from '@trpc/server';\nimport axios from 'axios';\nimport Consola from 'consola';\nimport { z } from 'zod';\nimport { MovieResult } from '~/modules/overseerr/Movie';\nimport { OriginalLanguage, Result } from '~/modules/overseerr/SearchResult';\nimport { TvShowResult } from '~/modules/overseerr/TvShow';\nimport { getConfig } from '~/tools/config/getConfig';\n\nimport { protectedProcedure, createTRPCRouter, publicProcedure } from '../trpc';\n\nexport const overseerrRouter = createTRPCRouter({\n  search: protectedProcedure\n    .input(\n      z.object({\n        configName: z.string(),\n        integration: z.enum(['overseerr', 'jellyseerr']),\n        query: z.string().or(z.undefined()),\n        limit: z.number().default(10),\n      })\n    )\n    .query(async ({ input }) => {\n      const config = getConfig(input.configName);\n\n      const app = config.apps.find((app) => app.integration?.type === input.integration);\n\n      if (input.query === '' || input.query === undefined) {\n        return [];\n      }\n\n      const apiKey = app?.integration?.properties.find((x) => x.field === 'apiKey')?.value;\n      if (!app || !apiKey) {\n        throw new TRPCError({\n          code: 'BAD_REQUEST',\n          message: 'Wrong request',\n        });\n      }\n      const appUrl = new URL(app.url);\n      const data = await axios\n        .get(`${appUrl.origin}/api/v1/search?query=${input.query}`, {\n          headers: {\n            // Set X-Api-Key to the value of the API key\n            'X-Api-Key': apiKey,\n          },\n        })\n        .then((res) => res.data.results as Result[]);\n\n      return data.slice(0, input.limit);\n    }),\n  byId: publicProcedure\n    .input(\n      z.object({\n        configName: z.string(),\n        id: z.number(),\n        type: z.union([z.literal('movie'), z.literal('tv')]),\n      })\n    )\n    .query(async ({ input }) => {\n      const config = getConfig(input.configName);\n      const app = config.apps.find(\n        (app) => app.integration?.type === 'overseerr' || app.integration?.type === 'jellyseerr'\n      );\n      const apiKey = app?.integration?.properties.find((x) => x.field === 'apiKey')?.value;\n\n      if (!apiKey) {\n        throw new TRPCError({\n          code: 'BAD_REQUEST',\n          message: 'No app found',\n        });\n      }\n\n      const appUrl = new URL(app.url);\n\n      if (input.type === 'movie') {\n        const movie = await axios\n          .get(`${appUrl.origin}/api/v1/movie/${input.id}`, {\n            headers: {\n              // Set X-Api-Key to the value of the API key\n              'X-Api-Key': apiKey,\n            },\n          })\n          .then((res) => res.data as MovieResult)\n          .catch((err) => {\n            Consola.error(err);\n            throw new TRPCError({\n              code: 'INTERNAL_SERVER_ERROR',\n              message: 'Something went wrong',\n            });\n          });\n        return movie;\n      }\n\n      const tv = await axios\n        .get(`${appUrl.origin}/api/v1/tv/${input.id}`, {\n          headers: {\n            // Set X-Api-Key to the value of the API key\n            'X-Api-Key': apiKey,\n          },\n        })\n        .then((res) => res.data as TvShowResult)\n        .catch((err) => {\n          Consola.error(err);\n          throw new TRPCError({\n            code: 'INTERNAL_SERVER_ERROR',\n            message: 'Something went wrong',\n          });\n        });\n      return tv;\n    }),\n  request: publicProcedure\n    .input(\n      z\n        .object({\n          configName: z.string(),\n          id: z.number(),\n        })\n        .and(\n          z\n            .object({\n              seasons: z.array(z.number()),\n              type: z.literal('tv'),\n            })\n            .or(\n              z.object({\n                type: z.literal('movie'),\n              })\n            )\n        )\n    )\n    .mutation(async ({ input }) => {\n      const config = getConfig(input.configName);\n      const app = config.apps.find(\n        (app) => app.integration?.type === 'overseerr' || app.integration?.type === 'jellyseerr'\n      );\n      const apiKey = app?.integration?.properties.find((x) => x.field === 'apiKey')?.value;\n      if (!apiKey) {\n        throw new TRPCError({\n          code: 'BAD_REQUEST',\n          message: 'No app found',\n        });\n      }\n\n      const appUrl = new URL(app.url);\n      Consola.info('Got an Overseerr request with these arguments', {\n        mediaType: input.type,\n        mediaId: input.id,\n        seasons: input.type === 'tv' ? input.seasons : undefined,\n      });\n      return axios\n        .post(\n          `${appUrl.origin}/api/v1/request`,\n          {\n            mediaType: input.type,\n            mediaId: input.id,\n            seasons: input.type === 'tv' ? input.seasons : undefined,\n          },\n          {\n            headers: {\n              // Set X-Api-Key to the value of the API key\n              'X-Api-Key': apiKey,\n            },\n          }\n        )\n        .then((res) => res.data)\n        .catch((err) => {\n          throw new TRPCError({\n            code: 'INTERNAL_SERVER_ERROR',\n            message: err.message,\n          });\n        });\n    }),\n  decide: publicProcedure\n    .input(\n      z.object({\n        configName: z.string(),\n        id: z.number(),\n        isApproved: z.boolean(),\n      })\n    )\n    .mutation(async ({ input }) => {\n      const config = getConfig(input.configName);\n      Consola.log(\n        `Got a request to ${input.isApproved ? 'approve' : 'decline'} a request`,\n        input.id\n      );\n      const app = config.apps.find(\n        (app) => app.integration?.type === 'overseerr' || app.integration?.type === 'jellyseerr'\n      );\n\n      const apiKey = app?.integration?.properties.find((x) => x.field === 'apiKey')?.value;\n      if (!apiKey) {\n        throw new TRPCError({\n          code: 'BAD_REQUEST',\n          message: 'No app found',\n        });\n      }\n      const appUrl = new URL(app.url);\n      const action = input.isApproved ? 'approve' : 'decline';\n      return axios\n        .post(\n          `${appUrl.origin}/api/v1/request/${input.id}/${action}`,\n          {},\n          {\n            headers: {\n              'X-Api-Key': apiKey,\n            },\n          }\n        )\n        .then((res) => res.data)\n        .catch((err) => {\n          throw new TRPCError({\n            code: 'INTERNAL_SERVER_ERROR',\n            message: err.message,\n          });\n        });\n    }),\n});\n"
  },
  {
    "path": "src/server/api/routers/password.ts",
    "content": "import { generate } from 'generate-password';\n\nimport { adminProcedure, createTRPCRouter } from '../trpc';\n\nexport const passwordRouter = createTRPCRouter({\n  generate: adminProcedure.mutation(() => {\n    return generate({\n      strict: true,\n      numbers: true,\n      lowercase: true,\n      uppercase: true,\n      symbols: true,\n      excludeSimilarCharacters: true,\n      length: 16,\n    });\n  }),\n});\n"
  },
  {
    "path": "src/server/api/routers/rss.ts",
    "content": "import { TRPCError } from '@trpc/server';\nimport Consola from 'consola';\nimport { decode, encode } from 'html-entities';\nimport RssParser from 'rss-parser';\nimport xss from 'xss';\nimport { z } from 'zod';\nimport { getConfig } from '~/tools/config/getConfig';\nimport { Stopwatch } from '~/tools/shared/time/stopwatch.tool';\nimport { IRssWidget } from '~/widgets/rss/RssWidgetTile';\n\nimport { createTRPCRouter, publicProcedure } from '../trpc';\n\ntype CustomItem = {\n  'media:content': string;\n  enclosure: {\n    url: string;\n  };\n  'media:group'?: {\n    'media:description'?: string;\n    'media:thumbnail'?: string;\n  };\n  pubDate?: string;\n};\n\nconst rssFeedResultObjectSchema = z\n  .object({\n    success: z.literal(false),\n    feed: z.undefined(),\n  })\n  .or(\n    z.object({\n      success: z.literal(true),\n      feed: z.object({\n        title: z.string().or(z.undefined()),\n        items: z.array(\n          z.object({\n            link: z.string(),\n            enclosure: z\n              .object({\n                url: z.string(),\n              })\n              .or(z.undefined()),\n            categories: z.array(z.string()).or(z.undefined()),\n            title: z.string(),\n            content: z.string(),\n            pubDate: z.date().optional(),\n          })\n        ),\n      }),\n    })\n  );\n\nexport const rssRouter = createTRPCRouter({\n  all: publicProcedure\n    .input(\n      z.object({\n        widgetId: z.string().uuid(),\n        feedUrls: z.array(z.string()),\n        configName: z.string(),\n      })\n    )\n    .output(z.array(rssFeedResultObjectSchema))\n    .query(async ({ input }) => {\n      const config = getConfig(input.configName);\n\n      const rssWidget = config.widgets.find((x) => x.type === 'rss' && x.id === input.widgetId) as\n        | IRssWidget\n        | undefined;\n\n      if (!rssWidget) {\n        throw new TRPCError({\n          code: 'NOT_FOUND',\n          message: 'required widget does not exist',\n        });\n      }\n\n      if (input.feedUrls.length === 0) {\n        return [];\n      }\n\n      return await Promise.all(\n        input.feedUrls.map(async (feedUrl) =>\n          getFeedUrl(\n            feedUrl,\n            rssWidget.properties.dangerousAllowSanitizedItemContent,\n            rssWidget.properties.sortPostsWithoutPublishDateToTheTop,\n            rssWidget.properties.maximumAmountOfPosts\n          )\n        )\n      );\n    }),\n});\n\nconst getFeedUrl = async (\n  feedUrl: string,\n  dangerousAllowSanitizedItemContent: boolean,\n  sortPostsWithoutPubDateToTop: boolean,\n  maximumAmountOfPosts: number\n) => {\n  Consola.info(`Requesting RSS feed at url ${feedUrl}`);\n  const stopWatch = new Stopwatch();\n  const feed = await parser.parseURL(feedUrl);\n  Consola.info(`Retrieved RSS feed after ${stopWatch.getEllapsedMilliseconds()} milliseconds`);\n\n  const orderedFeed = {\n    ...feed,\n    items: feed.items\n      .map(\n        (item: {\n          title: string;\n          content: string;\n          'content:encoded': string;\n          'media:group'?: {\n            'media:description'?: string;\n            'media:thumbnail'?: string;\n          };\n          categories: string[] | { _: string }[];\n          pubDate?: string;\n        }) => {\n          return {\n            ...item,\n            categories: item.categories\n              ?.map((category) => (typeof category === 'string' ? category : category._))\n              .filter((category: unknown): category is string => typeof category === 'string'),\n            title: item.title ? decode(item.title) : undefined,\n            content: processItemContent(\n              item['content:encoded'] ?? item.content ?? item['media:group']?.['media:description'],\n              dangerousAllowSanitizedItemContent\n            ),\n            enclosure: createEnclosure(item),\n            link: createLink(item),\n            pubDate: item.pubDate ? new Date(item.pubDate) : null,\n          };\n        }\n      )\n      .sort((post1: { pubDate: number }, post2: { pubDate: number }) => {\n        if (!post1.pubDate || !post2.pubDate) {\n          return sortPostsWithoutPubDateToTop ? 1 : 0;\n        }\n\n        return post1.pubDate - post2.pubDate;\n      }),\n  };\n\n  return {\n    feed: orderedFeed,\n    success: orderedFeed?.items !== undefined,\n  };\n};\n\nconst processItemContent = (content: string, dangerousAllowSanitizedItemContent: boolean) => {\n  if (dangerousAllowSanitizedItemContent) {\n    return xss(content, {\n      allowList: {\n        p: [],\n        h1: [],\n        h2: [],\n        h3: [],\n        h4: [],\n        h5: [],\n        h6: [],\n        a: ['href'],\n        b: [],\n        strong: [],\n        i: [],\n        em: [],\n        img: ['src', 'width', 'height', 'alt'],\n        br: [],\n        small: [],\n        ul: [],\n        li: [],\n        ol: [],\n        figure: [],\n        svg: [],\n        code: [],\n        mark: [],\n        blockquote: [],\n      },\n    });\n  }\n\n  return encode(content, {\n    level: 'html5',\n  });\n};\n\nconst createLink = (item: any) => {\n  if (item.link) {\n    return item.link;\n  }\n\n  return item.guid;\n};\n\nconst createEnclosure = (item: any) => {\n  if (item.enclosure) {\n    return item.enclosure;\n  }\n\n  if (item['media:content']) {\n    return {\n      url: item['media:content'].$.url,\n    };\n  }\n\n  if (item['media:group'] && item['media:group']['media:thumbnail']) {\n    // no clue why this janky parse is needed\n    return {\n      url: item['media:group']['media:thumbnail'][0].$.url,\n    };\n  }\n\n  return undefined;\n};\n\nconst parser: RssParser<any, CustomItem> = new RssParser({\n  customFields: {\n    item: ['media:content', 'enclosure', 'media:group'],\n  },\n});\n"
  },
  {
    "path": "src/server/api/routers/smart-home/entity-state.ts",
    "content": "import { TRPCError } from '@trpc/server';\nimport Consola from 'consola';\nimport { ZodError, z } from 'zod';\n\n\nimport { createTRPCRouter, protectedProcedure } from '../../trpc';\n\nimport { findAppProperty } from '~/tools/client/app-properties';\nimport { getConfig } from '~/tools/config/getConfig';\nimport { HomeAssistantSingleton } from '~/tools/singleton/HomeAssistantSingleton';\nimport { ISmartHomeEntityStateWidget } from '~/widgets/smart-home/entity-state/entity-state.widget';\n\nexport const smartHomeEntityStateRouter = createTRPCRouter({\n  retrieveStatus: protectedProcedure\n    .input(\n      z.object({\n        configName: z.string(),\n        // TODO: passing entity ID directly can be unsafe\n        entityId: z.string().regex(/^[A-Za-z0-9-_\\.]+$/),\n      }),\n    )\n    .query(async ({ input }) => {\n      const config = getConfig(input.configName);\n\n      const instances = config.apps.filter((app) => app.integration?.type == 'homeAssistant');\n\n      for (const instance of instances) {\n        const url = new URL(instance.url);\n        const client = HomeAssistantSingleton.getOrSet(url, findAppProperty(instance, 'apiKey'));\n        const state = await client.getEntityState(input.entityId);\n\n        if (!state.success) {\n          if (!(state.error instanceof ZodError)) {\n            continue;\n          }\n\n          throw new TRPCError({\n            code: 'NOT_IMPLEMENTED',\n            message: `Unable to handle Home Assistant entity state. This may be due to malformed response or unknown entity type. Check log for details`,\n          });\n        }\n\n        if (!state.data) {\n          throw new TRPCError({\n            code: 'INTERNAL_SERVER_ERROR',\n            message: `Home Assistant: Unable to connect to app '${instance.id}'. Check logs for details`,\n          });\n        }\n\n        return state.data;\n      }\n\n      return null;\n    }),\n  triggerAutomation: protectedProcedure\n    .input(z.object({\n      widgetId: z.string(),\n      configName: z.string(),\n    })).mutation(async ({ input }) => {\n      const config = getConfig(input.configName);\n      const widget = config.widgets.find(widget => widget.id === input.widgetId) as ISmartHomeEntityStateWidget | null;\n\n      if (!widget) {\n        Consola.error(`Referenced widget ${input.widgetId} does not exist on backend.`);\n        throw new TRPCError({\n          code: 'CONFLICT',\n          message: 'Referenced widget does not exist on backend',\n        });\n      }\n\n      if (!widget.properties.automationId || widget.properties.automationId.length < 1) {\n        Consola.error(`Referenced widget ${input.widgetId} does not have the required property set.`);\n        throw new TRPCError({\n          code: 'CONFLICT',\n          message: 'Referenced widget does not have the required property',\n        });\n      }\n\n      const instances = config.apps.filter((app) => app.integration?.type == 'homeAssistant');\n\n      for (const instance of instances) {\n        const url = new URL(instance.url);\n        const client = HomeAssistantSingleton.getOrSet(url, findAppProperty(instance, 'apiKey'));\n        const state = await client.triggerAutomation(widget.properties.automationId);\n\n        if (state) {\n          return true;\n        }\n      }\n\n      return false;\n    }),\n  triggerToggle: protectedProcedure\n    .input(z.object({\n      widgetId: z.string(),\n      configName: z.string()\n    })).mutation(async ({ input }) => {\n      const config = getConfig(input.configName);\n      const widget = config.widgets.find(widget => widget.id === input.widgetId) as ISmartHomeEntityStateWidget | null;\n\n      if (!widget) {\n        Consola.error(`Referenced widget ${input.widgetId} does not exist on backend.`);\n        throw new TRPCError({\n          code: 'CONFLICT',\n          message: 'Referenced widget does not exist on backend',\n        });\n      }\n\n      const instances = config.apps.filter((app) => app.integration?.type == 'homeAssistant');\n\n      for (const instance of instances) {\n        const url = new URL(instance.url);\n        const client = HomeAssistantSingleton.getOrSet(url, findAppProperty(instance, 'apiKey'));\n        const state = await client.triggerToggle(widget.properties.entityId);\n\n        if (state) {\n          return true;\n        }\n      }\n\n      return false;\n    }),\n});\n"
  },
  {
    "path": "src/server/api/routers/tdarr.ts",
    "content": "import { TRPCError } from '@trpc/server';\nimport axios from 'axios';\nimport { z } from 'zod';\nimport { checkIntegrationsType } from '~/tools/client/app-properties';\nimport { getConfig } from '~/tools/config/getConfig';\nimport { ConfigAppType } from '~/types/app';\n\nimport { createTRPCRouter, publicProcedure } from '../trpc';\nimport { TdarrQueue, TdarrStatistics, TdarrWorker } from '~/types/api/tdarr';\n\nconst getStatisticsSchema = z.object({\n  totalFileCount: z.number(),\n  totalTranscodeCount: z.number(),\n  totalHealthCheckCount: z.number(),\n  table3Count: z.number(),\n  table6Count: z.number(),\n  table1Count: z.number(),\n  table4Count: z.number(),\n  pies: z.array(\n    z.tuple([\n      z.string(), // Library Name\n      z.string(), // Library ID\n      z.number(), // File count\n      z.number(), // Number of transcodes\n      z.number(), // Space saved (in GB)\n      z.number(), // Number of health checks\n      z.array(\n        z.object({\n          // Transcode Status (Pie segments)\n          name: z.string(),\n          value: z.number(),\n        })\n      ),\n      z.array(\n        z.object({\n          // Health Status (Pie segments)\n          name: z.string(),\n          value: z.number(),\n        })\n      ),\n      z.array(\n        z.object({\n          // Video files - Codecs (Pie segments)\n          name: z.string(),\n          value: z.number(),\n        })\n      ),\n      z.array(\n        z.object({\n          // Video files - Containers (Pie segments)\n          name: z.string(),\n          value: z.number(),\n        })\n      ),\n      z.array(\n        z.object({\n          // Video files - Resolutions (Pie segments)\n          name: z.string(),\n          value: z.number(),\n        })\n      ),\n      z.array(\n        z.object({\n          // Audio files - Codecs (Pie segments)\n          name: z.string(),\n          value: z.number(),\n        })\n      ),\n      z.array(\n        z.object({\n          // Audio files - Containers (Pie segments)\n          name: z.string(),\n          value: z.number(),\n        })\n      ),\n    ])\n  ),\n});\n\nconst getNodesResponseSchema = z.record(\n  z.string(),\n  z.object({\n    _id: z.string(),\n    nodeName: z.string(),\n    nodePaused: z.boolean(),\n    workers: z.record(\n      z.string(),\n      z.object({\n        _id: z.string(),\n        file: z.string(),\n        fps: z.number(),\n        percentage: z.number(),\n        ETA: z.string(),\n        job: z.object({\n          type: z.string(),\n        }),\n        status: z.string(),\n        lastPluginDetails: z\n          .object({\n            number: z.string().optional(),\n          })\n          .optional(),\n        originalfileSizeInGbytes: z.number(),\n        estSize: z.number().optional(),\n        outputFileSizeInGbytes: z.number().optional(),\n        workerType: z.string(),\n      })\n    ),\n  })\n);\n\nconst getStatusTableSchema = z.object({\n  array: z.array(\n    z.object({\n      _id: z.string(),\n      HealthCheck: z.string(),\n      TranscodeDecisionMaker: z.string(),\n      file: z.string(),\n      file_size: z.number(),\n      container: z.string(),\n      video_codec_name: z.string(),\n      video_resolution: z.string(),\n    })\n  ),\n  totalCount: z.number(),\n});\n\nexport const tdarrRouter = createTRPCRouter({\n  statistics: publicProcedure\n    .input(z.object({\n      appId: z.string(),\n      configName: z.string(),\n    }))\n    .query(async ({ input }): Promise<TdarrStatistics> => {\n      const app = getTdarrApp(input.appId, input.configName);\n      const appUrl = new URL('api/v2/cruddb', app.url);\n\n      const body = {\n        data: {\n          collection: 'StatisticsJSONDB',\n          mode: 'getById',\n          docID: 'statistics',\n        },\n      };\n\n      const res = await axios.post(appUrl.toString(), body);\n      const data: z.infer<typeof getStatisticsSchema> = res.data;\n\n      const zodRes = getStatisticsSchema.safeParse(data);\n      if (!zodRes.success) {\n        /*\n         * Tdarr's API is not documented and had to be reverse engineered. To account for mistakes in the type\n         * definitions, we assume the best case scenario and log any parsing errors to aid in fixing the types.\n         */\n        console.error(zodRes.error);\n      }\n\n      return {\n        totalFileCount: data.totalFileCount,\n        totalTranscodeCount: data.totalTranscodeCount,\n        totalHealthCheckCount: data.totalHealthCheckCount,\n        failedTranscodeCount: data.table3Count,\n        failedHealthCheckCount: data.table6Count,\n        stagedTranscodeCount: data.table1Count,\n        stagedHealthCheckCount: data.table4Count,\n        pies: data.pies.map((pie) => ({\n          libraryName: pie[0],\n          libraryId: pie[1],\n          totalFiles: pie[2],\n          totalTranscodes: pie[3],\n          savedSpace: pie[4] * 1_000_000_000, // file_size is in GB, convert to bytes,\n          totalHealthChecks: pie[5],\n          transcodeStatus: pie[6],\n          healthCheckStatus: pie[7],\n          videoCodecs: pie[8],\n          videoContainers: pie[9],\n          videoResolutions: pie[10],\n          audioCodecs: pie[11],\n          audioContainers: pie[12],\n        })),\n      };\n    }),\n\n  workers: publicProcedure\n    .input(z.object({\n      appId: z.string(),\n      configName: z.string(),\n    })).query(async ({ input }): Promise<TdarrWorker[]> => {\n      const app = getTdarrApp(input.appId, input.configName);\n      const appUrl = new URL('api/v2/get-nodes', app.url);\n\n      const res = await axios.get(appUrl.toString());\n      const data: z.infer<typeof getNodesResponseSchema> = res.data;\n\n      const zodRes = getNodesResponseSchema.safeParse(data);\n      if (!zodRes.success) {\n        /*\n         * Tdarr's API is not documented and had to be reverse engineered. To account for mistakes in the type\n         * definitions, we assume the best case scenario and log any parsing errors to aid in fixing the types.\n         */\n        console.error(zodRes.error);\n      }\n\n      const nodes = Object.values(data);\n      const workers = nodes.flatMap((node) => {\n        return Object.values(node.workers);\n      });\n\n      return workers.map((worker) => ({\n        id: worker._id,\n        filePath: worker.file,\n        fps: worker.fps,\n        percentage: worker.percentage,\n        ETA: worker.ETA,\n        jobType: worker.job.type,\n        status: worker.status,\n        step: worker.lastPluginDetails?.number ?? '',\n        originalSize: worker.originalfileSizeInGbytes * 1_000_000_000, // file_size is in GB, convert to bytes,\n        estimatedSize: worker.estSize ? worker.estSize * 1_000_000_000 : null, // file_size is in GB, convert to bytes,\n        outputSize: worker.outputFileSizeInGbytes ? worker.outputFileSizeInGbytes * 1_000_000_000 : null, // file_size is in GB, convert to bytes,\n      }));\n    }),\n\n  queue: publicProcedure\n    .input(z.object({\n      appId: z.string(),\n      configName: z.string(),\n      showHealthChecksInQueue: z.boolean(),\n      pageSize: z.number(),\n      page: z.number(),\n    }))\n    .query(async ({ input }): Promise<TdarrQueue> => {\n      const app = getTdarrApp(input.appId, input.configName);\n\n      const appUrl = new URL('api/v2/client/status-tables', app.url);\n\n      const { page, pageSize, showHealthChecksInQueue } = input;\n\n      const firstItemIndex = page * pageSize;\n\n      const transcodeQueueBody = {\n        data: {\n          start: firstItemIndex,\n          pageSize: pageSize,\n          filters: [],\n          sorts: [],\n          opts: {\n            table: 'table1',\n          },\n        },\n      };\n\n      const transcodeQueueRes = await axios.post(appUrl.toString(), transcodeQueueBody);\n      const transcodeQueueData: z.infer<typeof getStatusTableSchema> = transcodeQueueRes.data;\n\n      const transcodeQueueZodRes = getStatusTableSchema.safeParse(transcodeQueueData);\n      if (!transcodeQueueZodRes.success) {\n        /*\n         * Tdarr's API is not documented and had to be reverse engineered. To account for mistakes in the type\n         * definitions, we assume the best case scenario and log any parsing errors to aid in fixing the types.\n         */\n        console.error(transcodeQueueZodRes.error);\n      }\n\n      const transcodeQueueResult = {\n        array: transcodeQueueData.array.map((item) => ({\n          id: item._id,\n          healthCheck: item.HealthCheck,\n          transcode: item.TranscodeDecisionMaker,\n          filePath: item.file,\n          fileSize: item.file_size * 1_000_000, // file_size is in MB, convert to bytes\n          container: item.container,\n          codec: item.video_codec_name,\n          resolution: item.video_resolution,\n          type: 'transcode' as const,\n        })),\n        totalCount: transcodeQueueData.totalCount,\n        startIndex: firstItemIndex,\n        endIndex: firstItemIndex + transcodeQueueData.array.length - 1,\n      };\n\n      if (!showHealthChecksInQueue) {\n        return transcodeQueueResult;\n      }\n\n      const healthCheckQueueBody = {\n        data: {\n          start: Math.max(firstItemIndex - transcodeQueueData.totalCount, 0),\n          pageSize: pageSize,\n          filters: [],\n          sorts: [],\n          opts: {\n            table: 'table4',\n          },\n        },\n      };\n\n      const healthCheckQueueRes = await axios.post(appUrl.toString(), healthCheckQueueBody);\n      const healthCheckQueueData: z.infer<typeof getStatusTableSchema> = healthCheckQueueRes.data;\n\n      const healthCheckQueueZodRes = getStatusTableSchema.safeParse(healthCheckQueueData);\n      if (!healthCheckQueueZodRes.success) {\n        /*\n         * Tdarr's API is not documented and had to be reverse engineered. To account for mistakes in the type\n         * definitions, we assume the best case scenario and log any parsing errors to aid in fixing the types.\n         */\n        console.error(healthCheckQueueZodRes.error);\n      }\n\n      const healthCheckResultArray = healthCheckQueueData.array.map((item) => ({\n        id: item._id,\n        healthCheck: item.HealthCheck,\n        transcode: item.TranscodeDecisionMaker,\n        filePath: item.file,\n        fileSize: item.file_size * 1_000_000, // file_size is in MB, convert to bytes\n        container: item.container,\n        codec: item.video_codec_name,\n        resolution: item.video_resolution,\n        type: 'health check' as const,\n      }));\n\n      const combinedArray = [...transcodeQueueResult.array, ...healthCheckResultArray].slice(\n        0,\n        pageSize\n      );\n\n      return {\n        array: combinedArray,\n        totalCount: transcodeQueueData.totalCount + healthCheckQueueData.totalCount,\n        startIndex: firstItemIndex,\n        endIndex: firstItemIndex + combinedArray.length - 1,\n      };\n    }),\n});\n\nfunction getTdarrApp(appId: string, configName: string): ConfigAppType {\n  const config = getConfig(configName);\n\n  const app = config.apps.find((x) => x.id === appId);\n\n  if (!app) {\n    throw new TRPCError({\n      code: 'BAD_REQUEST',\n      message: `[Tdarr integration] App with ID \"${appId}\" could not be found.`,\n    });\n  }\n\n  if (!checkIntegrationsType(app.integration, ['tdarr'])) {\n    throw new TRPCError({\n      code: 'BAD_REQUEST',\n      message: `[Tdarr integration] App with ID \"${appId}\" is not using the Tdarr integration.`,\n    });\n  }\n\n  return app;\n}\n"
  },
  {
    "path": "src/server/api/routers/usenet/nzbget/nzbget-api.d.ts",
    "content": "declare module 'nzbget-api';\n"
  },
  {
    "path": "src/server/api/routers/usenet/nzbget/nzbget-client.ts",
    "content": "import NZBGet from 'nzbget-api';\n\nimport { NzbgetClientOptions } from './types';\n\nexport function NzbgetClient(options: NzbgetClientOptions) {\n  if (!options?.host) {\n    throw new Error('Cannot connect to NZBGet. Missing host in app config.');\n  }\n\n  if (!options?.port) {\n    throw new Error('Cannot connect to NZBGet. Missing port in app config.');\n  }\n\n  if (!options?.login) {\n    throw new Error('Cannot connect to NZBGet. Missing username in app config.');\n  }\n\n  if (!options?.hash) {\n    throw new Error('Cannot connect to NZBGet. Missing password in app config.');\n  }\n\n  return new NZBGet(options);\n}\n"
  },
  {
    "path": "src/server/api/routers/usenet/nzbget/types.ts",
    "content": "export interface NzbgetHistoryItem {\n  NZBID: number;\n  Kind: 'NZB' | 'URL' | 'DUP';\n  NZBFilename: string;\n  Name: string;\n  URL: string;\n  HistoryTime: number;\n  DestDir: string;\n  FinalDir: string;\n  Category: string;\n  FileSizeLo: number;\n  FileSizeHi: number;\n  FileSizeMB: number;\n  FileCount: number;\n  RemainingFileCount: number;\n  MinPostTime: number;\n  MaxPostTime: number;\n  TotalArticles: number;\n  SuccessArticles: number;\n  FailedArticles: number;\n  Health: number;\n  DownloadedSizeLo: number;\n  DownloadedSizeHi: number;\n  DownloadedSizeMB: number;\n  DownloadTimeSec: number;\n  PostTotalTimeSec: number;\n  ParTimeSec: number;\n  RepairTimeSec: number;\n  UnpackTimeSec: number;\n  MessageCount: number;\n  DupeKey: string;\n  DupeScore: number;\n  DupeMode: 'SCORE' | 'ALL' | 'FORCE';\n  Status: string;\n  ParStatus: 'NONE' | 'FAILURE' | 'REPAIR_POSSIBLE' | 'SUCCESS' | 'MANUAL';\n  ExParStatus: 'RECIPIENT' | 'DONOR';\n  UnpackStatus: 'NONE' | 'FAILURE' | 'SPACE' | 'PASSWORD' | 'SUCCESS';\n  UrlStatus: 'NONE' | 'SUCCESS' | 'FAILURE' | 'SCAN_SKIPPED' | 'SCAN_FAILURE';\n  ScriptStatus: 'NONE' | 'FAILURE' | 'SUCCESS';\n  ScriptStatuses: [];\n  MoveStatus: 'NONE' | 'SUCCESS' | 'FAILURE';\n  DeleteStatus: 'NONE' | 'MANUAL' | 'HEALTH' | 'DUPE' | 'BAD' | 'SCAN' | 'COPY';\n  MarkStatus: 'NONE' | 'GOOD' | 'BAD';\n  ExtraParBlocks: number;\n  Parameters: [];\n  ServerStats: [];\n}\n\nexport interface NzbgetQueueItem {\n  NZBID: number;\n  NZBFilename: string;\n  NZBName: string;\n  Kind: 'NZB' | 'URL';\n  URL: string;\n  DestDir: string;\n  FinalDir: string;\n  Category: string;\n  FileSizeLo: number;\n  FileSizeHi: number;\n  FileSizeMB: number;\n  RemainingSizeLo: number;\n  RemainingSizeHi: number;\n  RemainingSizeMB: number;\n  PausedSizeLo: number;\n  PausedSizeHi: number;\n  PausedSizeMB: number;\n  FileCount: number;\n  RemainingFileCount: number;\n  RemainingParCount: number;\n  MinPostTime: number;\n  MaxPostTime: number;\n  MaxPriority: number;\n  ActiveDownloads: number;\n  Status:\n    | 'QUEUED'\n    | 'PAUSED'\n    | 'DOWNLOADING'\n    | 'FETCHING'\n    | 'PP_QUEUED'\n    | 'LOADING_PARS'\n    | 'VERIFYING_SOURCES'\n    | 'REPAIRING'\n    | 'VERIFYING_REPAIRED'\n    | 'RENAMING'\n    | 'UNPACKING'\n    | 'MOVING'\n    | 'EXECUTING_SCRIPT'\n    | 'PP_FINISHED';\n  TotalArticles: number;\n  SuccessArticles: number;\n  FailedArticles: number;\n  Health: number;\n  CriticalHealth: number;\n  DownloadedSizeLo: number;\n  DownloadedSizeHi: number;\n  DownloadedSizeMB: number;\n  DownloadTimeSec: number;\n  MessageCount: number;\n  DupeKey: string;\n  DupeScore: number;\n  DupeMode: string;\n  Parameters: [];\n  ServerStats: [];\n  PostInfoText: string;\n  PostStageProgress: number;\n  PostTotalTimeSec: number;\n  PostStageTimeSec: number;\n}\n\nexport interface NzbgetStatus {\n  RemainingSizeLo: number;\n  RemainingSizeHi: number;\n  RemainingSizeMB: number;\n  ForcedSizeLo: number;\n  ForcedSizeHi: number;\n  ForcedSizeMB: number;\n  DownloadedSizeLo: number;\n  DownloadedSizeHi: number;\n  DownloadedSizeMB: number;\n  ArticleCacheLo: number;\n  ArticleCacheHi: number;\n  ArticleCacheMB: number;\n  DownloadRate: number;\n  AverageDownloadRate: number;\n  DownloadLimit: number;\n  ThreadCount: number;\n  PostJobCount: number;\n  UrlCount: number;\n  UpTimeSec: number;\n  DownloadTimeSec: number;\n  ServerStandBy: boolean;\n  DownloadPaused: boolean;\n  PostPaused: boolean;\n  ScanPaused: boolean;\n  ServerTime: number;\n  ResumeTime: number;\n  FeedActive: boolean;\n  FreeDiskSpaceLo: number;\n  FreeDiskSpaceHi: number;\n  FreeDiskSpaceMB: number;\n  NewsServers: [];\n}\n\nexport interface NzbgetClientOptions {\n  host: string;\n  port: string;\n  login: string | undefined;\n  hash: string | undefined;\n}\n"
  },
  {
    "path": "src/server/api/routers/usenet/router.ts",
    "content": "import { TRPCError } from '@trpc/server';\nimport dayjs from 'dayjs';\nimport { Client } from 'sabnzbd-api';\nimport { z } from 'zod';\nimport {\n  NzbgetHistoryItem,\n  NzbgetQueueItem,\n  NzbgetStatus,\n} from '~/server/api/routers/usenet/nzbget/types';\nimport { checkIntegrationsType, findAppProperty } from '~/tools/client/app-properties';\nimport { getConfig } from '~/tools/config/getConfig';\nimport { UsenetHistoryItem, UsenetQueueItem } from '~/widgets/useNet/types';\n\nimport { createTRPCRouter, publicProcedure } from '../../trpc';\nimport { NzbgetClient } from './nzbget/nzbget-client';\n\nexport const usenetRouter = createTRPCRouter({\n  info: publicProcedure\n    .input(\n      z.object({\n        configName: z.string(),\n        appId: z.string(),\n      })\n    )\n    .query(async ({ input }) => {\n      const config = getConfig(input.configName);\n\n      const app = config.apps.find((x) => x.id === input.appId);\n\n      if (!app || !checkIntegrationsType(app.integration, ['nzbGet', 'sabnzbd'])) {\n        throw new TRPCError({\n          code: 'BAD_REQUEST',\n          message: `App with ID \"${input.appId}\" could not be found.`,\n        });\n      }\n\n      if (app.integration.type === 'nzbGet') {\n        const url = new URL(app.url);\n        const options = {\n          host: url.hostname,\n          port: url.port || (url.protocol === 'https:' ? '443' : '80'),\n          login: findAppProperty(app, 'username'),\n          hash: findAppProperty(app, 'password'),\n        };\n\n        const nzbGet = NzbgetClient(options);\n\n        const nzbgetStatus: NzbgetStatus = await new Promise((resolve, reject) => {\n          nzbGet.status((err: any, result: NzbgetStatus) => {\n            if (!err) {\n              resolve(result);\n            } else {\n              reject(err);\n            }\n          });\n        });\n\n        if (!nzbgetStatus) {\n          throw new TRPCError({\n            code: 'INTERNAL_SERVER_ERROR',\n            message: 'Error while getting NZBGet status',\n          });\n        }\n\n        const bytesRemaining = nzbgetStatus.RemainingSizeMB * 1000000;\n        const eta = bytesRemaining / nzbgetStatus.DownloadRate;\n        return {\n          paused: nzbgetStatus.DownloadPaused,\n          sizeLeft: bytesRemaining,\n          speed: nzbgetStatus.DownloadRate,\n          eta,\n        };\n      }\n\n      const apiKey = findAppProperty(app, 'apiKey');\n      if (!apiKey) {\n        throw new TRPCError({\n          code: 'BAD_REQUEST',\n          message: `API Key for app \"${app.name}\" is missing`,\n        });\n      }\n\n      const { origin } = new URL(app.url);\n\n      const queue = await new Client(origin, apiKey).queue(0, -1);\n\n      const [hours, minutes, seconds] = queue.timeleft.split(':');\n      const eta = dayjs.duration({\n        hour: parseInt(hours, 10),\n        minutes: parseInt(minutes, 10),\n        seconds: parseInt(seconds, 10),\n      } as any);\n\n      return {\n        paused: queue.paused,\n        sizeLeft: parseFloat(queue.mbleft) * 1024 * 1024,\n        speed: parseFloat(queue.kbpersec) * 1000,\n        eta: eta.asSeconds(),\n      };\n    }),\n  history: publicProcedure\n    .input(\n      z.object({\n        configName: z.string(),\n        appId: z.string(),\n        limit: z.number(),\n        offset: z.number(),\n      })\n    )\n    .query(async ({ input }) => {\n      const config = getConfig(input.configName);\n\n      const app = config.apps.find((x) => x.id === input.appId);\n\n      if (!app || !checkIntegrationsType(app.integration, ['nzbGet', 'sabnzbd'])) {\n        throw new Error(`App with ID \"${input.appId}\" could not be found.`);\n      }\n\n      if (app.integration.type === 'nzbGet') {\n        const url = new URL(app.url);\n        const options = {\n          host: url.hostname,\n          port: url.port || (url.protocol === 'https:' ? '443' : '80'),\n          login: findAppProperty(app, 'username'),\n          hash: findAppProperty(app, 'password'),\n        };\n\n        const nzbGet = NzbgetClient(options);\n\n        const nzbgetHistory: NzbgetHistoryItem[] = await new Promise((resolve, reject) => {\n          nzbGet.history(false, (err: any, result: NzbgetHistoryItem[]) => {\n            if (!err) {\n              resolve(result);\n            } else {\n              reject(err);\n            }\n          });\n        });\n\n        if (!nzbgetHistory) {\n          throw new Error('Error while getting NZBGet history');\n        }\n\n        const nzbgetItems: UsenetHistoryItem[] = nzbgetHistory.map((item: NzbgetHistoryItem) => ({\n          id: item.NZBID.toString(),\n          name: item.Name,\n          // Convert from MB to bytes\n          size: item.DownloadedSizeMB * 1000000,\n          time: item.DownloadTimeSec,\n        }));\n\n        return {\n          items: nzbgetItems,\n          total: nzbgetItems.length,\n        };\n      }\n\n      const { origin } = new URL(app.url);\n\n      const apiKey = findAppProperty(app, 'apiKey');\n      if (!apiKey) {\n        throw new Error(`API Key for app \"${app.name}\" is missing`);\n      }\n\n      const history = await new Client(origin, apiKey).history(input.offset, input.limit);\n\n      const items: UsenetHistoryItem[] = history.slots.map((slot) => ({\n        id: slot.nzo_id,\n        name: slot.name,\n        size: slot.bytes,\n        time: slot.download_time,\n      }));\n\n      return {\n        items,\n        total: history.noofslots,\n      };\n    }),\n  pause: publicProcedure\n    .input(\n      z.object({\n        configName: z.string(),\n        appId: z.string(),\n      })\n    )\n    .mutation(async ({ input }) => {\n      const config = getConfig(input.configName);\n      const app = config.apps.find((x) => x.id === input.appId);\n\n      if (!app || !checkIntegrationsType(app.integration, ['nzbGet', 'sabnzbd'])) {\n        throw new Error(`App with ID \"${input.appId}\" could not be found.`);\n      }\n\n      if (app.integration.type === 'nzbGet') {\n        const url = new URL(app.url);\n        const options = {\n          host: url.hostname,\n          port: url.port || (url.protocol === 'https:' ? '443' : '80'),\n          login: findAppProperty(app, 'username'),\n          hash: findAppProperty(app, 'password'),\n        };\n\n        const nzbGet = NzbgetClient(options);\n\n        return new Promise((resolve, reject) => {\n          nzbGet.pauseDownload(false, (err: any, result: any) => {\n            if (!err) {\n              resolve(result);\n            } else {\n              reject(err);\n            }\n          });\n        });\n      }\n\n      const apiKey = findAppProperty(app, 'apiKey');\n      if (!apiKey) {\n        throw new Error(`API Key for app \"${app.name}\" is missing`);\n      }\n\n      const { origin } = new URL(app.url);\n\n      return new Client(origin, apiKey).queuePause();\n    }),\n  resume: publicProcedure\n    .input(\n      z.object({\n        configName: z.string(),\n        appId: z.string(),\n      })\n    )\n    .mutation(async ({ input }) => {\n      const config = getConfig(input.configName);\n\n      const app = config.apps.find((x) => x.id === input.appId);\n\n      if (!app || !checkIntegrationsType(app.integration, ['nzbGet', 'sabnzbd'])) {\n        throw new Error(`App with ID \"${input.appId}\" could not be found.`);\n      }\n\n      if (app.integration.type === 'nzbGet') {\n        const url = new URL(app.url);\n        const options = {\n          host: url.hostname,\n          port: url.port || (url.protocol === 'https:' ? '443' : '80'),\n          login: findAppProperty(app, 'username'),\n          hash: findAppProperty(app, 'password'),\n        };\n\n        const nzbGet = NzbgetClient(options);\n\n        return new Promise((resolve, reject) => {\n          nzbGet.resumeDownload(false, (err: any, result: any) => {\n            if (!err) {\n              resolve(result);\n            } else {\n              reject(err);\n            }\n          });\n        });\n      }\n\n      const apiKey = findAppProperty(app, 'apiKey');\n      if (!apiKey) {\n        throw new Error(`API Key for app \"${app.name}\" is missing`);\n      }\n\n      const { origin } = new URL(app.url);\n\n      return new Client(origin, apiKey).queueResume();\n    }),\n  queue: publicProcedure\n    .input(\n      z.object({\n        configName: z.string(),\n        appId: z.string(),\n        limit: z.number(),\n        offset: z.number(),\n      })\n    )\n    .query(async ({ input }) => {\n      const config = getConfig(input.configName);\n\n      const app = config.apps.find((x) => x.id === input.appId);\n\n      if (!app || !checkIntegrationsType(app.integration, ['nzbGet', 'sabnzbd'])) {\n        throw new Error(`App with ID \"${input.appId}\" could not be found.`);\n      }\n\n      if (app.integration.type === 'nzbGet') {\n        const url = new URL(app.url);\n        const options = {\n          host: url.hostname,\n          port: url.port || (url.protocol === 'https:' ? '443' : '80'),\n          login: findAppProperty(app, 'username'),\n          hash: findAppProperty(app, 'password'),\n        };\n\n        const nzbGet = NzbgetClient(options);\n\n        const nzbgetQueue: NzbgetQueueItem[] = await new Promise((resolve, reject) => {\n          nzbGet.listGroups((err: any, result: NzbgetQueueItem[]) => {\n            if (!err) {\n              resolve(result);\n            } else {\n              reject(err);\n            }\n          });\n        });\n\n        if (!nzbgetQueue) {\n          throw new Error('Error while getting NZBGet queue');\n        }\n\n        const nzbgetStatus: NzbgetStatus = await new Promise((resolve, reject) => {\n          nzbGet.status((err: any, result: NzbgetStatus) => {\n            if (!err) {\n              resolve(result);\n            } else {\n              reject(err);\n            }\n          });\n        });\n\n        if (!nzbgetStatus) {\n          throw new Error('Error while getting NZBGet status');\n        }\n\n        const nzbgetItems: UsenetQueueItem[] = nzbgetQueue.map((item: NzbgetQueueItem) => ({\n          id: item.NZBID.toString(),\n          name: item.NZBName,\n          progress: (item.DownloadedSizeMB / item.FileSizeMB) * 100,\n          eta: (item.RemainingSizeMB * 1000000) / nzbgetStatus.DownloadRate,\n          // Multiple MB to get bytes\n          size: item.FileSizeMB * 1000 * 1000,\n          state: getNzbgetState(item.Status),\n        }));\n\n        return {\n          items: nzbgetItems,\n          total: nzbgetItems.length,\n        };\n      }\n\n      const apiKey = findAppProperty(app, 'apiKey');\n      if (!apiKey) {\n        throw new Error(`API Key for app \"${app.name}\" is missing`);\n      }\n\n      const { origin } = new URL(app.url);\n      const queue = await new Client(origin, apiKey).queue(input.offset, input.limit);\n\n      const items: UsenetQueueItem[] = queue.slots.map((slot) => {\n        const [hours, minutes, seconds] = slot.timeleft.split(':');\n        const eta = dayjs.duration({\n          hour: parseInt(hours, 10),\n          minutes: parseInt(minutes, 10),\n          seconds: parseInt(seconds, 10),\n        } as any);\n\n        return {\n          id: slot.nzo_id,\n          eta: eta.asSeconds(),\n          name: slot.filename,\n          progress: parseFloat(slot.percentage),\n          size: parseFloat(slot.mb) * 1000 * 1000,\n          state: slot.status.toLowerCase() as any,\n        };\n      });\n\n      return {\n        items,\n        total: queue.noofslots,\n      };\n    }),\n});\n\nfunction getNzbgetState(status: string) {\n  switch (status) {\n    case 'QUEUED':\n      return 'queued';\n    case 'PAUSED ':\n      return 'paused';\n    default:\n      return 'downloading';\n  }\n}\n\nexport interface UsenetInfoResponse {\n  paused: boolean;\n  sizeLeft: number;\n  speed: number;\n  eta: number;\n}\n"
  },
  {
    "path": "src/server/api/routers/user.ts",
    "content": "import { TRPCError } from '@trpc/server';\n\nimport bcrypt from 'bcryptjs';\n\nimport { randomUUID } from 'crypto';\n\nimport { and, eq, like, sql } from 'drizzle-orm';\n\nimport { z } from 'zod';\n\nimport { COOKIE_COLOR_SCHEME_KEY, COOKIE_LOCALE_KEY } from '../../../../data/constants';\nimport { adminProcedure, createTRPCRouter, protectedProcedure, publicProcedure } from '../trpc';\n\nimport { db } from '~/server/db';\nimport { getTotalUserCountAsync } from '~/server/db/queries/user';\nimport { invites, sessions, users, userSettings, UserSettings } from '~/server/db/schema';\nimport { hashPassword } from '~/utils/security';\nimport {\n  colorSchemeParser,\n  createNewUserSchema,\n  signUpFormSchema,\n  updateSettingsValidationSchema,\n} from '~/validations/user';\nimport { PossibleRoleFilter } from '~/pages/manage/users';\nimport { createSelectSchema } from 'drizzle-zod';\n\nexport const userRouter = createTRPCRouter({\n  createOwnerAccount: publicProcedure.input(signUpFormSchema).mutation(async ({ ctx, input }) => {\n    const userCount = await getTotalUserCountAsync();\n    if (userCount > 0) {\n      throw new TRPCError({\n        code: 'FORBIDDEN',\n      });\n    }\n\n    await createUserIfNotPresent(input, {\n      defaultSettings: {\n        colorScheme: colorSchemeParser.parse(ctx.cookies[COOKIE_COLOR_SCHEME_KEY]),\n        language: ctx.cookies[COOKIE_LOCALE_KEY] ?? 'en',\n      },\n      isOwner: true,\n    });\n  }),\n  updatePassword: adminProcedure\n    .meta({ openapi: { method: 'PUT', path: '/users/password', tags: ['user'] } })\n    .input(\n      z.object({\n        userId: z.string(),\n        newPassword: z.string().min(3),\n        terminateExistingSessions: z.boolean(),\n      }),\n    )\n    .output(z.void())\n    .mutation(async ({ input, ctx }) => {\n      const user = await db.query.users.findFirst({\n        where: eq(users.id, input.userId),\n      });\n\n      if (!user) {\n        throw new TRPCError({\n          code: 'NOT_FOUND',\n        });\n      }\n\n      if (user.isOwner && user.id !== ctx.session.user.id) {\n        throw new TRPCError({\n          code: 'FORBIDDEN',\n          message: 'Operation not allowed or incorrect user',\n        });\n      }\n\n      const salt = bcrypt.genSaltSync(10);\n      const hashedPassword = hashPassword(input.newPassword, salt);\n\n      if (input.terminateExistingSessions) {\n        await db.delete(sessions).where(eq(sessions.userId, input.userId));\n      }\n\n      await db\n        .update(users)\n        .set({\n          password: hashedPassword,\n          salt: salt,\n        })\n        .where(eq(users.id, input.userId));\n    }),\n  count: publicProcedure\n    .meta({ openapi: { method: 'GET', path: '/users/count', tags: ['user'] } })\n    .input(z.void())\n    .output(z.number())\n    .query(async () => {\n      return await getTotalUserCountAsync();\n    }),\n  createFromInvite: publicProcedure\n    .input(\n      signUpFormSchema.and(\n        z.object({\n          inviteToken: z.string(),\n        }),\n      ),\n    )\n    .mutation(async ({ ctx, input }) => {\n      const invite = await db.query.invites.findFirst({\n        where: eq(invites.token, input.inviteToken),\n      });\n\n      if (!invite || invite.expires < new Date()) {\n        throw new TRPCError({\n          code: 'FORBIDDEN',\n          message: 'Invalid invite token',\n        });\n      }\n\n      const userId = await createUserIfNotPresent(input, {\n        defaultSettings: {\n          colorScheme: colorSchemeParser.parse(ctx.cookies[COOKIE_COLOR_SCHEME_KEY]),\n          language: ctx.cookies[COOKIE_LOCALE_KEY] ?? 'en',\n        },\n      });\n\n      await db.delete(invites).where(eq(invites.id, invite.id));\n\n      return {\n        id: userId,\n        name: input.username,\n      };\n    }),\n  changeColorScheme: protectedProcedure\n    .input(\n      z.object({\n        colorScheme: colorSchemeParser,\n      }),\n    )\n    .mutation(async ({ ctx, input }) => {\n      await db\n        .update(userSettings)\n        .set({\n          colorScheme: input.colorScheme,\n        })\n        .where(eq(userSettings.userId, ctx.session?.user?.id));\n    }),\n  changeRole: adminProcedure\n    .meta({ openapi: { method: 'PUT', path: '/users/roles', tags: ['user'] } })\n    .input(z.object({ id: z.string(), type: z.enum(['promote', 'demote']) }))\n    .output(z.void())\n    .mutation(async ({ ctx, input }) => {\n      if (ctx.session?.user?.id === input.id) {\n        throw new TRPCError({\n          code: 'FORBIDDEN',\n          message: 'You cannot change your own role',\n        });\n      }\n\n      const user = await db.query.users.findFirst({\n        where: eq(users.id, input.id),\n      });\n\n      if (!user) {\n        throw new TRPCError({\n          code: 'NOT_FOUND',\n          message: 'User not found',\n        });\n      }\n\n      if (user.isOwner) {\n        throw new TRPCError({\n          code: 'FORBIDDEN',\n          message: 'You cannot change the role of the owner',\n        });\n      }\n\n      await db\n        .update(users)\n        .set({ isAdmin: input.type === 'promote' })\n        .where(eq(users.id, input.id));\n    }),\n  changeLanguage: protectedProcedure\n    .meta({ openapi: { method: 'PUT', path: '/users/language', tags: ['user'] } })\n    .input(\n      z.object({\n        language: z.string(),\n      }),\n    )\n    .output(z.void())\n    .mutation(async ({ ctx, input }) => {\n      await db\n        .update(userSettings)\n        .set({ language: input.language })\n        .where(eq(userSettings.userId, ctx.session?.user?.id));\n    }),\n  withSettings: protectedProcedure.query(async ({ ctx }) => {\n    const user = await db.query.users.findFirst({\n      where: eq(users.id, ctx.session?.user?.id),\n      with: {\n        settings: true,\n      },\n    });\n\n    if (!user || !user.settings) {\n      throw new TRPCError({\n        code: 'NOT_FOUND',\n        message: 'User not found',\n      });\n    }\n\n    return {\n      id: user.id,\n      name: user.name,\n      settings: user.settings,\n    };\n  }),\n\n  updateSettings: protectedProcedure\n    .input(updateSettingsValidationSchema)\n    .mutation(async ({ ctx, input }) => {\n      await db\n        .update(userSettings)\n        .set({\n          autoFocusSearch: input.autoFocusSearch,\n          defaultBoard: input.defaultBoard,\n          disablePingPulse: input.disablePingPulse,\n          firstDayOfWeek: input.firstDayOfWeek,\n          language: input.language,\n          openSearchInNewTab: input.openSearchInNewTab,\n          replacePingWithIcons: input.replaceDotsWithIcons,\n          searchTemplate: input.searchTemplate,\n        })\n        .where(eq(userSettings.userId, ctx.session?.user?.id));\n    }),\n\n  makeDefaultDashboard: protectedProcedure\n    .meta({ openapi: { method: 'POST', path: '/users/make-default-dashboard', tags: ['user'] } })\n    .output(z.void())\n    .input(z.object({ board: z.string() }))\n    .mutation(async ({ ctx, input }) => {\n      await db\n        .update(userSettings)\n        .set({ defaultBoard: input.board })\n        .where(eq(userSettings.userId, ctx.session?.user?.id));\n    }),\n\n  all: adminProcedure\n    .input(\n      z.object({\n        limit: z.number().min(1).max(100).default(10),\n        page: z.number().min(0),\n        search: z.object({\n          fullTextSearch: z\n            .string()\n            .optional()\n            .transform((value) => (value === '' ? undefined : value)),\n          role: z\n            .string()\n            .transform((value) => (value.length > 0 ? value : undefined))\n            .optional(),\n        }),\n      }),\n    )\n    .output(z.object({\n      users: z.array(z.object({\n        id: z.string(),\n        name: z.string(),\n        email: z.string().or(z.null()).optional(),\n        isAdmin: z.boolean(),\n        isOwner: z.boolean(),\n      })),\n      countPages: z.number().min(0),\n      stats: z.object({\n        roles: z.record(z.number()),\n      }),\n    }))\n    .query(async ({ input }) => {\n\n      const roleFilter = () => {\n        if (input.search.role === PossibleRoleFilter[1].id) {\n          return eq(users.isOwner, true);\n        }\n\n        if (input.search.role === PossibleRoleFilter[2].id) {\n          return eq(users.isAdmin, true);\n        }\n\n        if (input.search.role === PossibleRoleFilter[3].id) {\n          return and(eq(users.isAdmin, false), eq(users.isOwner, false));\n        }\n\n        return undefined;\n      };\n\n      const limit = input.limit;\n      const dbUsers = await db.query.users.findMany({\n        limit: limit + 1,\n        offset: limit * input.page,\n        where: and(input.search.fullTextSearch ? like(users.name, `%${input.search.fullTextSearch}%`) : undefined, roleFilter()),\n      });\n\n      const countUsers = await db\n        .select({ count: sql<number>`count(*)` })\n        .from(users)\n        .where(input.search.fullTextSearch ? like(users.name, `%${input.search.fullTextSearch}%`) : undefined)\n        .where(roleFilter())\n        .then((rows) => rows[0].count);\n\n      return {\n        users: dbUsers.map((user) => ({\n          id: user.id,\n          name: user.name!,\n          email: user.email,\n          isAdmin: user.isAdmin,\n          isOwner: user.isOwner,\n        })),\n        countPages: Math.ceil(countUsers / limit),\n        stats: {\n          roles: {\n            all: (await db.select({ count: sql<number>`count(*)` }).from(users))[0]['count'],\n            owner: (\n              await db\n                .select({ count: sql<number>`count(*)` })\n                .from(users)\n                .where(eq(users.isOwner, true))\n            )[0]['count'],\n            admin: (\n              await db\n                .select({ count: sql<number>`count(*)` })\n                .from(users)\n                .where(and(eq(users.isAdmin, true), eq(users.isOwner, false)))\n            )[0]['count'],\n            normal: (\n              await db\n                .select({ count: sql<number>`count(*)` })\n                .from(users)\n                .where(and(eq(users.isAdmin, false), eq(users.isOwner, false)))\n            )[0]['count'],\n          } as Record<string, number>,\n        },\n      };\n    }),\n  create: adminProcedure\n    .meta({ openapi: { method: 'POST', path: '/users', tags: ['user'] } })\n    .input(createNewUserSchema)\n    .output(z.void())\n    .mutation(async ({ input }) => {\n      await createUserIfNotPresent(input);\n    }),\n  details: adminProcedure\n    .meta({ openapi: { method: 'GET', path: '/users/getById', tags: ['user'] } })\n    .input(z.object({ userId: z.string() }))\n    .output(\n      createSelectSchema(users)\n        .omit({\n          password: true,\n          salt: true,\n        })\n        .optional())\n    .query(async ({ input }) => {\n      return db.query.users.findFirst({\n        where: eq(users.id, input.userId),\n        columns: {\n          password: false,\n          salt: false,\n        },\n      });\n    }),\n  updateDetails: adminProcedure\n    .meta({ openapi: { method: 'PUT', path: '/users/details', tags: ['user'] } })\n    .input(z.object({\n      userId: z.string(),\n      username: z.string(),\n      eMail: z.string().optional().transform(value => value?.length === 0 ? null : value),\n    }))\n    .output(z.void())\n    .mutation(async ({ input }) => {\n      await db.update(users).set({\n        name: input.username,\n        email: input.eMail as string | null,\n      }).where(eq(users.id, input.userId));\n    }),\n  deleteUser: adminProcedure\n    .meta({ openapi: { method: 'DELETE', path: '/users', tags: ['user'] } })\n    .input(\n      z.object({\n        id: z.string(),\n      }),\n    )\n    .output(z.void())\n    .mutation(async ({ ctx, input }) => {\n      const user = await db.query.users.findFirst({\n        where: eq(users.id, input.id),\n      });\n\n      if (!user) {\n        throw new TRPCError({\n          code: 'NOT_FOUND',\n          message: 'User not found',\n        });\n      }\n\n      if (ctx.session?.user?.id === input.id) {\n        throw new TRPCError({\n          code: 'FORBIDDEN',\n          message: 'You cannot change your own role',\n        });\n      }\n      if (user.isOwner) {\n        throw new TRPCError({\n          code: 'FORBIDDEN',\n          message: 'You cannot change the role of the owner',\n        });\n      }\n\n      await db.delete(users).where(eq(users.id, input.id));\n    }),\n});\n\nconst createUserIfNotPresent = async (\n  input: z.infer<typeof createNewUserSchema>,\n  options: {\n    defaultSettings?: Partial<UserSettings>;\n    isOwner?: boolean;\n  } | void,\n) => {\n  const existingUser = await db.query.users.findFirst({\n    where: eq(users.name, input.username),\n  });\n\n  if (existingUser) {\n    throw new TRPCError({\n      code: 'CONFLICT',\n      message: 'User already exists',\n    });\n  }\n\n  const salt = bcrypt.genSaltSync(10);\n  const hashedPassword = hashPassword(input.password, salt);\n  const userId = randomUUID();\n  await db.insert(users).values({\n    id: userId,\n    name: input.username,\n    email: input.email,\n    password: hashedPassword,\n    salt: salt,\n    isAdmin: options?.isOwner ?? false,\n    isOwner: options?.isOwner ?? false,\n  });\n\n  await db.insert(userSettings).values({\n    id: randomUUID(),\n    userId,\n    ...(options?.defaultSettings ?? {}),\n  });\n\n  return userId;\n};\n"
  },
  {
    "path": "src/server/api/routers/weather.ts",
    "content": "import { z } from 'zod';\n\nimport { adminProcedure, createTRPCRouter, publicProcedure } from '../trpc';\n\nconst citySchema = z.object({\n  id: z.number(),\n  name: z.string(),\n  country: z.string().optional(),\n  country_code: z.string().optional(),\n  latitude: z.number(),\n  longitude: z.number(),\n  population: z.number().optional(),\n});\n\nconst weatherSchema = z.object({\n  current_weather: z.object({\n    weathercode: z.number(),\n    temperature: z.number(),\n  }),\n  daily: z.object({\n    time: z.array(z.string()),\n    weathercode: z.array(z.number()),\n    temperature_2m_max: z.array(z.number()),\n    temperature_2m_min: z.array(z.number()),\n  }),\n});\n\nexport const weatherRouter = createTRPCRouter({\n  findCity: adminProcedure\n    .input(\n      z.object({\n        query: z.string().min(2),\n      })\n    )\n    .output(\n      z.object({\n        results: z.array(citySchema),\n      })\n    )\n    .query(async ({ input }) => fetchCity(input.query)),\n  at: publicProcedure\n    .input(\n      z.object({\n        longitude: z.number(),\n        latitude: z.number(),\n      })\n    )\n    .output(weatherSchema)\n    .query(async ({ input }) => {\n      const res = await fetch(\n        `https://api.open-meteo.com/v1/forecast?latitude=${input.latitude}&longitude=${input.longitude}&daily=weathercode,temperature_2m_max,temperature_2m_min&current_weather=true&timezone=Europe%2FLondon`\n      );\n      return res.json();\n    }),\n});\n\nexport type City = z.infer<typeof citySchema>;\nexport type Weather = z.infer<typeof weatherSchema>;\n\nconst outputSchema = z.object({\n  results: z.array(citySchema),\n});\n\nexport const fetchCity = async (query: string) => {\n  const res = await fetch(`https://geocoding-api.open-meteo.com/v1/search?name=${query}`);\n  return outputSchema.parse(await res.json());\n};\n"
  },
  {
    "path": "src/server/api/trpc.ts",
    "content": "/**\n * YOU PROBABLY DON'T NEED TO EDIT THIS FILE, UNLESS:\n * 1. You want to modify request context (see Part 1).\n * 2. You want to create a new middleware or type of procedure (see Part 3).\n *\n * TL;DR - This is where all the tRPC server stuff is created and plugged in. The pieces you will\n * need to use are documented accordingly near the end.\n */\nimport { TRPCError, initTRPC } from '@trpc/server';\nimport { type CreateNextContextOptions } from '@trpc/server/adapters/next';\nimport { type Session } from 'next-auth';\nimport superjson from 'superjson';\nimport { ZodError } from 'zod';\n\nimport { getServerAuthSession } from '../auth';\nimport { OpenApiMeta } from 'trpc-openapi';\n\n/**\n * 1. CONTEXT\n *\n * This section defines the \"contexts\" that are available in the backend API.\n *\n * These allow you to access things when processing a request, like the database, the session, etc.\n */\n\ninterface CreateContextOptions {\n  session: Session | null;\n  cookies: Partial<Record<string, string>>;\n}\n\n/**\n * This helper generates the \"internals\" for a tRPC context. If you need to use it, you can export\n * it from here.\n *\n * Examples of things you may need it for:\n * - testing, so we don't have to mock Next.js' req/res\n * - tRPC's `createSSGHelpers`, where we don't have req/res\n *\n * @see https://create.t3.gg/en/usage/trpc#-serverapitrpcts\n */\nconst createInnerTRPCContext = (opts: CreateContextOptions) => ({\n  session: opts.session,\n  cookies: opts.cookies,\n});\n\nexport type TRPCContext = ReturnType<typeof createInnerTRPCContext>;\n\n/**\n * This is the actual context you will use in your router. It will be used to process every request\n * that goes through your tRPC endpoint.\n *\n * @see https://trpc.io/docs/context\n */\nexport const createTRPCContext = async (opts: CreateNextContextOptions) => {\n  const { req, res } = opts;\n\n  // Get the session from the server using the getServerSession wrapper function\n  const session = await getServerAuthSession({ req, res });\n\n  return createInnerTRPCContext({\n    session,\n    cookies: req.cookies,\n  });\n};\n\n/**\n * 2. INITIALIZATION\n *\n * This is where the tRPC API is initialized, connecting the context and transformer. We also parse\n * ZodErrors so that you get typesafety on the frontend if your procedure fails due to validation\n * errors on the backend.\n */\n\nconst t = initTRPC.context<typeof createTRPCContext>().meta<OpenApiMeta>().create({\n  transformer: superjson,\n  errorFormatter({ shape, error }) {\n    return {\n      ...shape,\n      data: {\n        ...shape.data,\n        zodError: error.cause instanceof ZodError ? error.cause.flatten() : null,\n      },\n    };\n  },\n});\n\n/**\n * 3. ROUTER & PROCEDURE (THE IMPORTANT BIT)\n *\n * These are the pieces you use to build your tRPC API. You should import these a lot in the\n * \"/src/server/api/routers\" directory.\n */\n\n/**\n * This is how you create new routers and sub-routers in your tRPC API.\n *\n * @see https://trpc.io/docs/router\n */\nexport const createTRPCRouter = t.router;\n\n/**\n * Public (unauthenticated) procedure\n *\n * This is the base piece you use to build new queries and mutations on your tRPC API. It does not\n * guarantee that a user querying is authorized, but you can still access user session data if they\n * are logged in.\n */\nexport const publicProcedure = t.procedure;\n\n/** Reusable middleware that enforces users are logged in before running the procedure. */\nconst enforceUserIsAuthed = t.middleware(({ ctx, next }) => {\n  if (!ctx.session?.user) {\n    throw new TRPCError({ code: 'UNAUTHORIZED' });\n  }\n  return next({\n    ctx: {\n      // infers the `session` as non-nullable\n      session: { ...ctx.session, user: ctx.session.user },\n    },\n  });\n});\n\n/**\n * Protected (authenticated) procedure\n *\n * If you want a query or mutation to ONLY be accessible to logged in users, use this. It verifies\n * the session is valid and guarantees `ctx.session.user` is not null.\n *\n * @see https://trpc.io/docs/procedures\n */\nexport const protectedProcedure = t.procedure.use(enforceUserIsAuthed);\n\n/** Reusable middleware that enforces users are logged in before running the procedure. */\nconst enforceUserIsAdmin = t.middleware(({ ctx, next }) => {\n  if (!ctx.session?.user) {\n    throw new TRPCError({ code: 'UNAUTHORIZED' });\n  }\n  if (!ctx.session?.user.isAdmin) {\n    throw new TRPCError({ code: 'FORBIDDEN' });\n  }\n\n  return next({\n    ctx: {\n      // infers the `session` as non-nullable\n      session: { ...ctx.session, user: ctx.session.user },\n    },\n  });\n});\n\n/**\n * Admin (authenticated) procedure\n *\n * If you want a query or mutation to ONLY be accessible to logged in admins, use this. It verifies\n * the session is valid, guarantees `ctx.session.user` is not null and the user is an admin.\n *\n * @see https://trpc.io/docs/procedures\n */\nexport const adminProcedure = t.procedure.use(enforceUserIsAdmin);\n"
  },
  {
    "path": "src/server/auth.ts",
    "content": "import Cookies from 'cookies';\nimport { eq } from 'drizzle-orm';\nimport { type GetServerSidePropsContext, type NextApiRequest, type NextApiResponse } from 'next';\nimport { type NextAuthOptions, getServerSession } from 'next-auth';\nimport { Adapter } from 'next-auth/adapters';\nimport { decode, encode } from 'next-auth/jwt';\nimport { env } from '~/env';\nimport { secondsFromTimeString } from '~/tools/client/parseDuration';\nimport { adapter, getProviders, onCreateUser } from '~/utils/auth';\nimport { createCookiesWithDefaultOptions } from '~/utils/auth/cookies';\nimport { createRedirectUri } from '~/utils/auth/oidc';\nimport EmptyNextAuthProvider from '~/utils/empty-provider';\nimport { fromDate, generateSessionToken } from '~/utils/session';\nimport { colorSchemeParser } from '~/validations/user';\n\nimport { db } from './db';\nimport { users } from './db/schema';\n\nconst sessionMaxAgeInSeconds =\n  secondsFromTimeString(env.AUTH_SESSION_EXPIRY_TIME) ?? 30 * 24 * 60 * 60; // 30 days\n\n/**\n * Options for NextAuth.js used to configure adapters, providers, callbacks, etc.\n *\n * @see https://next-auth.js.org/configuration/options\n */\nexport const constructAuthOptions = async (\n  req: NextApiRequest,\n  res: NextApiResponse\n): Promise<NextAuthOptions> => ({\n  events: {\n    createUser: onCreateUser,\n  },\n  callbacks: {\n    async session({ session, user }) {\n      if (session.user) {\n        // eslint-disable-next-line no-param-reassign\n        session.user.id = user.id;\n        // eslint-disable-next-line no-param-reassign\n        session.user.name = user.name as string;\n\n        const userFromDatabase = await db.query.users.findFirst({\n          with: {\n            settings: {\n              columns: {\n                colorScheme: true,\n                language: true,\n                autoFocusSearch: true,\n              },\n            },\n          },\n          where: eq(users.id, user.id),\n        });\n\n        session.user.isAdmin = userFromDatabase?.isAdmin ?? false;\n        session.user.colorScheme = userFromDatabase\n          ? colorSchemeParser.parse(userFromDatabase.settings?.colorScheme)\n          : 'environment';\n        session.user.language = userFromDatabase?.settings?.language ?? 'en';\n        session.user.autoFocusSearch = userFromDatabase?.settings?.autoFocusSearch ?? false;\n      }\n\n      return session;\n    },\n    async signIn({ user }) {\n      // Check if this sign in callback is being called in the credentials authentication flow.\n      // If so, use the next-auth adapter to create a session entry in the database\n      // (SignIn is called after authorize so we can safely assume the user is valid and already authenticated).\n      if (!isCredentialsRequest(req)) return true;\n\n      if (!user) return true;\n\n      const sessionToken = generateSessionToken();\n      const sessionExpiry = fromDate(sessionMaxAgeInSeconds);\n\n      // https://github.com/nextauthjs/next-auth/issues/6106\n      if (!adapter?.createSession) {\n        return false;\n      }\n\n      await adapter.createSession({\n        sessionToken: sessionToken,\n        userId: user.id,\n        expires: sessionExpiry,\n      });\n\n      const cookies = new Cookies(req, res);\n      cookies.set('next-auth.session-token', sessionToken, {\n        expires: sessionExpiry,\n      });\n\n      return true;\n    },\n    async redirect({ url, baseUrl }) {\n      const pathname = new URL(url, baseUrl).pathname;\n      const redirectUrl = createRedirectUri(req.headers, pathname);\n      return redirectUrl;\n    },\n  },\n  session: {\n    strategy: 'database',\n    maxAge: sessionMaxAgeInSeconds,\n  },\n  pages: {\n    signIn: '/auth/login',\n    error: '/auth/login',\n  },\n  adapter: adapter as Adapter,\n  providers: [...(await getProviders(req.headers)), EmptyNextAuthProvider()],\n  cookies: createCookiesWithDefaultOptions(req.url?.startsWith('https:') ?? false),\n  jwt: {\n    async encode(params) {\n      if (!isCredentialsRequest(req)) {\n        return encode(params);\n      }\n\n      const cookies = new Cookies(req, res);\n      const cookie = cookies.get('next-auth.session-token');\n      return cookie ?? '';\n    },\n\n    async decode(params) {\n      if (!isCredentialsRequest(req)) {\n        return decode(params);\n      }\n\n      return null;\n    },\n  },\n});\n\nconst isCredentialsRequest = (req: NextApiRequest): boolean => {\n  const nextAuthQueryParams = req.query.nextauth as string[];\n  return (\n    nextAuthQueryParams.includes('callback') &&\n    (nextAuthQueryParams.includes('credentials') ||\n      nextAuthQueryParams.includes('ldap') ||\n      nextAuthQueryParams.includes('oidc')) &&\n    req.method === 'POST'\n  );\n};\n\n/**\n * Wrapper for `getServerSession` so that you don't need to import the `authOptions` in every file.\n *\n * @see https://next-auth.js.org/configuration/nextjs\n */\nexport const getServerAuthSession = async (ctx: {\n  req: GetServerSidePropsContext['req'];\n  res: GetServerSidePropsContext['res'];\n}) => {\n  return await getServerSession(\n    ctx.req,\n    ctx.res,\n    await constructAuthOptions(\n      ctx.req as unknown as NextApiRequest,\n      ctx.res as unknown as NextApiResponse\n    )\n  );\n};\n"
  },
  {
    "path": "src/server/db/index.ts",
    "content": "import Database from 'better-sqlite3';\nimport { drizzle } from 'drizzle-orm/better-sqlite3';\nimport { env } from '~/env';\n\nimport * as schema from './schema';\n\nexport const sqlite = new Database(env.DATABASE_URL?.replace('file:', ''));\n\nexport const db = drizzle(sqlite, { schema });\n"
  },
  {
    "path": "src/server/db/queries/user.ts",
    "content": "import { sql } from 'drizzle-orm';\n\nimport { db } from '..';\nimport { users } from '../schema';\n\nexport const getTotalUserCountAsync = async () => {\n  return await db\n    .select({ count: sql<number>`count(*)` })\n    .from(users)\n    .then((rows) => rows[0].count);\n};\n"
  },
  {
    "path": "src/server/db/queries/userSettings.ts",
    "content": "import { eq } from 'drizzle-orm';\n\nimport { db } from '..';\nimport { userSettings } from '../schema';\n\nexport const getDefaultBoardAsync = async (\n  userId: string | undefined,\n  fallback: string = 'default'\n) => {\n  if (!userId) {\n    return fallback;\n  }\n  return await db.query.userSettings\n    .findFirst({\n      where: eq(userSettings.userId, userId),\n    })\n    .then((settings) => settings?.defaultBoard ?? fallback);\n};\n"
  },
  {
    "path": "src/server/db/schema.ts",
    "content": "import { InferSelectModel, relations } from 'drizzle-orm';\nimport { index, int, integer, primaryKey, sqliteTable, text } from 'drizzle-orm/sqlite-core';\nimport { type AdapterAccount } from 'next-auth/adapters';\n\n// workaround for typescript check in adapter\n// preferably add email into credential login and make email non-nullable here\nexport const _users = {\n  id: text('id').notNull().primaryKey(),\n  name: text('name'),\n  email: text('email'),\n  emailVerified: integer('emailVerified', { mode: 'timestamp_ms' }),\n  image: text('image'),\n  password: text('password'),\n  salt: text('salt'),\n  isAdmin: int('is_admin', { mode: 'boolean' }).notNull().default(false),\n  isOwner: int('is_owner', { mode: 'boolean' }).notNull().default(false),\n};\n\nexport const users = sqliteTable('user', _users);\n\nexport const accounts = sqliteTable(\n  'account',\n  {\n    userId: text('userId')\n      .notNull()\n      .references(() => users.id, { onDelete: 'cascade' }),\n    type: text('type').$type<AdapterAccount['type']>().notNull(),\n    provider: text('provider').notNull(),\n    providerAccountId: text('providerAccountId').notNull(),\n    refresh_token: text('refresh_token'),\n    access_token: text('access_token'),\n    expires_at: integer('expires_at'),\n    token_type: text('token_type'),\n    scope: text('scope'),\n    id_token: text('id_token'),\n    session_state: text('session_state'),\n  },\n  (account) => ({\n    compoundKey: primaryKey(account.provider, account.providerAccountId),\n    userIdIdx: index('userId_idx').on(account.userId),\n  })\n);\n\nexport const sessions = sqliteTable(\n  'session',\n  {\n    sessionToken: text('sessionToken').notNull().primaryKey(),\n    userId: text('userId')\n      .notNull()\n      .references(() => users.id, { onDelete: 'cascade' }),\n    expires: integer('expires', { mode: 'timestamp_ms' }).notNull(),\n  },\n  (session) => ({\n    userIdIdx: index('user_id_idx').on(session.userId),\n  })\n);\n\nexport const verificationTokens = sqliteTable(\n  'verificationToken',\n  {\n    identifier: text('identifier').notNull(),\n    token: text('token').notNull(),\n    expires: integer('expires', { mode: 'timestamp_ms' }).notNull(),\n  },\n  (vt) => ({\n    compoundKey: primaryKey(vt.identifier, vt.token),\n  })\n);\n\nconst validColorScheme = ['environment', 'light', 'dark'] as const;\ntype ValidColorScheme = (typeof validColorScheme)[number];\nconst firstDaysOfWeek = ['monday', 'saturday', 'sunday'] as const;\ntype ValidFirstDayOfWeek = (typeof firstDaysOfWeek)[number];\n\nexport const userSettings = sqliteTable('user_setting', {\n  id: text('id').notNull().primaryKey(),\n  userId: text('user_id')\n    .notNull()\n    .references(() => users.id, { onDelete: 'cascade' }),\n  colorScheme: text('color_scheme').$type<ValidColorScheme>().notNull().default('environment'),\n  language: text('language').notNull().default('en'),\n  defaultBoard: text('default_board').notNull().default('default'),\n  firstDayOfWeek: text('first_day_of_week')\n    .$type<ValidFirstDayOfWeek>()\n    .notNull()\n    .default('monday'),\n  searchTemplate: text('search_template').notNull().default('https://google.com/search?q=%s'),\n  openSearchInNewTab: int('open_search_in_new_tab', { mode: 'boolean' }).notNull().default(true),\n  disablePingPulse: int('disable_ping_pulse', { mode: 'boolean' }).notNull().default(false),\n  replacePingWithIcons: int('replace_ping_with_icons', { mode: 'boolean' })\n    .notNull()\n    .default(false),\n  useDebugLanguage: int('use_debug_language', { mode: 'boolean' }).notNull().default(false),\n  autoFocusSearch: int('auto_focus_search', { mode: 'boolean' }).notNull().default(false),\n});\n\nexport type UserSettings = InferSelectModel<typeof userSettings>;\n\nexport const invites = sqliteTable('invite', {\n  id: text('id').notNull().primaryKey(),\n  token: text('token').notNull().unique(),\n  expires: int('expires', {\n    mode: 'timestamp',\n  }).notNull(),\n  createdById: text('created_by_id')\n    .notNull()\n    .references(() => users.id, { onDelete: 'cascade' }),\n});\n\nexport type Invite = InferSelectModel<typeof invites>;\n\nexport const migrateTokens = sqliteTable('migrate_token', {\n  id: text('id').notNull().primaryKey(),\n  token: text('token').notNull().unique(),\n  boards: int('boards', { mode: 'boolean' }).notNull(),\n  users: int('users', { mode: 'boolean' }).notNull(),\n  integrations: int('integrations', { mode: 'boolean' }).notNull(),\n  expires: int('expires', {\n    mode: 'timestamp',\n  }).notNull(),\n});\n\nexport const accountRelations = relations(accounts, ({ one }) => ({\n  user: one(users, {\n    fields: [accounts.userId],\n    references: [users.id],\n  }),\n}));\n\nexport const userRelations = relations(users, ({ many, one }) => ({\n  accounts: many(accounts),\n  settings: one(userSettings),\n  invites: many(invites),\n}));\n\nexport const userSettingRelations = relations(userSettings, ({ one }) => ({\n  user: one(users, {\n    fields: [userSettings.userId],\n    references: [users.id],\n  }),\n}));\n\nexport const inviteRelations = relations(invites, ({ one }) => ({\n  createdBy: one(users, {\n    fields: [invites.createdById],\n    references: [users.id],\n  }),\n}));\n"
  },
  {
    "path": "src/server/openai.ts",
    "content": "import { generateOpenApiDocument } from 'trpc-openapi';\nimport { appRouter } from '~/server/api/routers/app';\nimport { rootRouter } from '~/server/api/root';\n\nexport const openApiDocument = generateOpenApiDocument(rootRouter, {\n  title: 'Homarr API',\n  description: 'OpenAPI compliant REST API built of interfacing with Homarr',\n  version: '1.0.0',\n  baseUrl: 'http://localhost:3000/api',\n  docsUrl: 'https://homarr.dev'\n});"
  },
  {
    "path": "src/styles/global.scss",
    "content": "@import 'fily-publish-gridstack/dist/gridstack.min.css';\n\n:root {\n  --gridstack-widget-width: 64;\n  --gridstack-column-count: 12;\n  // https://developer.mozilla.org/en-US/docs/Web/CSS/scrollbar-gutter\n  scrollbar-gutter: stable;\n}\n\n.grid-stack-placeholder > .placeholder-content {\n  background-color: rgb(248, 249, 250) !important;\n  border-radius: 12px;\n  border: 1px solid rgba(0, 0, 0, 0.05);\n}\n\n@media (prefers-color-scheme: dark) {\n  .grid-stack-placeholder > .placeholder-content {\n    background-color: rgba(255, 255, 255, 0.05) !important;\n  }\n}\n\n// Styling for grid-stack main area\n@for $i from 1 to 96 {\n  .grid-stack > .grid-stack-item[gs-w=\"#{$i}\"] {\n    width: calc(100% / #{var(--gridstack-column-count)} * #{$i})\n  }\n  .grid-stack > .grid-stack-item[gs-min-w=\"#{$i}\"] {\n    min-width: calc(100% / #{var(--gridstack-column-count)} * #{$i})\n  }\n  .grid-stack > .grid-stack-item[gs-max-w=\"#{$i}\"] {\n    max-width: calc(100% / #{var(--gridstack-column-count)} * #{$i})\n  }\n}\n\n@for $i from 1 to 96 {\n  .grid-stack > .grid-stack-item[gs-h=\"#{$i}\"] {\n    height: calc(#{$i}px * #{var(--gridstack-widget-width)})\n  }\n  .grid-stack > .grid-stack-item[gs-min-h=\"#{$i}\"] {\n    min-height: calc(#{$i}px * #{var(--gridstack-widget-width)})\n  }\n  .grid-stack > .grid-stack-item[gs-max-h=\"#{$i}\"] {\n    max-height: calc(#{$i}px * #{var(--gridstack-widget-width)})\n  }\n}\n\n@for $i from 1 to 96 {\n  .grid-stack > .grid-stack-item[gs-x=\"#{$i}\"] {\n    left: calc(100% / #{var(--gridstack-column-count)} * #{$i})\n  }\n}\n\n\n@for $i from 1 to 96 {\n  .grid-stack > .grid-stack-item[gs-y=\"#{$i}\"] {\n    top: calc(#{$i}px * #{var(--gridstack-widget-width)})\n  }\n}\n\n.grid-stack > .grid-stack-item {\n  min-width: #{var(--gridstack-widget-width)};\n}\n\n// Styling for sidebar grid-stack elements\n@for $i from 1 to 96 {\n  .grid-stack.grid-stack-sidebar > .grid-stack-item[gs-w=\"#{$i}\"] {\n    width: 128px * $i\n  }\n  .grid-stack.grid-stack-sidebar > .grid-stack-item[gs-min-w=\"#{$i}\"] {\n    min-width: 128px * $i\n  }\n  .grid-stack.grid-stack-sidebar > .grid-stack-item[gs-max-w=\"#{$i}\"] {\n    max-width: 128px * $i\n  }\n}\n\n@for $i from 1 to 96 {\n  .grid-stack.grid-stack-sidebar > .grid-stack-item[gs-h=\"#{$i}\"] {\n    height: 128px * $i\n  }\n  .grid-stack.grid-stack-sidebar > .grid-stack-item[gs-min-h=\"#{$i}\"] {\n    min-height: 128px * $i\n  }\n  .grid-stack.grid-stack-sidebar > .grid-stack-item[gs-max-h=\"#{$i}\"] {\n    max-height: 128px * $i\n  }\n}\n\n@for $i from 1 to 3 {\n  .grid-stack.grid-stack-sidebar > .grid-stack-item[gs-x=\"#{$i}\"] {\n    left: 128px * $i\n  }\n}\n\n\n@for $i from 1 to 96 {\n  .grid-stack.grid-stack-sidebar > .grid-stack-item[gs-y=\"#{$i}\"] {\n    top: 128px * $i\n  }\n}\n\n.grid-stack.grid-stack-sidebar > .grid-stack-item {\n  min-width: 128px;\n}\n\n// General gridstack styling\n.grid-stack > .grid-stack-item > .grid-stack-item-content,\n.grid-stack > .grid-stack-item > .placeholder-content {\n  inset: 10px;\n}\n\n.grid-stack > .grid-stack-item > .ui-resizable-se {\n  bottom: 10px;\n  right: 10px;\n}\n\n.grid-stack > .grid-stack-item > .grid-stack-item-content {\n  overflow-y: auto;\n}\n\n.grid-stack.grid-stack-animate {\n  transition: none;\n}\n\n.gridstack-empty-wrapper {\n  height: 0px;\n  min-height: 0px !important;\n}\n\n.scroll-area-w100 .mantine-ScrollArea-viewport > div:nth-of-type(1) {\n  width: 100%;\n  display: inherit !important;\n}\n\n.polka {\n  background-image: radial-gradient(\n                  color-mix(in srgb, var(--mantine-color-red-6) 20%, transparent) 6px,\n                  transparent 6px\n  );\n  background-size: 60px 60px;\n}\n\n.mantine-Modal-title {\n  font-size: 1.375rem;\n  font-weight: 700;\n}\n\n.tiptap {\n  hr {\n    border-top-style: double;\n  }\n\n  ul[data-type=\"taskList\"] {\n    padding-left: 17px;\n\n    li {\n      list-style-type: none;\n      display: flex;\n      gap: 8px;\n    }\n  }\n\n  img {\n    max-width: 100%;\n\n    &.ProseMirror-selectednode {\n      outline: 3px solid rgba(0, 65, 198, 0.8);\n    }\n  }\n\n  table {\n    border-collapse: collapse;\n    margin: 0;\n    overflow: hidden;\n    table-layout: fixed;\n    width: 100%;\n\n    td {\n      border-color: var(--mantine-color-gray-5) !important;\n      border-width: 1px !important;\n      border-style: solid !important;\n      box-sizing: border-box;\n      min-width: 1em;\n      padding: 3px 5px;\n      position: relative;\n      vertical-align: top;\n\n      > * {\n        margin-bottom: 0;\n      }\n    }\n\n    .selectedCell:after {\n      background: rgba(200, 200, 200, 0.4);\n      content: \"\";\n      left: 0;\n      right: 0;\n      top: 0;\n      bottom: 0;\n      pointer-events: none;\n      position: absolute;\n      z-index: 2;\n    }\n\n    p {\n      margin: 0;\n    }\n  }\n\n  &[contenteditable=\"true\"].resize-cursor {\n    cursor: ew-resize;\n  }\n\n  &[contenteditable=\"false\"].resize-cursor {\n    pointer-events: none;\n  }\n}\n\n.tableWrapper {\n  padding: 1rem 0;\n  overflow-x: auto;\n}\n\n.open-api-container[data-color-scheme=\"dark\"] .swagger-ui {\n  select {\n    background-color: #25262b;\n    color: #82858e;\n  }\n\n  .scheme-container {\n    background-color: #1a1b1e !important;\n  }\n\n  .opblock-tag,\n  .info .title {\n    color: #bfc5d5;\n  }\n\n  .servers-title,\n  .opblock .opblock-summary-operation-id,\n  .opblock .opblock-summary-path,\n  .opblock .opblock-summary-path__deprecated,\n  .info li, .info p, .info table {\n    color: #82858e;\n  }\n\n  .expand-methods svg,\n  .expand-operation svg,\n  .opblock-control-arrow svg {\n    fill: #8c8c8c;\n  }\n\n  .opblock-summary-description {\n    color: white;\n  }\n}"
  },
  {
    "path": "src/tools/_tests/bytesHelper.spec.ts",
    "content": "import { describe, expect, it } from 'vitest';\n\nimport { bytes } from '../bytesHelper';\n\ndescribe('bytes.toPerSecondString', () => {\n  it('should format 999 bytes as 999 b/s', () => {\n    // Arrange\n    const byteCount = 999;\n    // Act\n    const result = bytes.toPerSecondString(byteCount);\n    // Assert\n    expect(result).toBe('999.0 b/s');\n  });\n  it.each([\n    [1, 'b/s', 'Kb/s'],\n    [2, 'Kb/s', 'Mb/s'],\n    [3, 'Mb/s', 'Gb/s'],\n  ])('should format 1000^%s bytes or 1000 %s as 1.0 %s', (power, _unit, nextUnit) => {\n    // Arrange\n    const byteCount = Math.pow(1000, power);\n    // Act\n    const result = bytes.toPerSecondString(byteCount);\n    // Assert\n    expect(result).toBe(`1.0 ${nextUnit}`);\n  });\n  it('should format 1000^4 bytes or 1 Tb/s with as 1000.0 Gb/s', () => {\n    // Arrange\n    const byteCount = Math.pow(1000, 4);\n    // Act\n    const result = bytes.toPerSecondString(byteCount);\n    // Assert\n    expect(result).toBe('1000.0 Gb/s');\n  });\n  it('should format undefined as -', () => {\n    // Arrange\n    const byteCount = undefined;\n    // Act\n    const result = bytes.toPerSecondString(byteCount);\n    // Assert\n    expect(result).toBe('-');\n  });\n});\n\ndescribe('bytes.toString', () => {\n  it('should format 999 bytes as 999 B', () => {\n    // Arrange\n    const byteCount = 999;\n    // Act\n    const result = bytes.toString(byteCount);\n    // Assert\n    expect(result).toBe('999.0 B');\n  });\n  it.each([\n    [1, 'B', 'KiB'],\n    [2, 'KiB', 'MiB'],\n    [3, 'MiB', 'GiB'],\n  ])('should format 1024^%s bytes or 1024 %s as 1.0 %s', (power, _unit, nextUnit) => {\n    // Arrange\n    const byteCount = Math.pow(1024, power);\n    // Act\n    const result = bytes.toString(byteCount);\n    // Assert\n    expect(result).toBe(`1.0 ${nextUnit}`);\n  });\n  it('should format 1024^4 bytes or 1 TiB with as 1024.0 GiB', () => {\n    // Arrange\n    const byteCount = Math.pow(1024, 4);\n    // Act\n    const result = bytes.toString(byteCount);\n    // Assert\n    expect(result).toBe('1024.0 GiB');\n  });\n});\n"
  },
  {
    "path": "src/tools/_tests/humanFileSize.spec.ts",
    "content": "import { describe, expect, it } from 'vitest';\n\nimport { humanFileSize } from '../humanFileSize';\n\ndescribe('humanFileSize', () => {\n  it('should format 1023 bytes as 1023 B', () => {\n    // Arrange\n    const bytes = 1023;\n\n    // Act\n    const result = humanFileSize(bytes, false);\n\n    // Assert\n    expect(result).toBe('1023 B');\n  });\n  it.each([\n    [1, 'B', 'KiB'],\n    [2, 'KiB', 'MiB'],\n    [3, 'MiB', 'GiB'],\n    [4, 'GiB', 'TiB'],\n    [5, 'TiB', 'PiB'],\n    [6, 'PiB', 'EiB'],\n    [7, 'EiB', 'ZiB'],\n    [8, 'ZiB', 'YiB'],\n  ])(\n    'should format 1024^%s B or 1024 %s with 1024 threshhold as 1.0 %s',\n    (power, _unit, nextUnit) => {\n      // Arrange\n      const bytes = Math.pow(1024, power);\n\n      // Act\n      const result = humanFileSize(bytes, false);\n\n      // Assert\n      expect(result).toBe(`1.0 ${nextUnit}`);\n    }\n  );\n  it('should format 1024^9 B or 1024 YiB with 1024 threshhold as 1024.0 YiB', () => {\n    // Arrange\n    const bytes = Math.pow(1024, 9);\n\n    // Act\n    const result = humanFileSize(bytes, false);\n\n    // Assert\n    expect(result).toBe('1024.0 YiB');\n  });\n  it('should format 999 bytes as 999 B', () => {\n    // Arrange\n    const bytes = 999;\n\n    // Act\n    const result = humanFileSize(bytes);\n\n    // Assert\n    expect(result).toBe('999 B');\n  });\n  it.each([\n    [1, 'B', 'KB'],\n    [2, 'KB', 'MB'],\n    [3, 'MB', 'GB'],\n    [4, 'GB', 'TB'],\n    [5, 'TB', 'PB'],\n    [6, 'PB', 'EB'],\n    [7, 'EB', 'ZB'],\n    [8, 'ZB', 'YB'],\n  ])(\n    'should format 1000^%s B or 1000 %s with 1000 threshhold as 1.0 %s',\n    (power, _unit, nextUnit) => {\n      // Arrange\n      const bytes = Math.pow(1000, power);\n\n      // Act\n      const result = humanFileSize(bytes);\n\n      // Assert\n      expect(result).toBe(`1.0 ${nextUnit}`);\n    }\n  );\n  it('should format 1000^9 B or 1000 YB with 1000 threshhold as 1000.0 YB', () => {\n    // Arrange\n    const bytes = Math.pow(1000, 9);\n\n    // Act\n    const result = humanFileSize(bytes);\n\n    // Assert\n    expect(result).toBe('1000.0 YB');\n  });\n  it('should format 1000 B with 1000 threshhold and 0 decimal places as 1 KB', () => {\n    // Arrange\n    const bytes = 1000;\n\n    // Act\n    const result = humanFileSize(bytes, true, 0);\n\n    // Assert\n    expect(result).toBe('1 KB');\n  });\n  it('should format 1000 B with 1000 threshhold and 4 decimal places as 1.0000 KB', () => {\n    // Arrange\n    const bytes = 1000;\n\n    // Act\n    const result = humanFileSize(bytes, true, 4);\n\n    // Assert\n    expect(result).toBe('1.0000 KB');\n  });\n});\n"
  },
  {
    "path": "src/tools/_tests/language.spec.ts",
    "content": "import { describe, expect, it } from 'vitest';\n\nimport { getLanguageByCode } from '../language';\n\ndescribe('getLanguageByCode', () => {\n  it('should return Vietnamese for code vi', () => {\n    // Arrange\n    const code = 'vi';\n    // Act\n    const result = getLanguageByCode(code);\n    // Assert\n    expect(result.translatedName).toBe('Vietnamese');\n  });\n  it('should return English as fallback for code null', () => {\n    // Arrange\n    const code = null;\n    // Act\n    const result = getLanguageByCode(code);\n    // Assert\n    expect(result.translatedName).toBe('English');\n  });\n});\n"
  },
  {
    "path": "src/tools/acceptableStatusCodes.ts",
    "content": "import { SelectItem } from '@mantine/core';\n\nexport const StatusCodes: SelectItem[] = [\n  { value: '200', label: '200 - OK', group: 'Sucessful responses' },\n  { value: '202', label: '202 - Accepted', group: 'Sucessful responses' },\n  { value: '204', label: '204 - No Content', group: 'Sucessful responses' },\n  { value: '301', label: '301 - Moved Permanently', group: 'Redirection responses' },\n  { value: '302', label: '302 - Found / Moved Temporarily', group: 'Redirection responses' },\n  { value: '304', label: '304 - Not Modified', group: 'Redirection responses' },\n  { value: '307', label: '307 - Temporary Redirect', group: 'Redirection responses' },\n  { value: '308', label: '308 - Permanent Redirect', group: 'Redirection responses' },\n  { value: '400', label: '400 - Bad Request', group: 'Client error responses' },\n  { value: '401', label: '401 - Unauthorized', group: 'Client error responses' },\n  { value: '403', label: '403 - Forbidden', group: 'Client error responses' },\n  { value: '404', label: '404 - Not Found', group: 'Client error responses' },\n  { value: '405', label: '405 - Method Not Allowed', group: 'Client error responses' },\n  { value: '408', label: '408 - Request Timeout', group: 'Client error responses' },\n  { value: '410', label: '410 - Gone', group: 'Client error responses' },\n  { value: '429', label: '429 - Too Many Requests', group: 'Client error responses' },\n  { value: '500', label: '500 - Internal Server Error', group: 'Server error responses' },\n  { value: '502', label: '502 - Bad Gateway', group: 'Server error responses' },\n  { value: '503', label: '503 - Service Unavailable', group: 'Server error responses' },\n  { value: '504', label: '504 - Gateway Timeout Error', group: 'Server error responses' },\n];\n"
  },
  {
    "path": "src/tools/bytesHelper.ts",
    "content": "/* eslint-disable no-param-reassign */\n/* eslint-disable no-plusplus */\n/* eslint-disable consistent-return */\nexport const bytes = {\n  toPerSecondString: (bytes?: number) => {\n    if (!bytes) return '-';\n    for (let i = 0; i < 4; i++) {\n      if (bytes >= 1000 && i !== 3) {\n        bytes /= 1000;\n        continue;\n      }\n\n      return `${bytes.toFixed(1)} ${perSecondUnits[i]}`;\n    }\n  },\n  toString: (bytes: number) => {\n    for (let i = 0; i < 4; i++) {\n      if (bytes >= 1024 && i !== 3) {\n        bytes /= 1024;\n        continue;\n      }\n\n      return `${bytes.toFixed(1)} ${units[i]}`;\n    }\n  },\n};\n\nconst perSecondUnits = ['b/s', 'Kb/s', 'Mb/s', 'Gb/s'];\nconst units = ['B', 'KiB', 'MiB', 'GiB'];\n"
  },
  {
    "path": "src/tools/client/app-properties.ts",
    "content": "import { ConfigAppType, IntegrationField, IntegrationType } from '~/types/app';\n\nexport const findAppProperty = (app: ConfigAppType, key: IntegrationField) =>\n  app.integration?.properties.find((prop) => prop.field === key)?.value ?? '';\n\n/** Checks if the type of an integration is part of the TIntegrations array with propper typing */\nexport const checkIntegrationsType = <\n  TTest extends CheckIntegrationTypeInput,\n  TIntegrations extends readonly IntegrationType[],\n>(\n  test: TTest | undefined | null,\n  integrations: TIntegrations\n): test is CheckIntegrationType<TTest, TIntegrations> => {\n  if (!test) return false;\n  return integrations.includes(test.type!);\n};\n\ntype CheckIntegrationTypeInput = {\n  type: IntegrationType | null;\n};\n\ntype CheckIntegrationType<\n  TInput extends CheckIntegrationTypeInput,\n  TIntegrations extends readonly IntegrationType[],\n> = TInput & {\n  type: TIntegrations[number];\n};\n"
  },
  {
    "path": "src/tools/client/arrays.ts",
    "content": "export const createDummyArray = (countItems: number) => Array.from(Array(countItems).keys());\n"
  },
  {
    "path": "src/tools/client/calculateEta.ts",
    "content": "export const calculateETA = (givenSeconds: number) => {\n  // If its superior than one day return > 1 day\n  if (givenSeconds > 86400) {\n    return '> 1 day';\n  }\n  // Transform the givenSeconds into a readable format. e.g. 1h 2m 3s\n  const hours = Math.floor(givenSeconds / 3600);\n  const minutes = Math.floor((givenSeconds % 3600) / 60);\n  const seconds = Math.floor(givenSeconds % 60);\n  // Only show hours if it's greater than 0.\n  const hoursString = hours > 0 ? `${hours}h ` : '';\n  const minutesString = minutes > 0 ? `${minutes}m ` : '';\n  const secondsString = seconds > 0 ? `${seconds}s` : '';\n  return `${hoursString}${minutesString}${secondsString}`;\n};\n"
  },
  {
    "path": "src/tools/client/math.ts",
    "content": "const ranges = [\n  { divider: 1e18, suffix: 'E' },\n  { divider: 1e15, suffix: 'P' },\n  { divider: 1e12, suffix: 'T' },\n  { divider: 1e9, suffix: 'G' },\n  { divider: 1e6, suffix: 'M' },\n  { divider: 1e3, suffix: 'k' },\n];\n\nexport const formatNumber = (n: number, decimalPlaces: number) => {\n  // eslint-disable-next-line no-restricted-syntax\n  for (const range of ranges) {\n    if (n < range.divider) continue;\n\n    return (n / range.divider).toFixed(decimalPlaces) + range.suffix;\n  }\n  return n.toFixed(decimalPlaces);\n};\n\nexport const formatPercentage = (n: number, decimalPlaces: number) => {\n  return `${(n * 100).toFixed(decimalPlaces)}%`;\n};\n"
  },
  {
    "path": "src/tools/client/objects.ts",
    "content": "export const mapObject = <T, R>(\n  items: Record<string, T>,\n  mapper: (prop: string, item: T) => R\n): Record<string, R> =>\n  Object.fromEntries(Object.entries(items).map(([name, item]) => [name, mapper(name, item)]));\n"
  },
  {
    "path": "src/tools/client/parseDuration.ts",
    "content": "import dayjs from 'dayjs';\nimport duration from 'dayjs/plugin/duration';\nimport { TFunction } from 'next-i18next';\n\ndayjs.extend(duration);\n\nexport const parseDuration = (time: number, t: TFunction): string => {\n  const etaDuration = dayjs.duration(time, 's');\n\n  let eta = etaDuration.format(`s [${t('common:time.seconds')}]`);\n\n  if (etaDuration.asMinutes() > 1) {\n    eta = etaDuration.format(`m [${t('common:time.minutes')}] `) + eta;\n  }\n  if (etaDuration.asHours() > 1) {\n    eta = etaDuration.format(`H [${t('common:time.hours')}] `) + eta;\n  }\n\n  return eta;\n};\n\nexport const secondsFromTimeString = (time: string | undefined): number | undefined => {\n  if (!time) {\n    return undefined;\n  }\n  const lastChar = time[time.length - 1];\n  if (!isNaN(+lastChar)) {\n    return Number(time);\n  }\n\n  const numTime = +time.substring(0, time.length - 1);\n  switch (lastChar.toLowerCase()) {\n    case 's': {\n      return numTime;\n    }\n    case 'm': {\n      return numTime * 60;\n    }\n    case 'h': {\n      return numTime * 60 * 60;\n    }\n    case 'd': {\n      return numTime * 24 * 60 * 60;\n    }\n    default: {\n      return undefined;\n    }\n  }\n};\n"
  },
  {
    "path": "src/tools/client/time.ts",
    "content": "export const sleep = (ms: number) =>\n  new Promise((r) => {\n    setTimeout(r, ms);\n  });\n"
  },
  {
    "path": "src/tools/client/zustands/usePackageAttributesStore.ts",
    "content": "import { createWithEqualityFn } from 'zustand/traditional';\n\nimport { ServerSidePackageAttributesType } from '../../server/getPackageVersion';\n\ninterface PackageAttributesState {\n  attributes: ServerSidePackageAttributesType;\n  setInitialPackageAttributes: (attributes: ServerSidePackageAttributesType) => void;\n}\n\nexport const usePackageAttributesStore = createWithEqualityFn<PackageAttributesState>(\n  (set) => ({\n    attributes: { packageVersion: undefined, environment: 'test', dependencies: {} },\n    setInitialPackageAttributes(attributes) {\n      set((state) => ({ ...state, attributes }));\n    },\n  }),\n  Object.is\n);\n"
  },
  {
    "path": "src/tools/color.ts",
    "content": "import { MantineTheme } from '@mantine/core';\nimport { createContext, useContext } from 'react';\n\ntype colorThemeContextType = {\n  primaryColor: MantineTheme['primaryColor'];\n  secondaryColor: MantineTheme['primaryColor'];\n  primaryShade: MantineTheme['primaryShade'];\n  setPrimaryColor: (color: MantineTheme['primaryColor']) => void;\n  setSecondaryColor: (color: MantineTheme['primaryColor']) => void;\n  setPrimaryShade: (shade: MantineTheme['primaryShade']) => void;\n};\n\nexport const ColorTheme = createContext<colorThemeContextType>({\n  primaryColor: 'red',\n  secondaryColor: 'orange',\n  primaryShade: 6,\n  setPrimaryColor: () => {},\n  setSecondaryColor: () => {},\n  setPrimaryShade: () => {},\n});\n\nexport function useColorTheme() {\n  const context = useContext(ColorTheme);\n  if (context === undefined) {\n    throw new Error('useColorTheme must be used within a ColorTheme.Provider');\n  }\n  return context;\n}\n"
  },
  {
    "path": "src/tools/config/configExists.ts",
    "content": "import fs from 'fs';\n\nimport { generateConfigPath } from './generateConfigPath';\n\nexport const configExists = (name: string) => {\n  const path = generateConfigPath(name);\n  return fs.existsSync(path);\n};\n"
  },
  {
    "path": "src/tools/config/generateConfigPath.ts",
    "content": "import path from 'path';\n\nexport const generateConfigPath = (configName: string) =>\n  path.join(process.cwd(), 'data/configs', `${configName}.json`);\n"
  },
  {
    "path": "src/tools/config/getConfig.ts",
    "content": "import Consola from 'consola';\nimport { v4 as uuidv4 } from 'uuid';\nimport { BackendConfigType, ConfigType } from '~/types/config';\n\nimport { configExists } from './configExists';\nimport { getFallbackConfig } from './getFallbackConfig';\nimport { readConfig } from './readConfig';\nimport { writeConfig } from './writeConfig';\n\nconst uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;\n\nexport const getConfig = (name: string): BackendConfigType => {\n  if (!configExists(name)) return getFallbackConfig() as unknown as ConfigType;\n  // Else if config exists but contains no \"schema_version\" property\n  // then it is an old config file and we should try to migrate it\n  // to the new format.\n  const config = readConfig(name);\n\n  let backendConfig = config as BackendConfigType;\n\n  if (backendConfig.widgets.some((widget) => !uuidRegex.test(widget.id))) {\n    backendConfig = {\n      ...backendConfig,\n      widgets: backendConfig.widgets.map((widget) => ({\n        ...widget,\n        id: uuidRegex.test(widget.id) ? widget.id : uuidv4(),\n        type: !uuidRegex.test(widget.id) ? widget.id : widget.type,\n      })),\n    };\n\n    Consola.log(\n      'Migrating config file to multiple widgets...',\n      backendConfig.configProperties.name\n    );\n\n    writeConfig(backendConfig);\n  }\n\n  if (!backendConfig.settings.access) {\n    backendConfig.settings.access = {\n      allowGuests: false,\n    };\n  }\n\n  return backendConfig;\n};\n"
  },
  {
    "path": "src/tools/config/getFallbackConfig.ts",
    "content": "import { ConfigType } from '~/types/config';\n\nimport defaultConfig from '../../../data/default.json';\n\nexport const getFallbackConfig = (name?: string) => ({\n  ...defaultConfig,\n  configProperties: {\n    name: name ?? 'default',\n  },\n});\n\nexport const getStaticFallbackConfig = (name: string): ConfigType => ({\n  schemaVersion: 1,\n  configProperties: {\n    name: name,\n  },\n  categories: [\n    {\n      id: '47af36c0-47c1-4e5b-bfc7-ad645ee6a33f',\n      position: 1,\n      name: 'Welcome to Homarr 🎉',\n    },\n  ],\n  wrappers: [\n    {\n      id: 'default',\n      position: 0,\n    },\n    {\n      id: '47af36c0-47c1-4e5b-bfc7-ad645ee6a326',\n      position: 1,\n    },\n  ],\n  apps: [],\n  widgets: [],\n  settings: {\n    access: {\n      allowGuests: false,\n    },\n    common: {\n      searchEngine: {\n        type: 'google',\n        properties: {\n          enabled: true,\n          openInNewTab: true,\n        },\n      },\n    },\n    customization: {\n      layout: {\n        enabledLeftSidebar: false,\n        enabledRightSidebar: false,\n        enabledDocker: false,\n        enabledPing: false,\n        enabledSearchbar: true,\n      },\n      accessibility: {\n        disablePingPulse: false,\n        replacePingDotsWithIcons: false,\n      },\n      pageTitle: 'Homarr ⭐️',\n      logoImageUrl: '/imgs/logo/logo.png',\n      faviconUrl: '/imgs/favicon/favicon-squared.png',\n      backgroundImageUrl: '',\n      customCss: '',\n      colors: {\n        primary: 'red',\n        secondary: 'yellow',\n        shade: 7,\n      },\n      appOpacity: 100,\n    },\n  },\n});\n"
  },
  {
    "path": "src/tools/config/getFrontendConfig.ts",
    "content": "import Consola from 'consola';\nimport fs from 'fs';\nimport { fetchCity } from '~/server/api/routers/weather';\nimport { IntegrationField } from '~/types/app';\nimport { BackendConfigType, ConfigType } from '~/types/config';\n\nimport { getConfig } from './getConfig';\n\nexport const getFrontendConfig = async (name: string): Promise<ConfigType> => {\n  let config = getConfig(name);\n  let shouldMigrateConfig = false;\n\n  config = migrateAppConfigs(config);\n\n  const anyWeatherWidgetWithStringLocation = config.widgets.some(\n    (widget) => widget.type === 'weather' && typeof widget.properties.location === 'string'\n  );\n\n  if (anyWeatherWidgetWithStringLocation) {\n    config = await migrateLocation(config);\n    shouldMigrateConfig = true;\n  }\n\n  const anyPiholeIntegrationWithPassword = config.apps.some(\n    (app) =>\n      app?.integration?.type === 'pihole' &&\n      app?.integration?.properties.length &&\n      app.integration.properties.some((property) => property.field === 'password')\n  );\n\n  if (anyPiholeIntegrationWithPassword) {\n    config = migratePiholeIntegrationField(config);\n    shouldMigrateConfig = true;\n  }\n\n  if (shouldMigrateConfig) {\n    Consola.info(`Migrating config ${config.configProperties.name}`);\n    fs.writeFileSync(\n      `./data/configs/${config.configProperties.name}.json`,\n      JSON.stringify(config, null, 2)\n    );\n  }\n\n  const someAppsWithoutProps = config.apps.filter(\n    (app) =>\n      app.integration?.properties.some(\n        (property) => property.value === null || property.value === undefined\n      ) ?? false\n  );\n  if (someAppsWithoutProps.length > 0) {\n    Consola.warn(\n      `There are apps that have missing configuration options: [${someAppsWithoutProps\n        .map((app) => app.name)\n        .join(\n          ', '\n        )}] please input the correct secrets once again for the concerned app(s), save them, exit edit mode and reload the page.`\n    );\n  }\n\n  return {\n    ...config,\n    apps: config.apps.map((app) => ({\n      ...app,\n      integration: {\n        ...(app.integration ?? null),\n        type: app.integration?.type ?? null,\n        properties:\n          app.integration?.properties.map((property) => ({\n            ...property,\n            value: property.type === 'private' ? null : property.value,\n            isDefined: property.value !== null,\n          })) ?? [],\n      },\n    })),\n  };\n};\n\nconst migrateLocation = async (config: BackendConfigType) => {\n  Consola.log('Migrating config file to new location schema...', config.configProperties.name);\n\n  const migratedConfig = {\n    ...config,\n    widgets: await Promise.all(\n      config.widgets.map(async (widget) =>\n        widget.type !== 'weather' || typeof widget.properties.location !== 'string'\n          ? widget\n          : {\n              ...widget,\n              properties: {\n                ...widget.properties,\n                location: await fetchCity(widget.properties.location)\n                  .then(({ results }) => ({\n                    name: results[0].name,\n                    latitude: results[0].latitude,\n                    longitude: results[0].longitude,\n                  }))\n                  .catch(() => ({\n                    name: '',\n                    latitude: 0,\n                    longitude: 0,\n                  })),\n              },\n            }\n      )\n    ),\n  };\n\n  return migratedConfig;\n};\n\nconst migratePiholeIntegrationField = (config: BackendConfigType) => {\n  Consola.log('Migrating pihole integration field to apiKey...', config.configProperties.name);\n  return {\n    ...config,\n    apps: config.apps.map((app) => {\n      if (app?.integration?.type === 'pihole' && Array.isArray(app?.integration?.properties)) {\n        const migratedProperties = app.integration.properties.map((property) => {\n          if (property.field === 'password') {\n            return {\n              ...property,\n              field: 'apiKey' as IntegrationField,\n            };\n          }\n          return property;\n        });\n        return { ...app, integration: { ...app.integration, properties: migratedProperties } };\n      }\n      return app;\n    }),\n  };\n};\n\nconst migrateAppConfigs = (config: BackendConfigType) => {\n  return {\n    ...config,\n    apps: config.apps.map((app) => ({\n      ...app,\n      appearance: {\n        ...app.appearance,\n        appNameStatus: app.appearance.appNameStatus ?? 'normal',\n        positionAppName: app.appearance.positionAppName ?? 'column',\n        appNameFontSize: app.appearance.appNameFontSize ?? 16,\n        lineClampAppName: app.appearance.lineClampAppName ?? 1,\n      },\n    })),\n  };\n};\n"
  },
  {
    "path": "src/tools/config/readConfig.ts",
    "content": "import fs from 'fs';\n\nimport { generateConfigPath } from './generateConfigPath';\n\nexport function readConfig(name: string) {\n  const path = generateConfigPath(name);\n  return JSON.parse(fs.readFileSync(path, 'utf8'));\n}\n"
  },
  {
    "path": "src/tools/config/wrapper-finder.ts",
    "content": "import { ConfigType } from '~/types/config';\n\nexport const getLowestWrapper = (config: ConfigType) => config?.wrappers.sort((a, b) => a.position - b.position)[0];"
  },
  {
    "path": "src/tools/config/writeConfig.ts",
    "content": "import fs from 'fs';\nimport { BackendConfigType } from '~/types/config';\n\nimport { generateConfigPath } from './generateConfigPath';\n\nexport function writeConfig(config: BackendConfigType) {\n  const path = generateConfigPath(config.configProperties.name);\n  return fs.writeFileSync(path, JSON.stringify(config, null, 4), {\n    encoding: 'utf8',\n  });\n}\n"
  },
  {
    "path": "src/tools/humanFileSize.ts",
    "content": "/**\n * Format bytes as human-readable text.\n *\n * @param bytes Number of bytes.\n * @param use1024Threshhold True to use metric (SI) units, aka powers of 1000. False to use\n *           binary (IEC), aka powers of 1024.\n * @param decimalPlaces Number of decimal places to display.\n *\n * @return Formatted string.\n */\nexport function humanFileSize(initialBytes: number, use1024Threshhold = true, decimalPlaces = 1) {\n  const thresh = use1024Threshhold ? 1000 : 1024;\n  let bytes = initialBytes;\n\n  if (Math.abs(bytes) < thresh) {\n    return `${bytes} B`;\n  }\n\n  const units = use1024Threshhold\n    ? ['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']\n    : ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'];\n  let u = -1;\n  const r = 10 ** decimalPlaces;\n\n  do {\n    bytes /= thresh;\n    u += 1;\n  } while (Math.round(Math.abs(bytes) * r) / r >= thresh && u < units.length - 1);\n\n  return `${bytes.toFixed(decimalPlaces)} ${units[u]}`;\n}\n"
  },
  {
    "path": "src/tools/language.ts",
    "content": "export type Language = {\n  shortName: string;\n  originalName: string;\n  translatedName: string;\n\n  /**\n   * https://www.iso.org/obp/ui/#search\n   */\n  country: string;\n  locale: string;\n\n  /**\n   *\n   */\n  dayJsLocale?: string;\n};\n\nexport const languages = [\n    {\n    shortName: 'ar',\n    originalName: 'العربية',\n    translatedName: 'Arabic',\n    country: 'BH',\n    locale: 'ar-bh',\n    dayJsLocale: 'ar'\n  },\n  {\n    shortName: 'en',\n    originalName: 'English',\n    translatedName: 'English',\n    country: 'GB',\n    locale: 'en-gb',\n    dayJsLocale: 'en'\n  },\n  {\n    shortName: 'cr',\n    originalName: 'Crowdin',\n    translatedName: '(Live translation)',\n    locale: 'cr',\n    country: 'CROWDIN'\n  },\n  {\n    shortName: 'fr',\n    originalName: 'Français',\n    translatedName: 'French',\n    country: 'FR',\n    locale: 'fr',\n    dayJsLocale: 'fr'\n  },\n  {\n    shortName: 'cn',\n    originalName: '中文',\n    translatedName: 'Chinese (Simplified)',\n    country: 'CN',\n    locale: 'zh-cn',\n    dayJsLocale: 'zh'\n  },\n  {\n    shortName: 'cs',\n    originalName: 'Čeština',\n    translatedName: 'Czech',\n    country: 'CZ',\n    locale: 'cs',\n    dayJsLocale: 'cs'\n  },\n  {\n    shortName: 'da',\n    originalName: 'Dansk',\n    translatedName: 'Danish',\n    country: 'DK',\n    locale: 'da',\n    dayJsLocale: 'da'\n  },\n  {\n    shortName: 'de',\n    originalName: 'Deutsch',\n    translatedName: 'German',\n    country: 'DE',\n    locale: 'de',\n    dayJsLocale: 'de'\n  },\n  {\n    shortName: 'el',\n    originalName: 'Ελληνικά',\n    translatedName: 'Greek',\n    country: 'GR',\n    locale: 'el',\n    dayJsLocale: 'el'\n  },\n  {\n    shortName: 'es',\n    originalName: 'Español',\n    translatedName: 'Spanish',\n    country: 'ES',\n    locale: 'es',\n    dayJsLocale: 'es'\n  },\n  {\n    shortName: 'he',\n    originalName: 'עברית',\n    translatedName: 'Hebrew',\n    country: 'IL',\n    locale: 'he',\n    dayJsLocale: 'he'\n  },\n  {\n    shortName: 'hr',\n    originalName: 'Hrvatski',\n    translatedName: 'Croatian',\n    country: 'HR',\n    locale: 'hr',\n    dayJsLocale: 'hr'\n  },\n  {\n    shortName: 'hu',\n    originalName: 'Magyar',\n    translatedName: 'Hungarian',\n    country: 'HU',\n    locale: 'hu',\n    dayJsLocale: 'hu'\n  },\n  {\n    shortName: 'it',\n    originalName: 'Italiano',\n    translatedName: 'Italian',\n    country: 'IT',\n    locale: 'it',\n    dayJsLocale: 'it'\n  },\n  {\n    shortName: 'ja',\n    originalName: '日本語',\n    translatedName: 'Japanese',\n    country: 'JP',\n    locale: 'ja',\n    dayJsLocale: 'ja'\n  },\n  {\n    shortName: 'ko',\n    originalName: '한국어',\n    translatedName: 'Korean',\n    country: 'KR',\n    locale: 'ko',\n    dayJsLocale: 'ko'\n  },\n  {\n    shortName: 'lv',\n    originalName: 'Latvian',\n    translatedName: 'Latvian',\n    country: 'LV',\n    locale: 'lv',\n    dayJsLocale: 'lv'\n  },\n  {\n    shortName: 'nl',\n    originalName: 'Nederlands',\n    translatedName: 'Dutch',\n    country: 'NL',\n    locale: 'nl',\n    dayJsLocale: 'nl'\n  },\n  {\n    shortName: 'no',\n    originalName: 'Norsk',\n    translatedName: 'Norwegian',\n    country: 'NO',\n    locale: 'no',\n    dayJsLocale: 'nb'\n  },\n  {\n    shortName: 'pl',\n    originalName: 'Polski',\n    translatedName: 'Polish',\n    country: 'PL',\n    locale: 'pl',\n    dayJsLocale: 'pl'\n  },\n  {\n    shortName: 'pt',\n    originalName: 'Português',\n    translatedName: 'Portuguese',\n    country: 'PT',\n    locale: 'pt',\n  },\n  {\n    shortName: 'ru',\n    originalName: 'Русский',\n    translatedName: 'Russian',\n    country: 'RU',\n    locale: 'ru',\n    dayJsLocale: 'ru'\n  },\n  {\n    shortName: 'sk',\n    originalName: 'Slovenčina',\n    translatedName: 'Slovak',\n    country: 'SK',\n    locale: 'sk',\n    dayJsLocale: 'sk'\n  },\n  {\n    shortName: 'sl',\n    originalName: 'Slovenščina',\n    translatedName: 'Slovenian',\n    country: 'SI',\n    locale: 'sl',\n    dayJsLocale: 'sl'\n  },\n  {\n    shortName: 'sv',\n    originalName: 'Svenska',\n    translatedName: 'Swedish',\n    country: 'SE',\n    locale: 'sv',\n    dayJsLocale: 'sv'\n  },\n  {\n    shortName: 'tr',\n    originalName: 'Türkçe',\n    translatedName: 'Turkish',\n    country: 'TR',\n    locale: 'tr',\n    dayJsLocale: 'tr'\n  },\n  {\n    shortName: 'tw',\n    originalName: '中文',\n    translatedName: 'Chinese (Traditional)',\n    country: 'TW',\n    locale: 'zh-tw',\n    dayJsLocale: 'zh-cn'\n  },\n  {\n    shortName: 'uk',\n    originalName: 'Українська',\n    translatedName: 'Ukrainian',\n    country: 'UA',\n    locale: 'uk',\n    dayJsLocale: 'uk'\n  },\n  {\n    shortName: 'vi',\n    originalName: 'Tiếng Việt',\n    translatedName: 'Vietnamese',\n    country: 'VN',\n    locale: 'vi',\n    dayJsLocale: 'vi'\n  },\n  {\n    shortName: 'et',\n    originalName: 'Eesti',\n    translatedName: 'Estonian',\n    country: 'EE',\n    locale: 'et',\n    dayJsLocale: 'et'\n  },\n  // Lithuanian\n  {\n    shortName: 'lt',\n    originalName: 'Lietuvių',\n    translatedName: 'Lithuanian',\n    country: 'LT',\n    locale: 'lt',\n    dayJsLocale: 'lt'\n  },\n  {\n    shortName: 'ro',\n    originalName: 'Românesc',\n    translatedName: 'Romanian',\n    country: 'RO',\n    locale: 'ro',\n    dayJsLocale: 'ro'\n  }\n] as const satisfies Readonly<Language[]>;\n\nexport const getLanguageByCode = (code: string | null): Language =>\n  languages.find((language) => language.shortName === code) ??\n  languages.find((x) => x.locale === 'en-gb')!;\n"
  },
  {
    "path": "src/tools/mantineModalManagerExtensions.ts",
    "content": "import { openContextModal } from '@mantine/modals';\nimport { OpenContextModal } from '@mantine/modals/lib/context';\n\nexport const openContextModalGeneric = <T extends Record<string, unknown>>(\n  payload: OpenContextModal<T> & { modal: string }\n) => openContextModal(payload);\n"
  },
  {
    "path": "src/tools/server/configurations/tanstack/queryClient.tool.ts",
    "content": "import { QueryClient } from '@tanstack/react-query';\n\nexport const queryClient = new QueryClient({\n  defaultOptions: {\n    queries: {\n      staleTime: 1000 * 60 * 5,\n      refetchOnWindowFocus: false,\n    },\n  },\n});\n"
  },
  {
    "path": "src/tools/server/getPackageVersion.ts",
    "content": "import { env } from '~/env';\n\nimport packageJson from '../../../package.json';\n\nconst getServerPackageVersion = (): string | undefined => packageJson.version;\n\nconst getServerNodeEnvironment = () => env.NEXT_PUBLIC_NODE_ENV;\n\nconst getDependencies = (): PackageJsonDependencies => packageJson.dependencies;\n\nexport const getServiceSidePackageAttributes = (): ServerSidePackageAttributesType => {\n  const result = {\n    packageVersion: getServerPackageVersion(),\n    environment: getServerNodeEnvironment(),\n    dependencies: getDependencies(),\n  } as ServerSidePackageAttributesType;\n  return result;\n};\n\nexport type ServerSidePackageAttributesType = {\n  packageVersion: string | undefined;\n  environment: 'development' | 'production' | 'test';\n  dependencies: PackageJsonDependencies;\n};\n\ntype PackageJsonDependencies = { [key in string]: string };\n"
  },
  {
    "path": "src/tools/server/getServerSideTranslations.ts",
    "content": "import { getCookie } from 'cookies-next';\nimport { IncomingMessage, ServerResponse } from 'http';\nimport { serverSideTranslations } from 'next-i18next/serverSideTranslations';\n\nimport { COOKIE_LOCALE_KEY } from '../../../data/constants';\n\nexport const getServerSideTranslations = async (\n  namespaces: string[],\n  requestLocale?: string,\n  req?: IncomingMessage,\n  res?: ServerResponse\n) => {\n  namespaces = namespaces.concat([\n    'common',\n    'zod',\n    'layout/header',\n    'layout/modals/about',\n    'settings/common',\n  ]);\n\n  if (!req || !res) {\n    return serverSideTranslations(requestLocale ?? 'en', namespaces);\n  }\n\n  const configLocale = getCookie(COOKIE_LOCALE_KEY, { req, res });\n\n  return serverSideTranslations((configLocale ?? requestLocale ?? 'en') as string, namespaces);\n};\n"
  },
  {
    "path": "src/tools/server/images/abstract-icons-repository.ts",
    "content": "import Consola from 'consola';\n\nexport abstract class AbstractIconRepository {\n  protected constructor(readonly copyright?: string) {}\n\n  async fetch(): Promise<NormalizedIconRepositoryResult> {\n    try {\n      return await this.fetchInternally();\n    } catch (err) {\n      Consola.error(`Failed to fetch icons from repository '${this.name}': ${err}`);\n      return {\n        success: false,\n        count: 0,\n        entries: [],\n        name: '',\n        copyright: this.copyright,\n      };\n    }\n  }\n  protected abstract fetchInternally(): Promise<NormalizedIconRepositoryResult>;\n\n  protected abstract name: string;\n}\n\nexport type NormalizedIconRepositoryResult = {\n  name: string;\n  success: boolean;\n  count: number;\n  copyright: string | undefined;\n  entries: NormalizedIcon[];\n};\n\nexport type NormalizedIcon = {\n  url: string;\n  name: string;\n  size: number;\n};\n"
  },
  {
    "path": "src/tools/server/images/github-icons-repository.ts",
    "content": "import { AbstractIconRepository, NormalizedIcon, NormalizedIconRepositoryResult } from './abstract-icons-repository';\n\nexport class GitHubIconsRepository extends AbstractIconRepository {\n  static readonly walkxcode = {\n    api: 'https://api.github.com/repos/walkxcode/dashboard-icons/git/trees/main?recursive=true',\n    blob: 'https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/{0}/{1}',\n  } as GitHubRepositoryUrl;\n\n  constructor(\n    private readonly repository: GitHubRepositoryUrl,\n    private readonly displayName: string,\n    copyright: string\n  ) {\n    super(copyright);\n  }\n\n  protected async fetchInternally(): Promise<NormalizedIconRepositoryResult> {\n    const response = await fetch(this.repository.api, { \n      \n    });\n    const body = (await response.json()) as GitHubRepo;\n\n    const normalizedEntries = body.tree\n      .filter((file) => !['banner.png', 'logo.png'].some((x) => file.path.includes(x)))\n      .filter((file) => ['.png', '.svg'].some((x) => file.path.endsWith(x)))\n      .sort((a, b) => {\n        if (a.path.endsWith('.svg') && b.path.endsWith('.png')) {\n          return -1;\n        }\n        if (a.path.endsWith('.png') && b.path.endsWith('.svg')) {\n          return 1;\n        }\n        return 0;\n      })\n      .map((file): NormalizedIcon => {\n        const fileNameParts = file.path.split('/');\n        const fileName = fileNameParts[fileNameParts.length - 1];\n        const extensions = fileName.split('.')[1];\n        return {\n          url: this.repository.blob.replace('{0}', extensions).replace('{1}', fileName),\n          name: fileName,\n          size: file.size ?? 0,\n        };\n      });\n\n    return {\n      entries: normalizedEntries,\n      count: normalizedEntries.length,\n      success: true,\n      name: this.displayName,\n      copyright: this.copyright,\n    };\n  }\n\n  protected name: string = \"GitHub\";\n}\n\ntype GitHubRepositoryUrl = {\n  api: string;\n  blob: string;\n};\n\n\nexport interface GitHubRepo {\n  sha: string;\n  url: string;\n  tree: Tree[];\n  truncated: boolean;\n}\n\nexport interface Tree {\n  path: string;\n  mode: string;\n  type: Type;\n  sha: string;\n  url: string;\n  size?: number;\n}\n\nexport enum Type {\n  Blob = 'blob',\n  Tree = 'tree',\n}\n"
  },
  {
    "path": "src/tools/server/images/jsdelivr-icons-repository.ts",
    "content": "import { AbstractIconRepository, NormalizedIcon, NormalizedIconRepositoryResult } from './abstract-icons-repository';\n\nexport class JsdelivrIconsRepository extends AbstractIconRepository {\n  static readonly papirusRepository = {\n    api: 'https://data.jsdelivr.com/v1/packages/gh/PapirusDevelopmentTeam/papirus_icons@master?structure=flat',\n    blob: 'https://cdn.jsdelivr.net/gh/PapirusDevelopmentTeam/papirus_icons/src/{1}',\n  } as JsdelivrRepositoryUrl;\n\n  static readonly homelabSvgAssetsRepository = {\n    api: 'https://data.jsdelivr.com/v1/packages/gh/loganmarchione/homelab-svg-assets@main?structure=flat',\n    blob: 'https://cdn.jsdelivr.net/gh/loganmarchione/homelab-svg-assets/assets/{1}',\n  } as JsdelivrRepositoryUrl;\n\n  constructor(\n    private readonly repository: JsdelivrRepositoryUrl,\n    private readonly displayName: string,\n    copyright: string\n  ) {\n    super(copyright);\n  }\n\n  protected async fetchInternally(): Promise<NormalizedIconRepositoryResult> {\n    const response = await fetch(this.repository.api);\n    const body = (await response.json()) as JsdelivrResponse;\n\n    const normalizedEntries = body.files\n      .filter((file) => !['_banner.png', '_logo.png'].some((x) => file.name.includes(x)))\n      .filter((file) => ['.png', '.svg'].some((x) => file.name.endsWith(x)))\n\n      .map((file): NormalizedIcon => {\n        const fileNameParts = file.name.split('/');\n        const fileName = fileNameParts[fileNameParts.length - 1];\n        const extensions = fileName.split('.')[1];\n        return {\n          url: this.repository.blob.replace('{0}', extensions).replace('{1}', fileName),\n          name: fileName,\n          size: file.size,\n        };\n      });\n\n    return {\n      entries: normalizedEntries,\n      count: normalizedEntries.length,\n      success: true,\n      name: this.displayName,\n      copyright: this.copyright,\n    };\n  }\n\n  protected name: string = \"JsDelivr\";\n}\n\ntype JsdelivrRepositoryUrl = {\n  api: string;\n  blob: string;\n};\n\ntype JsdelivrResponse = {\n  files: JsdelivrFile[];\n};\n\ntype JsdelivrFile = {\n  name: string;\n  size: number;\n};\n"
  },
  {
    "path": "src/tools/server/images/local-icons-repository.ts",
    "content": "import fs from 'fs';\n\nimport {\n  AbstractIconRepository,\n  NormalizedIcon,\n  NormalizedIconRepositoryResult,\n} from './abstract-icons-repository';\nimport Consola from 'consola';\n\nconst iconsDirectory = './public/icons';\n\nexport class LocalIconsRepository extends AbstractIconRepository {\n  constructor() {\n    super('');\n  }\n\n  protected async fetchInternally(): Promise<NormalizedIconRepositoryResult> {\n    if (!fs.existsSync(iconsDirectory)) {\n      Consola.info('Local icons repository directory does not exist');\n      return {\n        count: 0,\n        entries: [],\n        name: 'Local',\n        success: true,\n        copyright: this.copyright,\n      };\n    }\n\n    const files = fs.readdirSync(iconsDirectory);\n    Consola.info(`Local icons repository directory exists and contains ${files.length} icons`);\n\n    const normalizedEntries = files\n      .filter((file) => ['.png', '.svg', '.jpeg', '.jpg'].some((x) => file.endsWith(x)))\n      .map(\n        (file): NormalizedIcon => {\n          const stats = fs.statSync(`${iconsDirectory}/${file}`);\n          return {\n            name: file,\n            url: `/icons/${file}`,\n            size: stats.size,\n          };\n        }\n      );\n\n    return {\n      entries: normalizedEntries,\n      count: normalizedEntries.length,\n      success: true,\n      name: this.name,\n      copyright: this.copyright,\n    };\n  }\n\n  protected name: string = \"Local\";\n}\n"
  },
  {
    "path": "src/tools/server/images/unpkg-icons-repository.ts",
    "content": "import { AbstractIconRepository, NormalizedIcon, NormalizedIconRepositoryResult } from './abstract-icons-repository';\n\nexport class UnpkgIconsRepository extends AbstractIconRepository {\n  static tablerRepository = 'https://unpkg.com/@tabler/icons-png@2.0.0-beta/icons/';\n\n  constructor(\n    private readonly repository: string,\n    private readonly displayName: string,\n    copyright: string\n  ) {\n    super(copyright);\n  }\n\n  protected async fetchInternally(): Promise<NormalizedIconRepositoryResult> {\n    const response = await fetch(`${this.repository}?meta`);\n    const body = (await response.json()) as UnpkgResponse;\n\n    const normalizedEntries = body.files\n      .filter((file) => file.type === 'file')\n      .map((file): NormalizedIcon => {\n        const fileName = file.path.replace('/icons/', '');\n        const url = `${this.repository}${fileName}`;\n        return {\n          name: fileName,\n          url,\n          size: file.size,\n        };\n      });\n\n    return {\n      entries: normalizedEntries,\n      count: normalizedEntries.length,\n      success: true,\n      name: this.displayName,\n      copyright: this.copyright,\n    };\n  }\n\n  protected name: string = \"UnPkg\";\n}\n\ntype UnpkgResponse = {\n  files: UnpkgFile[];\n};\n\ntype UnpkgFile = {\n  path: string;\n  type: string;\n  size: number;\n};\n"
  },
  {
    "path": "src/tools/server/loginBuilder.ts",
    "content": "import { GetServerSidePropsContext, GetServerSidePropsResult, PreviewData } from 'next';\n\nimport { Session } from 'next-auth';\n\nimport { ParsedUrlQuery } from 'querystring';\n\nexport const checkForSessionOrAskForLogin = (\n  context: GetServerSidePropsContext<ParsedUrlQuery, PreviewData>,\n  session: Session | null,\n  accessCallback: () => boolean\n): GetServerSidePropsResult<never> | undefined => {\n  const permitted = accessCallback();\n\n  // user is logged in but does not have the required access\n  if (session?.user && !permitted) {\n    return {\n      redirect: {\n        destination: '/401',\n        permanent: false\n      }\n    };\n  }\n\n  // user *may* be logged in and permitted\n  if (permitted) {\n    return undefined;\n  }\n\n  // user is logged out and needs to sign in\n  return {\n    redirect: {\n      destination: `/auth/login?redirectAfterLogin=${context.resolvedUrl}`,\n      permanent: false,\n    },\n  };\n};\n"
  },
  {
    "path": "src/tools/server/sdk/adGuard/adGuard.schema.ts",
    "content": "import { z } from 'zod';\n\nexport const adGuardApiStatsResponseSchema = z.object({\n  time_units: z.enum(['hours', 'days']),\n  top_queried_domains: z.array(z.record(z.string(), z.number())),\n  top_clients: z.array(z.record(z.string(), z.number())),\n  top_blocked_domains: z.array(z.record(z.string(), z.number())),\n  dns_queries: z.array(z.number()),\n  blocked_filtering: z.array(z.number()),\n  replaced_safebrowsing: z.array(z.number()),\n  replaced_parental: z.array(z.number()),\n  num_dns_queries: z.number().min(0),\n  num_blocked_filtering: z.number().min(0),\n  num_replaced_safebrowsing: z.number().min(0),\n  num_replaced_safesearch: z.number().min(0),\n  num_replaced_parental: z.number().min(0),\n  avg_processing_time: z.number().min(0),\n});\n\nexport const adGuardApiStatusResponseSchema = z.object({\n  version: z.string(),\n  language: z.string(),\n  dns_addresses: z.array(z.string()),\n  dns_port: z.number().positive(),\n  http_port: z.number().positive(),\n  protection_disabled_duration: z.number(),\n  protection_enabled: z.boolean(),\n  dhcp_available: z.boolean(),\n  running: z.boolean(),\n});\n\nexport const adGuardApiFilteringStatusSchema = z.object({\n  filters: z.array(\n    z.object({\n      url: z.string(),\n      name: z.string(),\n      last_updated: z.string().optional(),\n      id: z.number().nonnegative(),\n      rules_count: z.number().nonnegative(),\n      enabled: z.boolean(),\n    })\n  ),\n});\n"
  },
  {
    "path": "src/tools/server/sdk/adGuard/adGuard.ts",
    "content": "import axios from 'axios';\nimport Consola from 'consola';\nimport { z } from 'zod';\nimport { trimStringEnding } from '~/tools/shared/strings';\n\nimport {\n  adGuardApiFilteringStatusSchema,\n  adGuardApiStatsResponseSchema,\n  adGuardApiStatusResponseSchema,\n} from './adGuard.schema';\n\nexport class AdGuard {\n  private readonly baseHostName: string;\n\n  constructor(\n    hostname: string,\n    private readonly username: string,\n    private readonly password: string\n  ) {\n    this.baseHostName = trimStringEnding(hostname, ['/#', '/']);\n  }\n\n  async getStats(): Promise<AdGuardStatsType> {\n    const response = await fetch(`${this.baseHostName}/control/stats`, {\n      headers: {\n        Authorization: `Basic ${this.getAuthorizationHeaderValue()}`,\n      },\n    });\n\n    const data = await response.json();\n\n    return adGuardApiStatsResponseSchema.parseAsync(data);\n  }\n\n  async getStatus() {\n    const response = await fetch(`${this.baseHostName}/control/status`, {\n      headers: {\n        Authorization: `Basic ${this.getAuthorizationHeaderValue()}`,\n      },\n    });\n\n    const data = await response.json();\n\n    return adGuardApiStatusResponseSchema.parseAsync(data);\n  }\n\n  async getCountFilteringDomains() {\n    const response = await fetch(`${this.baseHostName}/control/filtering/status`, {\n      headers: {\n        Authorization: `Basic ${this.getAuthorizationHeaderValue()}`,\n      },\n    });\n\n    const data = await response.json();\n    const schemaData = await adGuardApiFilteringStatusSchema.parseAsync(data);\n\n    return schemaData.filters\n      .filter((filter) => filter.enabled)\n      .reduce((sum, filter) => filter.rules_count + sum, 0);\n  }\n\n  async disable(duration: number) {\n    await this.changeProtectionStatus(false, duration);\n  }\n  async enable() {\n    await this.changeProtectionStatus(true);\n  }\n\n  /**\n   * Make a post request to the AdGuard API to change the protection status based on the value of newStatus\n   * @param {boolean} newStatus - The new status of the protection\n   * @param {number} duration - Duration of a pause, in seconds. Enabled should be false.\n   * @returns {string} - The response from the AdGuard API\n   */\n  private async changeProtectionStatus(newStatus: boolean, duration = 0) {\n    try {\n      const { data }: { data: string } = await axios.post(\n        `${this.baseHostName}/control/protection`,\n        {\n          enabled: newStatus,\n          duration: duration * 1000,\n        },\n        {\n          headers: {\n            Authorization: `Basic ${this.getAuthorizationHeaderValue()}`,\n          },\n        }\n      );\n      return data;\n    } catch (error) {\n      if (axios.isAxiosError(error)) {\n        Consola.error(error.message);\n      }\n    }\n  }\n\n  /**\n   * It return a base64 username:password string\n   * @returns {string} The base64 encoded username and password\n   */\n  private getAuthorizationHeaderValue() {\n    return Buffer.from(`${this.username}:${this.password}`).toString('base64');\n  }\n}\n\nexport type AdGuardStatsType = z.infer<typeof adGuardApiStatsResponseSchema>;\n"
  },
  {
    "path": "src/tools/server/sdk/homeassistant/HomeAssistant.ts",
    "content": "import Consola from 'consola';\nimport { appendPath } from '~/tools/shared/strings';\nimport { entityStateSchema } from './models/EntityState';\n\nexport class HomeAssistant {\n  public readonly basePath: URL;\n  private readonly token: string;\n\n  constructor(url: URL, token: string) {\n    if (!url.pathname.endsWith('/')) {\n      url.pathname += '/';\n    }\n    url.pathname += 'api';\n    this.basePath = url;\n    this.token = token;\n  }\n\n  async getEntityState(entityId: string) {\n    try {\n      const response = await fetch(appendPath(this.basePath, `/states/${entityId}`), {\n        headers: {\n          'Authorization': `Bearer ${this.token}`,\n        },\n      });\n      const body = await response.json();\n      if (!response.ok) {\n        return {\n          success: false as const,\n          error: body,\n        };\n      }\n      return entityStateSchema.safeParseAsync(body);\n    } catch (err) {\n      Consola.error(`Failed to fetch from '${this.basePath}': ${err}`);\n      return {\n        success: false as const,\n        error: err,\n      };\n    }\n  }\n\n  async triggerAutomation(entityId: string) {\n    try {\n      const response = await fetch(appendPath(this.basePath, `/services/automation/trigger`), {\n        headers: {\n          'Authorization': `Bearer ${this.token}`,\n        },\n        body: JSON.stringify({\n          'entity_id': entityId,\n        }),\n        method: 'POST'\n      });\n      return response.ok;\n    } catch (err) {\n      Consola.error(`Failed to fetch from '${this.basePath}': ${err}`);\n      return false;\n    }\n  }\n\n  /**\n   * Triggers a toggle action for a specific entity.\n   * \n   * @param entityId - The ID of the entity to toggle.\n   * @returns A boolean indicating whether the toggle action was successful.\n   */\n  async triggerToggle(entityId: string) {\n    try {\n      const response = await fetch(appendPath(this.basePath, `/services/homeassistant/toggle`), {\n        headers: {\n          'Authorization': `Bearer ${this.token}`,\n        },\n        body: JSON.stringify({\n          'entity_id': entityId,\n        }),\n        method: 'POST'\n      });\n      return response.ok;\n    } catch (err) {\n      Consola.error(`Failed to fetch from '${this.basePath}': ${err}`);\n      return false;\n    }\n  }\n}\n"
  },
  {
    "path": "src/tools/server/sdk/homeassistant/models/EntityState.ts",
    "content": "import { z } from 'zod';\n\n\nexport const entityStateSchema = z.object({\n  attributes: z.record(z.union([z.string(), z.number(), z.boolean(), z.null(), z.array(z.union([z.string(),z.number()]))])),\n  entity_id: z.string(),\n  last_changed: z.string().pipe(z.coerce.date()),\n  last_updated: z.string().pipe(z.coerce.date()),\n  state: z.string(),\n});\n\nexport type EntityState = z.infer<typeof entityStateSchema>;\n"
  },
  {
    "path": "src/tools/server/sdk/pihole/piHole.spec.ts",
    "content": "import Consola from 'consola';\nimport { describe, expect, it, vi } from 'vitest';\n\nimport { PiHoleClient } from './piHole';\n\ndescribe('PiHole API client', () => {\n  it('summary - throw exception when response status code is not 200', async () => {\n    // arrange\n    const errorLogSpy = vi.spyOn(Consola, 'error');\n    const warningLogSpy = vi.spyOn(Consola, 'warn');\n\n    fetchMock.mockResponse((request) => {\n      if (request.url === 'http://pi.hole/admin/api.php?summaryRaw&auth=nice') {\n        return {\n          status: 404,\n        };\n      }\n\n      return Promise.reject(new Error(`Bad url: ${request.url}`));\n    });\n\n    const client = new PiHoleClient('http://pi.hole', 'nice');\n\n    // Act && Assert\n    await expect(() => client.getSummary()).rejects.toThrowErrorMatchingInlineSnapshot(\n      '\"Status code does not indicate success: 404\"'\n    );\n\n    expect(errorLogSpy).not.toHaveBeenCalled();\n    expect(warningLogSpy).not.toHaveBeenCalledOnce();\n\n    errorLogSpy.mockRestore();\n  });\n\n  it('summary -throw exception when response is empty', async () => {\n    // arrange\n    const errorLogSpy = vi.spyOn(Consola, 'error');\n    const warningLogSpy = vi.spyOn(Consola, 'warn');\n\n    fetchMock.mockResponse((request) => {\n      if (request.url === 'http://pi.hole/admin/api.php?summaryRaw&auth=nice') {\n        return JSON.stringify([]);\n      }\n\n      return Promise.reject(new Error(`Bad url: ${request.url}`));\n    });\n\n    const client = new PiHoleClient('http://pi.hole', 'nice');\n\n    // Act && Assert\n    await expect(() => client.getSummary()).rejects.toThrowErrorMatchingInlineSnapshot(\n      '\"Response does not indicate success. Authentication is most likely invalid: \"'\n    );\n\n    expect(errorLogSpy).not.toHaveBeenCalled();\n    expect(warningLogSpy).not.toHaveBeenCalledOnce();\n\n    errorLogSpy.mockRestore();\n  });\n\n  it('summary -fetch and return object when success', async () => {\n    // arrange\n    const errorLogSpy = vi.spyOn(Consola, 'error');\n    const warningLogSpy = vi.spyOn(Consola, 'warn');\n\n    fetchMock.mockResponse((request) => {\n      if (request.url === 'http://pi.hole/admin/api.php?summaryRaw&auth=nice') {\n        return JSON.stringify({\n          domains_being_blocked: 780348,\n          dns_queries_today: 36910,\n          ads_blocked_today: 9700,\n          ads_percentage_today: 26.280142,\n          unique_domains: 6217,\n          queries_forwarded: 12943,\n          queries_cached: 13573,\n          clients_ever_seen: 20,\n          unique_clients: 17,\n          dns_queries_all_types: 36910,\n          reply_UNKNOWN: 947,\n          reply_NODATA: 3313,\n          reply_NXDOMAIN: 1244,\n          reply_CNAME: 5265,\n          reply_IP: 25635,\n          reply_DOMAIN: 97,\n          reply_RRNAME: 4,\n          reply_SERVFAIL: 28,\n          reply_REFUSED: 0,\n          reply_NOTIMP: 0,\n          reply_OTHER: 0,\n          reply_DNSSEC: 0,\n          reply_NONE: 0,\n          reply_BLOB: 377,\n          dns_queries_all_replies: 36910,\n          privacy_level: 0,\n          status: 'enabled',\n          gravity_last_updated: {\n            file_exists: true,\n            absolute: 1682216493,\n            relative: {\n              days: 5,\n              hours: 17,\n              minutes: 52,\n            },\n          },\n        });\n      }\n\n      return Promise.reject(new Error(`Bad url: ${request.url}`));\n    });\n\n    const client = new PiHoleClient('http://pi.hole', 'nice');\n\n    // Act\n    const summary = await client.getSummary();\n\n    // Assert\n    expect(summary).toStrictEqual({\n      domains_being_blocked: 780348,\n      dns_queries_today: 36910,\n      ads_blocked_today: 9700,\n      ads_percentage_today: 26.280142,\n      unique_domains: 6217,\n      queries_forwarded: 12943,\n      queries_cached: 13573,\n      clients_ever_seen: 20,\n      unique_clients: 17,\n      dns_queries_all_types: 36910,\n      reply_UNKNOWN: 947,\n      reply_NODATA: 3313,\n      reply_NXDOMAIN: 1244,\n      reply_CNAME: 5265,\n      reply_IP: 25635,\n      reply_DOMAIN: 97,\n      reply_RRNAME: 4,\n      reply_SERVFAIL: 28,\n      reply_REFUSED: 0,\n      reply_NOTIMP: 0,\n      reply_OTHER: 0,\n      reply_DNSSEC: 0,\n      reply_NONE: 0,\n      reply_BLOB: 377,\n      dns_queries_all_replies: 36910,\n      privacy_level: 0,\n      status: 'enabled',\n      gravity_last_updated: {\n        file_exists: true,\n        absolute: 1682216493,\n        relative: { days: 5, hours: 17, minutes: 52 },\n      },\n    });\n\n    expect(errorLogSpy).not.toHaveBeenCalled();\n    expect(warningLogSpy).not.toHaveBeenCalled();\n\n    errorLogSpy.mockRestore();\n  });\n\n  it('enable - return true when state change is as expected', async () => {\n    // arrange\n    const errorLogSpy = vi.spyOn(Consola, 'error');\n    const warningLogSpy = vi.spyOn(Consola, 'warn');\n\n    let calledCount = 0;\n    let countTriedRequests = 0;\n\n    fetchMock.mockResponse((request) => {\n      if (request.url === 'http://pi.hole/admin/api.php?enable&auth=nice') {\n        calledCount += 1;\n        return JSON.stringify({\n          status: 'enabled',\n        });\n      }\n\n      if (request.url === 'http://pi.hole/admin/api.php?summaryRaw&auth=nice') {\n        countTriedRequests += 1;\n        return JSON.stringify({\n          status: 'enabled',\n        });\n      }\n\n      return Promise.reject(new Error(`Bad url: ${request.url}`));\n    });\n\n    const client = new PiHoleClient('http://pi.hole', 'nice');\n\n    // Act\n    const summary = await client.enable();\n\n    // Assert\n    expect(summary).toBe(true);\n    expect(calledCount).toBe(1);\n    expect(countTriedRequests).toBe(1);\n\n    expect(errorLogSpy).not.toHaveBeenCalled();\n    expect(warningLogSpy).not.toHaveBeenCalled();\n\n    errorLogSpy.mockRestore();\n  });\n\n  it('enable - return true when state change is as expected after 10 retries', async () => {\n    // arrange\n    const errorLogSpy = vi.spyOn(Consola, 'error');\n    const warningLogSpy = vi.spyOn(Consola, 'warn');\n\n    let calledCount = 0;\n    let countTriedRequests = 0;\n\n    fetchMock.mockResponse((request) => {\n      if (request.url === 'http://pi.hole/admin/api.php?enable&auth=nice') {\n        calledCount += 1;\n        return JSON.stringify({\n          status: 'disabled',\n        });\n      }\n\n      if (request.url === 'http://pi.hole/admin/api.php?summaryRaw&auth=nice') {\n        countTriedRequests += 1;\n        if (countTriedRequests < 10) {\n          return JSON.stringify({\n            status: 'disabled',\n          });\n        }\n\n        return JSON.stringify({\n          status: 'enabled',\n        });\n      }\n\n      return Promise.reject(new Error(`Bad url: ${request.url}`));\n    });\n\n    const client = new PiHoleClient('http://pi.hole', 'nice');\n\n    // Act\n    const summary = await client.enable();\n\n    // Assert\n    expect(summary).toBe(true);\n    expect(calledCount).toBe(1);\n    expect(countTriedRequests).toBe(10);\n\n    expect(errorLogSpy).not.toHaveBeenCalled();\n    expect(warningLogSpy).not.toHaveBeenCalled();\n\n    errorLogSpy.mockRestore();\n  });\n\n  it('disable - return true when state change is as expected', async () => {\n    // arrange\n    const errorLogSpy = vi.spyOn(Consola, 'error');\n    const warningLogSpy = vi.spyOn(Consola, 'warn');\n\n    let calledCount = 0;\n    let countTriedRequests = 0;\n\n    fetchMock.mockResponse((request) => {\n      if (request.url === 'http://pi.hole/admin/api.php?disable&auth=nice') {\n        calledCount += 1;\n        return JSON.stringify({\n          status: 'disabled',\n        });\n      }\n\n      if (request.url === 'http://pi.hole/admin/api.php?summaryRaw&auth=nice') {\n        countTriedRequests += 1;\n        return JSON.stringify({\n          status: 'disabled',\n        });\n      }\n\n      return Promise.reject(new Error(`Bad url: ${request.url}`));\n    });\n\n    const client = new PiHoleClient('http://pi.hole', 'nice');\n\n    // Act\n    const summary = await client.disable();\n\n    // Assert\n    expect(summary).toBe(true);\n    expect(calledCount).toBe(1);\n    expect(countTriedRequests).toBe(1);\n\n    expect(errorLogSpy).not.toHaveBeenCalled();\n    expect(warningLogSpy).not.toHaveBeenCalled();\n\n    errorLogSpy.mockRestore();\n  });\n\n  it('disable - return true when state change is as expected after 10 retries', async () => {\n    // arrange\n    const errorLogSpy = vi.spyOn(Consola, 'error');\n    const warningLogSpy = vi.spyOn(Consola, 'warn');\n\n    let calledCount = 0;\n    let countTriedRequests = 0;\n\n    fetchMock.mockResponse((request) => {\n      if (request.url === 'http://pi.hole/admin/api.php?disable&auth=nice') {\n        calledCount += 1;\n        return JSON.stringify({\n          status: 'enabled',\n        });\n      }\n\n      if (request.url === 'http://pi.hole/admin/api.php?summaryRaw&auth=nice') {\n        countTriedRequests += 1;\n        if (countTriedRequests < 10) {\n          return JSON.stringify({\n            status: 'enabled',\n          });\n        }\n\n        return JSON.stringify({\n          status: 'disabled',\n        });\n      }\n\n      return Promise.reject(new Error(`Bad url: ${request.url}`));\n    });\n\n    const client = new PiHoleClient('http://pi.hole', 'nice');\n\n    // Act\n    const summary = await client.disable();\n\n    // Assert\n    expect(summary).toBe(true);\n    expect(calledCount).toBe(1);\n    expect(countTriedRequests).toBe(10);\n\n    expect(errorLogSpy).not.toHaveBeenCalled();\n    expect(warningLogSpy).not.toHaveBeenCalled();\n\n    errorLogSpy.mockRestore();\n  });\n\n  it('enable - throw error when state change is not as expected', async () => {\n    // arrange\n    const errorLogSpy = vi.spyOn(Consola, 'error');\n    const warningLogSpy = vi.spyOn(Consola, 'warn');\n\n    let calledCount = 0;\n    let countTriedRequests = 0;\n\n    fetchMock.mockResponse((request) => {\n      if (request.url === 'http://pi.hole/admin/api.php?enable&auth=nice') {\n        calledCount += 1;\n        return JSON.stringify({\n          status: 'disabled',\n        });\n      }\n\n      if (request.url === 'http://pi.hole/admin/api.php?summaryRaw&auth=nice') {\n        countTriedRequests += 1;\n        return JSON.stringify({\n          status: 'disabled',\n        });\n      }\n\n      return Promise.reject(new Error(`Bad url: ${request.url}`));\n    });\n\n    const client = new PiHoleClient('http://pi.hole', 'nice');\n\n    // Act & Assert\n    await expect(() => client.enable()).rejects.toThrowErrorMatchingInlineSnapshot(\n      '\"Although PiHole received the command, it failed to update it\\'s status: [object Object]\"'\n    );\n\n    // Assert\n    expect(calledCount).toBe(1);\n    expect(countTriedRequests).toBe(10);\n\n    expect(errorLogSpy).not.toHaveBeenCalled();\n    expect(warningLogSpy).not.toHaveBeenCalled();\n\n    errorLogSpy.mockRestore();\n  });\n\n  it('disable - throw error when state change is not as expected', async () => {\n    // arrange\n    const errorLogSpy = vi.spyOn(Consola, 'error');\n    const warningLogSpy = vi.spyOn(Consola, 'warn');\n\n    let calledCount = 0;\n    let countTriedRequests = 0;\n\n    fetchMock.mockResponse((request) => {\n      if (request.url === 'http://pi.hole/admin/api.php?disable&auth=nice') {\n        calledCount += 1;\n        return JSON.stringify({\n          status: 'enabled',\n        });\n      }\n\n      if (request.url === 'http://pi.hole/admin/api.php?summaryRaw&auth=nice') {\n        countTriedRequests += 1;\n        return JSON.stringify({\n          status: 'enabled',\n        });\n      }\n\n      return Promise.reject(new Error(`Bad url: ${request.url}`));\n    });\n\n    const client = new PiHoleClient('http://pi.hole', 'nice');\n\n    // Act & Assert\n    await expect(() => client.disable()).rejects.toThrowErrorMatchingInlineSnapshot(\n      '\"Although PiHole received the command, it failed to update it\\'s status: [object Object]\"'\n    );\n\n    // Assert\n    expect(calledCount).toBe(1);\n    expect(countTriedRequests).lessThanOrEqual(10);\n\n    expect(errorLogSpy).not.toHaveBeenCalled();\n    expect(warningLogSpy).not.toHaveBeenCalled();\n\n    errorLogSpy.mockRestore();\n  });\n\n  it('disable - throw error when status code does not indicate success', async () => {\n    // arrange\n    const errorLogSpy = vi.spyOn(Consola, 'error');\n    const warningLogSpy = vi.spyOn(Consola, 'warn');\n\n    let calledCount = 0;\n\n    fetchMock.mockResponse((request) => {\n      if (request.url === 'http://pi.hole/admin/api.php?disable&auth=nice') {\n        calledCount += 1;\n        return {\n          status: 404,\n        };\n      }\n\n      return Promise.reject(new Error(`Bad url: ${request.url}`));\n    });\n\n    const client = new PiHoleClient('http://pi.hole', 'nice');\n\n    // Act & Assert\n    await expect(() => client.disable()).rejects.toThrowErrorMatchingInlineSnapshot(\n      '\"Status code does not indicate success: 404\"'\n    );\n    expect(calledCount).toBe(1);\n\n    expect(errorLogSpy).not.toHaveBeenCalled();\n    expect(warningLogSpy).not.toHaveBeenCalled();\n\n    errorLogSpy.mockRestore();\n  });\n\n  it('disable - throw error when response is empty', async () => {\n    // arrange\n    const errorLogSpy = vi.spyOn(Consola, 'error');\n    const warningLogSpy = vi.spyOn(Consola, 'warn');\n\n    let calledCount = 0;\n\n    fetchMock.mockResponse((request) => {\n      if (request.url === 'http://pi.hole/admin/api.php?disable&auth=nice') {\n        calledCount += 1;\n        return JSON.stringify([]);\n      }\n\n      return Promise.reject(new Error(`Bad url: ${request.url}`));\n    });\n\n    const client = new PiHoleClient('http://pi.hole', 'nice');\n\n    // Act & Assert\n    await expect(() => client.disable()).rejects.toThrowErrorMatchingInlineSnapshot(\n      '\"Response does not indicate success. Authentication is most likely invalid: \"'\n    );\n    expect(calledCount).toBe(1);\n\n    expect(errorLogSpy).not.toHaveBeenCalled();\n    expect(warningLogSpy).not.toHaveBeenCalled();\n\n    errorLogSpy.mockRestore();\n  });\n});\n"
  },
  {
    "path": "src/tools/server/sdk/pihole/piHole.ts",
    "content": "import { trimStringEnding } from '~/tools/shared/strings';\n\nimport { PiHoleApiStatusChangeResponse, PiHoleApiSummaryResponse } from './piHole.type';\n\nexport class PiHoleClient {\n  private readonly baseHostName: string;\n\n  constructor(\n    hostname: string,\n    private readonly apiToken: string\n  ) {\n    this.baseHostName = trimStringEnding(hostname, ['/admin/index.php', '/admin', '/']);\n  }\n\n  async getSummary() {\n    const response = await fetch(\n      new URL(`${this.baseHostName}/admin/api.php?summaryRaw&auth=${this.apiToken}`)\n    );\n\n    if (response.status !== 200) {\n      throw new Error(`Status code does not indicate success: ${response.status}`);\n    }\n\n    const json = await response.json();\n\n    if (Array.isArray(json)) {\n      throw new Error(\n        `Response does not indicate success. Authentication is most likely invalid: ${json}`\n      );\n    }\n\n    return json as PiHoleApiSummaryResponse;\n  }\n\n  async enable() {\n    const response = await this.sendStatusChangeRequest('enable');\n    return response.status === 'enabled';\n  }\n\n  async disable(duration: number) {\n    const response = await this.sendStatusChangeRequest('disable', duration);\n    return response.status === 'disabled';\n  }\n\n  private async sendStatusChangeRequest(\n    action: 'enable' | 'disable',\n    duration = 0\n  ): Promise<PiHoleApiStatusChangeResponse> {\n    const response = await fetch(\n      duration !== 0\n        ? `${this.baseHostName}/admin/api.php?${action}=${duration}&auth=${this.apiToken}`\n        : `${this.baseHostName}/admin/api.php?${action}&auth=${this.apiToken}`\n    );\n\n    if (response.status !== 200) {\n      return Promise.reject(new Error(`Status code does not indicate success: ${response.status}`));\n    }\n\n    const json = await response.json();\n\n    if (Array.isArray(json)) {\n      return Promise.reject(\n        new Error(\n          `Response does not indicate success. Authentication is most likely invalid: ${json}`\n        )\n      );\n    }\n\n    for (let loops = 0; loops < 10; loops++) {\n      const summary = await this.getSummary();\n      if (summary.status === action + 'd') {\n        return { status: summary.status } as PiHoleApiStatusChangeResponse;\n      }\n      await new Promise((resolve) => {\n        setTimeout(resolve, 50);\n      });\n    }\n\n    return Promise.reject(\n      new Error(`Although PiHole received the command, it failed to update it's status: ${json}`)\n    );\n  }\n}\n"
  },
  {
    "path": "src/tools/server/sdk/pihole/piHole.type.ts",
    "content": "export type PiHoleApiSummaryResponse = {\n  domains_being_blocked: number;\n  dns_queries_today: number;\n  ads_blocked_today: number;\n  ads_percentage_today: number;\n  unique_domains: number;\n  queries_forwarded: number;\n  queries_cached: number;\n  clients_ever_seen: number;\n  unique_clients: number;\n  dns_queries_all_types: number;\n  reply_UNKNOWN: number;\n  reply_NODATA: number;\n  reply_NXDOMAIN: number;\n  reply_CNAME: number;\n  reply_IP: number;\n  reply_DOMAIN: number;\n  reply_RRNAME: number;\n  reply_SERVFAIL: number;\n  reply_REFUSED: number;\n  reply_NOTIMP: number;\n  reply_OTHER: number;\n  reply_DNSSEC: number;\n  reply_NONE: number;\n  reply_BLOB: number;\n  dns_queries_all_replies: number;\n  privacy_level: number;\n  status: 'enabled' | 'disabled';\n  gravity_last_updated: {\n    file_exists: boolean;\n    absolute: number;\n    relative: { days: number; hours: number; minutes: number };\n  };\n};\n\nexport type PiHoleApiStatusChangeResponse = {\n  status: 'enabled' | 'disabled';\n};\n"
  },
  {
    "path": "src/tools/server/sdk/plex/plexClient.test.ts",
    "content": "import { afterEach, describe, expect, it } from 'vitest';\nimport 'vitest-fetch-mock';\n\nimport { PlexClient } from './plexClient';\n\ndescribe('Plex SDK', () => {\n  it('return sessions when player, user and session present', async () => {\n    // arrange\n    const client = new PlexClient('https://plex.local', 'MY_TOKEN');\n\n    fetchMock.mockOnceIf(\n      'https://plex.local/status/sessions?X-Plex-Token=MY_TOKEN',\n      `<MediaContainer size=\"1\">\n    <Video addedAt=\"0000000\" art=\"/library/metadata/2/art/00000000\" audienceRating=\"0.0\" audienceRatingImage=\"niceImage\" chapterSource=\"media\" contentRating=\"TV-PG\" duration=\"6262249\" guid=\"plex://movie/0000000000000000\" key=\"/library/metadata/2\" lastViewedAt=\"0000000\" librarySectionID=\"1\" librarySectionKey=\"/library/sections/1\" librarySectionTitle=\"Movies\" originalTitle=\"00000000000000\" originallyAvailableAt=\"0000-00-00\" rating=\"0.0\" ratingImage=\"ratingimage\" ratingKey=\"2\" sessionKey=\"1\" studio=\"Example Studio\" summary=\"Lorem Ispum dolor sit amet\" tagline=\"Yep\" thumb=\"/library/metadata/2/thumb/0000000\" title=\"A long title\" titleSort=\"A short title\" type=\"movie\" updatedAt=\"000000\" viewOffset=\"0\" year=\"0000\">\n    <Media audioProfile=\"ma\" id=\"2\" videoProfile=\"high\" audioChannels=\"2\" audioCodec=\"aac\" bitrate=\"20231\" container=\"mp4\" duration=\"6262249\" height=\"1080\" optimizedForStreaming=\"1\" protocol=\"dash\" videoCodec=\"h264\" videoFrameRate=\"24p\" videoResolution=\"1080p\" width=\"1920\" selected=\"1\">\n    <Part audioProfile=\"ma\" hasThumbnail=\"1\" id=\"2\" videoProfile=\"high\" bitrate=\"20231\" container=\"mp4\" duration=\"6262249\" height=\"1080\" optimizedForStreaming=\"1\" protocol=\"dash\" width=\"1920\" decision=\"transcode\" selected=\"1\">\n    <Stream bitDepth=\"8\" bitrate=\"19975\" chromaLocation=\"left\" chromaSubsampling=\"4:2:0\" codec=\"h264\" codedHeight=\"1088\" codedWidth=\"1920\" default=\"1\" displayTitle=\"XXXX\" extendedDisplayTitle=\"Yes\" frameRate=\"23.975999832153320\" hasScalingMatrix=\"0\" height=\"1080\" id=\"4\" level=\"41\" profile=\"high\" refFrames=\"4\" scanType=\"progressive\" streamType=\"1\" title=\"Example\" width=\"1920\" decision=\"copy\" location=\"segments-video\"/>\n    <Stream bitrate=\"256\" bitrateMode=\"cbr\" channels=\"2\" codec=\"aac\" default=\"1\" displayTitle=\"Not Existing\" extendedDisplayTitle=\"Yes, really\" id=\"5\" language=\"Yep\" languageCode=\"jpn\" languageTag=\"ch\" selected=\"1\" streamType=\"2\" decision=\"transcode\" location=\"segments-audio\"/>\n    </Part>\n    </Media>\n    <Genre count=\"13\" filter=\"genre=48\" id=\"48\" tag=\"Drama\"/>\n    <Genre count=\"8\" filter=\"genre=104\" id=\"104\" tag=\"Adventure\"/>\n    <User id=\"1\" thumb=\"https://google.com\" title=\"example_usr\"/>\n    <Player address=\"0.0.0.0\" device=\"Windows\" machineIdentifier=\"72483785378573857385\" model=\"bundled\" platform=\"Chrome\" platformVersion=\"111.0\" product=\"Plex Web\" profile=\"Web\" state=\"paused\" title=\"Chrome\" version=\"0.000.0\" local=\"1\" relayed=\"0\" secure=\"1\" userID=\"1\"/>\n    <Session id=\"2894294r2jf2038fj3098jgf3gt\" bandwidth=\"21560\" location=\"lan\"/>\n    <TranscodeSession key=\"/transcode/sessions/example-session\" throttled=\"0\" complete=\"0\" progress=\"0\" size=\"-22\" speed=\"18.600000381469727\" error=\"0\" duration=\"100\" remaining=\"70\" context=\"streaming\" sourceVideoCodec=\"h264\" sourceAudioCodec=\"dca\" videoDecision=\"copy\" audioDecision=\"transcode\" protocol=\"dash\" container=\"mp4\" videoCodec=\"h264\" audioCodec=\"aac\" audioChannels=\"2\" width=\"1920\" height=\"1080\" transcodeHwRequested=\"0\" transcodeHwFullPipeline=\"0\" timeStamp=\"1679349635.2791338\" maxOffsetAvailable=\"104.27\" minOffsetAvailable=\"84.166999816894531\"/>\n    </Video>\n    </MediaContainer>`\n    );\n\n    // act\n    const response = await client.getSessions();\n\n    // assert\n    expect(fetchMock.requests().length).toBe(1);\n    expect(fetchMock.requests()[0].url).toBe(\n      'https://plex.local/status/sessions?X-Plex-Token=MY_TOKEN'\n    );\n    expect(response).not.toBeNull();\n    expect(response.length).toBe(1);\n    expect(response[0].id).toBe('2894294r2jf2038fj3098jgf3gt');\n    expect(response[0].username).toBe('example_usr');\n    expect(response[0].userProfilePicture).toBe('https://google.com');\n    expect(response[0].sessionName).toBe('Plex Web (Chrome)');\n    expect(response[0].currentlyPlaying).toMatchObject({\n      name: 'A long title',\n      type: 'movie',\n      metadata: {\n        video: {\n          bitrate: '20231',\n          height: '1080',\n          videoCodec: 'h264',\n          videoFrameRate: '24p',\n          width: '1920',\n        },\n        audio: { audioChannels: '2', audioCodec: 'aac' },\n        transcoding: {\n          audioChannels: '2',\n          audioCodec: 'aac',\n          audioDecision: 'transcode',\n          container: 'mp4',\n          context: 'streaming',\n          duration: '100',\n          error: false,\n          height: '1080',\n          sourceAudioCodec: 'dca',\n          sourceVideoCodec: 'h264',\n          timeStamp: '1679349635.2791338',\n          transcodeHwRequested: false,\n          videoCodec: 'h264',\n          videoDecision: 'copy',\n          width: '1920',\n        },\n      },\n    });\n  });\n\n  it('return sessions when no player and session present', async () => {\n    // arrange\n    const client = new PlexClient('http://plex.local', 'ABCYZT');\n\n    fetchMock.mockResponseOnce(`<MediaContainer size=\"1\">\n    <Video addedAt=\"0000000\" art=\"/library/metadata/2/art/00000000\" audienceRating=\"0.0\" audienceRatingImage=\"niceImage\" chapterSource=\"media\" contentRating=\"TV-PG\" duration=\"6262249\" guid=\"plex://movie/0000000000000000\" key=\"/library/metadata/2\" lastViewedAt=\"0000000\" librarySectionID=\"1\" librarySectionKey=\"/library/sections/1\" librarySectionTitle=\"Movies\" originalTitle=\"00000000000000\" originallyAvailableAt=\"0000-00-00\" rating=\"0.0\" ratingImage=\"ratingimage\" ratingKey=\"2\" sessionKey=\"1\" studio=\"Example Studio\" summary=\"Lorem Ispum dolor sit amet\" tagline=\"Yep\" thumb=\"/library/metadata/2/thumb/0000000\" title=\"A long title\" titleSort=\"A short title\" type=\"movie\" updatedAt=\"000000\" viewOffset=\"0\" year=\"0000\">\n    <Media audioProfile=\"ma\" id=\"2\" videoProfile=\"high\" audioChannels=\"2\" audioCodec=\"aac\" bitrate=\"20231\" container=\"mp4\" duration=\"6262249\" height=\"1080\" optimizedForStreaming=\"1\" protocol=\"dash\" videoCodec=\"h264\" videoFrameRate=\"24p\" videoResolution=\"1080p\" width=\"1920\" selected=\"1\">\n    <Part audioProfile=\"ma\" hasThumbnail=\"1\" id=\"2\" videoProfile=\"high\" bitrate=\"20231\" container=\"mp4\" duration=\"6262249\" height=\"1080\" optimizedForStreaming=\"1\" protocol=\"dash\" width=\"1920\" decision=\"transcode\" selected=\"1\">\n    <Stream bitDepth=\"8\" bitrate=\"19975\" chromaLocation=\"left\" chromaSubsampling=\"4:2:0\" codec=\"h264\" codedHeight=\"1088\" codedWidth=\"1920\" default=\"1\" displayTitle=\"XXXX\" extendedDisplayTitle=\"Yes\" frameRate=\"23.975999832153320\" hasScalingMatrix=\"0\" height=\"1080\" id=\"4\" level=\"41\" profile=\"high\" refFrames=\"4\" scanType=\"progressive\" streamType=\"1\" title=\"Example\" width=\"1920\" decision=\"copy\" location=\"segments-video\"/>\n    <Stream bitrate=\"256\" bitrateMode=\"cbr\" channels=\"2\" codec=\"aac\" default=\"1\" displayTitle=\"Not Existing\" extendedDisplayTitle=\"Yes, really\" id=\"5\" language=\"Yep\" languageCode=\"jpn\" languageTag=\"ch\" selected=\"1\" streamType=\"2\" decision=\"transcode\" location=\"segments-audio\"/>\n    </Part>\n    </Media>\n    <Genre count=\"13\" filter=\"genre=48\" id=\"48\" tag=\"Drama\"/>\n    <Genre count=\"8\" filter=\"genre=104\" id=\"104\" tag=\"Adventure\"/>\n    <User />\n    <Player address=\"0.0.0.0\" device=\"Windows\" machineIdentifier=\"72483785378573857385\" model=\"bundled\" platform=\"Chrome\" platformVersion=\"111.0\" product=\"Plex Web\" profile=\"Web\" state=\"paused\" title=\"Chrome\" version=\"0.000.0\" local=\"1\" relayed=\"0\" secure=\"1\" userID=\"1\"/>\n    <TranscodeSession key=\"/transcode/sessions/example-session\" throttled=\"0\" complete=\"0\" progress=\"0\" size=\"-22\" speed=\"18.600000381469727\" error=\"0\" duration=\"100\" remaining=\"70\" context=\"streaming\" sourceVideoCodec=\"h264\" sourceAudioCodec=\"dca\" videoDecision=\"copy\" audioDecision=\"transcode\" protocol=\"dash\" container=\"mp4\" videoCodec=\"h264\" audioCodec=\"aac\" audioChannels=\"2\" width=\"1920\" height=\"1080\" transcodeHwRequested=\"0\" transcodeHwFullPipeline=\"0\" timeStamp=\"1679349635.2791338\" maxOffsetAvailable=\"104.27\" minOffsetAvailable=\"84.166999816894531\"/>\n    </Video>\n    </MediaContainer>`);\n\n    // act\n    const response = await client.getSessions();\n\n    // assert\n    expect(fetchMock.requests().length).toBe(1);\n    expect(fetchMock.requests()[0].url).toBe(\n      'http://plex.local/status/sessions?X-Plex-Token=ABCYZT'\n    );\n    expect(response.length).toBe(1);\n    expect(response[0]).toMatchObject({\n      id: undefined,\n      username: 'Anonymous',\n      userProfilePicture: undefined,\n      sessionName: 'Plex Web (Chrome)',\n      currentlyPlaying: {\n        name: 'A long title',\n        type: 'movie',\n      },\n    });\n  });\n\n  it('return empty if no media container', async () => {\n    // arrange\n    const client = new PlexClient('http://plex.local', 'Homarr');\n\n    fetchMock.mockResponseOnce('<MediaContainer size=\"1\"></MediaContainer>');\n\n    // act\n    const response = await client.getSessions();\n\n    // assert\n    expect(fetchMock.requests().length).toBe(1);\n    expect(response.length).toBe(0);\n  });\n\n  afterEach(() => {\n    fetchMock.mockRestore();\n  });\n});\n"
  },
  {
    "path": "src/tools/server/sdk/plex/plexClient.ts",
    "content": "import { Element, xml2js } from 'xml-js';\nimport { GenericCurrentlyPlaying, GenericSessionInfo } from '~/types/api/media-server/session-info';\n\nexport class PlexClient {\n  constructor(\n    private readonly apiAddress: string,\n    private readonly token: string\n  ) {}\n\n  async getSessions(): Promise<GenericSessionInfo[]> {\n    const response = await fetch(`${this.apiAddress}/status/sessions?X-Plex-Token=${this.token}`);\n    const body = await response.text();\n\n    // convert xml response to objects, as there is no JSON api\n    const data = xml2js(body);\n\n    // TODO: Investigate when there are no media containers\n    const mediaContainer = data.elements[0] as Element;\n\n    // no sessions are open or available\n    if (!mediaContainer.elements?.some((_) => true)) {\n      return [];\n    }\n\n    const videoElements = mediaContainer.elements as Element[];\n\n    const videos = videoElements\n      .map((videoElement): GenericSessionInfo | undefined => {\n        // extract the elements from the children\n        const userElement = this.findElement('User', videoElement.elements);\n        const playerElement = this.findElement('Player', videoElement.elements);\n        const mediaElement = this.findElement('Media', videoElement.elements);\n        const sessionElement = this.findElement('Session', videoElement.elements);\n        const transcodingElement = this.findElement('TranscodeSession', videoElement.elements);\n\n        if (!playerElement || !mediaElement) {\n          return undefined;\n        }\n\n        const { videoCodec, videoFrameRate, audioCodec, audioChannels, height, width, bitrate } =\n          mediaElement;\n\n        return {\n          id: sessionElement?.id as string | undefined,\n          username: userElement?.title ?? ('Anonymous' as string),\n          userProfilePicture: userElement?.thumb as string | undefined,\n          sessionName: `${playerElement.product} (${playerElement.title})`,\n          currentlyPlaying: {\n            name: `${videoElement.attributes?.grandparentTitle ?? videoElement.attributes?.title}`,\n            seasonName: videoElement.attributes?.parentTitle,\n            episodeName: videoElement.attributes?.title,\n            episodeCount: videoElement.attributes?.index ?? undefined,\n            type: this.getCurrentlyPlayingType(videoElement.attributes?.type as string),\n            metadata: {\n              video: {\n                bitrate,\n                height,\n                videoCodec,\n                videoFrameRate,\n                width,\n              },\n              audio: {\n                audioChannels,\n                audioCodec,\n              },\n              transcoding:\n                transcodingElement === undefined\n                  ? undefined\n                  : {\n                      audioChannels: transcodingElement.audioChannels,\n                      audioCodec: transcodingElement.audioCodec,\n                      audioDecision: transcodingElement.audioDecision,\n                      container: transcodingElement.container,\n                      context: transcodingElement.context,\n                      duration: transcodingElement.duration,\n                      error: transcodingElement.error === 1,\n                      height: transcodingElement.height,\n                      sourceAudioCodec: transcodingElement.sourceAudioCodec,\n                      sourceVideoCodec: transcodingElement.sourceVideoCodec,\n                      timeStamp: transcodingElement.timeStamp,\n                      transcodeHwRequested: transcodingElement.transcodeHwRequested === 1,\n                      videoCodec: transcodingElement.videoCodec,\n                      videoDecision: transcodingElement.videoDecision,\n                      width: transcodingElement.width,\n                    },\n            },\n          },\n        } as GenericSessionInfo;\n      })\n      .filter((x) => x !== undefined) as GenericSessionInfo[];\n\n    return videos;\n  }\n\n  private findElement(name: string, elements: Element[] | undefined) {\n    return elements?.find((x) => x.name === name)?.attributes;\n  }\n\n  private getCurrentlyPlayingType(type: string): GenericCurrentlyPlaying['type'] {\n    switch (type) {\n      case 'movie':\n        return 'movie';\n      case 'episode':\n        return 'video';\n      case 'track':\n        return 'audio';\n      default:\n        return undefined;\n    }\n  }\n}\n"
  },
  {
    "path": "src/tools/server/theme/theme.ts",
    "content": "import { MantineProviderProps } from '@mantine/core';\n\nexport const theme: MantineProviderProps['theme'] = {};\n"
  },
  {
    "path": "src/tools/server/translation-namespaces.ts",
    "content": "export const boardNamespaces = [\n  'tools/docker',\n  'layout/element-selector/selector',\n  'layout/modals/add-app',\n  'layout/modals/change-position',\n  'layout/common',\n  'layout/header/actions/toggle-edit-mode',\n  'layout/mobile/drawer',\n  'settings/common',\n  'modules/common',\n  'modules/date',\n  'modules/calendar',\n  'modules/dlspeed',\n  'modules/usenet',\n  'modules/search',\n  'modules/torrents-status',\n  'modules/weather',\n  'modules/ping',\n  'modules/iframe',\n  'modules/rss',\n  'modules/docker',\n  'modules/dashdot',\n  'modules/overseerr',\n  'modules/health-monitoring',\n  'modules/media-server',\n  'modules/indexer-manager',\n  'modules/common-media-cards',\n  'modules/video-stream',\n  'modules/media-requests-list',\n  'modules/media-requests-stats',\n  'modules/dns-hole-summary',\n  'modules/dns-hole-controls',\n  'modules/bookmark',\n  'modules/notebook',\n  'modules/smart-home/entity-state',\n  'modules/smart-home/trigger-automation',\n  'modules/media-transcoding',\n  'widgets/error-boundary',\n  'widgets/draggable-list',\n  'widgets/location',\n  'boards/common',\n];\n\nexport const manageNamespaces = [\n  'layout/manage',\n  'manage/boards',\n  'manage/users',\n  'manage/users/invites',\n  'manage/users/create',\n  'manage/users/edit',\n];\nexport const loginNamespaces = ['authentication/login'];\n\nexport const pageNotFoundNamespaces = ['layout/errors/not-found'];\n\nexport const pageAccessDeniedNamespaces = ['layout/errors/access-denied'];\n"
  },
  {
    "path": "src/tools/server/url.ts",
    "content": "import { NextRequest } from 'next/server';\n\nexport const getUrl = (req: NextRequest) => {\n  const protocol = req.nextUrl.protocol;\n  return protocol + '//' + req.headers.get('host');\n};\n"
  },
  {
    "path": "src/tools/shared/app.ts",
    "content": "import { v4 as uuidv4 } from 'uuid';\nimport { AppType } from '~/types/app';\n\nexport const generateDefaultApp = (wrapperId: string): AppType =>\n  ({\n    id: uuidv4(),\n    name: 'Your app',\n    url: 'https://homarr.dev',\n    appearance: {\n      iconUrl: '/imgs/logo/logo.png',\n      appNameStatus: 'normal',\n      positionAppName: 'column',\n      lineClampAppName: 1,\n      appNameFontSize: 16,\n    },\n    network: {\n      enabledStatusChecker: true,\n      statusCodes: ['200', '301', '302', '304', '307', '308'],\n      okStatus: [200, 301, 302, 304, 307, 308],\n    },\n    behaviour: {\n      isOpeningNewTab: true,\n      externalUrl: 'https://homarr.dev',\n    },\n    area: {\n      type: 'wrapper',\n      properties: {\n        id: wrapperId,\n      },\n    },\n    shape: {},\n    integration: {\n      type: null,\n      properties: [],\n    },\n  }) satisfies AppType;\n"
  },
  {
    "path": "src/tools/shared/math/percentage.tool.test.ts",
    "content": "import { describe, expect, it } from 'vitest';\n\nimport { percentage } from './percentage.tool';\n\ndescribe('percentage', () => {\n  it.concurrent('be fixed value', () => {\n    // arrange\n    const value = 62;\n\n    // act\n    const fixedPercentage = percentage(value, 100);\n\n    // assert\n    expect(fixedPercentage).toBe('62.0');\n  });\n\n  it.concurrent('be fixed value when decimal places', () => {\n    // arrange\n    const value = 42.69696969;\n\n    // act\n    const fixedPercentage = percentage(value, 100);\n\n    // assert\n    expect(fixedPercentage).toBe('42.7');\n  });\n});\n"
  },
  {
    "path": "src/tools/shared/math/percentage.tool.ts",
    "content": "export const percentage = (partialValue: number, totalValue: number) =>\n  ((100 * partialValue) / totalValue).toFixed(1);\n"
  },
  {
    "path": "src/tools/shared/strings.ts",
    "content": "export const trimStringEnding = (original: string, toTrimIfExists: string[]) => {\n  for (let i = 0; i < toTrimIfExists.length; i += 1) {\n    if (!original.endsWith(toTrimIfExists[i])) {\n      continue;\n    }\n    return original.substring(0, original.indexOf(toTrimIfExists[i]));\n  }\n\n  return original;\n};\n\nexport const firstUpperCase = (str: string) => {\n  return str.charAt(0).toUpperCase() + str.slice(1);\n};\n\nexport const appendPath = (url: URL, path: string) => {\n  const newUrl = new URL(url);\n  newUrl.pathname += path;\n  return newUrl;\n}\n"
  },
  {
    "path": "src/tools/shared/time/date.tool.test.ts",
    "content": "import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';\n\nimport { isToday } from './date.tool';\n\ndescribe('isToday', () => {\n  beforeEach(() => {\n    vi.useFakeTimers();\n  });\n\n  afterEach(() => {\n    vi.useRealTimers();\n  });\n\n  it.concurrent('should return true if date is today', () => {\n    // arrange\n    const date = new Date(2022, 3, 17);\n    vi.setSystemTime(date);\n\n    // act\n    const today = isToday(date);\n\n    // assert\n    expect(today).toBe(true);\n  });\n\n  it.concurrent(\"should return true if date is today and time doesn't match\", () => {\n    // arrange\n    vi.setSystemTime(new Date(2022, 3, 17, 16, 25, 11));\n\n    // act\n    const today = isToday(new Date(2022, 3, 17));\n\n    // assert\n    expect(today).toBe(true);\n  });\n\n  it.concurrent(\"should be false if date doesn't match\", () => {\n    // arrange\n    vi.setSystemTime(new Date(2022, 3, 17, 16));\n\n    // act\n    const today = isToday(new Date(2022, 3, 15));\n\n    // assert\n    expect(today).toBe(false);\n  });\n});\n"
  },
  {
    "path": "src/tools/shared/time/date.tool.ts",
    "content": "export const isToday = (date: Date) => {\n  const today = new Date();\n  return (\n    today.getDate() === date.getDate() &&\n    today.getMonth() === date.getMonth() &&\n    today.getFullYear() === date.getFullYear()\n  );\n};\n"
  },
  {
    "path": "src/tools/shared/time/stopwatch.tool.test.ts",
    "content": "import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';\n\nimport { Stopwatch } from './stopwatch.tool';\n\ndescribe('stopwatch', () => {\n  beforeEach(() => {\n    vi.useFakeTimers();\n  });\n\n  afterEach(() => {\n    vi.useRealTimers();\n  });\n\n  it.concurrent('should be elapsed time between start and current', () => {\n    // arrange\n    vi.setSystemTime(new Date(2023, 2, 26, 0, 0, 0));\n    const stopwatch = new Stopwatch();\n\n    // act\n    vi.setSystemTime(new Date(2023, 2, 26, 0, 0, 2));\n    const milliseconds = stopwatch.getEllapsedMilliseconds();\n\n    // assert\n    expect(milliseconds).toBe(2000);\n  });\n});\n"
  },
  {
    "path": "src/tools/shared/time/stopwatch.tool.ts",
    "content": "export class Stopwatch {\n  private startTime: Date;\n\n  constructor() {\n    this.startTime = new Date();\n  }\n\n  getEllapsedMilliseconds() {\n    return new Date().getTime() - this.startTime.getTime();\n  }\n}\n"
  },
  {
    "path": "src/tools/singleton/HomeAssistantSingleton.ts",
    "content": "import { HomeAssistant } from '../server/sdk/homeassistant/HomeAssistant';\n\nexport class HomeAssistantSingleton {\n  private static _instances: HomeAssistant[] = [];\n\n  public static getOrSet(url: URL, token: string): HomeAssistant {\n    const match = this._instances.find(\n      (instance) =>\n        instance.basePath.hostname === url.hostname && instance.basePath.port === url.port\n    );\n\n    if (!match) {\n      const instance = new HomeAssistant(url, token);\n      this._instances.push(instance);\n      return instance;\n    }\n\n    return match;\n  }\n}\n"
  },
  {
    "path": "src/types/api/downloads/queue/NormalizedDownloadQueueResponse.ts",
    "content": "import { NormalizedTorrent } from '@ctrl/shared-torrent';\nimport { UsenetQueueItem } from '~/widgets/useNet/types';\n\nexport type NormalizedDownloadQueueResponse = {\n  apps: NormalizedDownloadAppStat[];\n  failedApps: string[];\n};\n\nexport type NormalizedDownloadAppStat = {\n  success: boolean;\n  appId: string;\n} & (TorrentTotalDownload | UsenetTotalDownloas);\n\nexport type TorrentTotalDownload = {\n  type: 'torrent';\n  torrents: {\n    name: string;\n    state: NormalizedTorrent['state'];\n    totalSelected: number;\n    totalPeers: number;\n    totalSeeds: number;\n    eta: number;\n    progress: number;\n    ratio: number;\n    uploadSpeed: number;\n    downloadSpeed: number;\n    isCompleted: boolean;\n    totalDownloaded: number;\n    totalUploaded: number;\n    label?: string;\n    queuePosition: number;\n    stateMessage: string;\n    dateAdded: string;\n  }[];\n  totalDownload: number;\n  totalUpload: number;\n};\n\nexport type UsenetTotalDownloas = {\n  type: 'usenet';\n  totalDownload: number;\n  nzbs: UsenetQueueItem[];\n};\n"
  },
  {
    "path": "src/types/api/media-server/media-server.ts",
    "content": "import { GenericSessionInfo } from './session-info';\n\nexport type GenericMediaServer = {\n  /**\n   * The type of the media server.\n   * Undefined indicates, that the type is either unsupported or recognizing went wrong\n   */\n  type: 'jellyfin' | 'plex' | undefined;\n\n  /**\n   * The address of the server\n   */\n  serverAddress: string;\n\n  /**\n   * The current version of the server\n   */\n  version: string | undefined;\n\n  /**\n   * The active sessions on the server\n   */\n  sessions: GenericSessionInfo[];\n\n  /**\n   * The app id of the used app\n   */\n  appId: string;\n\n  /**\n   * Indicates, wether the communication was successfull or not\n   */\n  success: boolean;\n};\n"
  },
  {
    "path": "src/types/api/media-server/response.ts",
    "content": "import { GenericMediaServer } from './media-server';\n\nexport type MediaServersResponseType = {\n  servers: GenericMediaServer[];\n};\n"
  },
  {
    "path": "src/types/api/media-server/session-info.ts",
    "content": "export type GenericSessionInfo = {\n  supportsMediaControl: boolean;\n  username: string | undefined;\n  id: string | undefined;\n  sessionName: string;\n  userProfilePicture: string | undefined;\n  currentlyPlaying: GenericCurrentlyPlaying | undefined;\n};\n\nexport type GenericCurrentlyPlaying = {\n  name: string;\n  seasonName: string | undefined;\n  episodeName: string | undefined;\n  albumName: string | undefined;\n  episodeCount: number | undefined;\n  type: 'audio' | 'video' | 'tv' | 'movie' | undefined;\n  metadata: {\n    video:\n      | {\n          videoCodec: string | undefined;\n          videoFrameRate: string | undefined;\n          height: number | undefined;\n          width: number | undefined;\n          bitrate: number | undefined;\n        }\n      | undefined;\n    audio:\n      | {\n          audioCodec: string | undefined;\n          audioChannels: number | undefined;\n        }\n      | undefined;\n    transcoding:\n      | {\n          context: string | undefined;\n          sourceVideoCodec: string | undefined;\n          sourceAudioCodec: string | undefined;\n          videoDecision: string | undefined;\n          audioDecision: string | undefined;\n          container: string | undefined;\n          videoCodec: string | undefined;\n          audioCodec: string | undefined;\n          error: boolean | undefined;\n          duration: number | undefined;\n          audioChannels: number | undefined;\n          width: number | undefined;\n          height: number | undefined;\n          transcodeHwRequested: boolean | undefined;\n          timeStamp: number | undefined;\n        }\n      | undefined;\n  };\n};\n"
  },
  {
    "path": "src/types/api/tdarr.ts",
    "content": "export type TdarrPieSegment = {\n  name: string;\n  value: number;\n};\n\nexport type TdarrStatistics = {\n  totalFileCount: number;\n  totalTranscodeCount: number;\n  totalHealthCheckCount: number;\n  failedTranscodeCount: number;\n  failedHealthCheckCount: number;\n  stagedTranscodeCount: number;\n  stagedHealthCheckCount: number;\n  pies: {\n    libraryName: string;\n    libraryId: string;\n    totalFiles: number;\n    totalTranscodes: number;\n    savedSpace: number;\n    totalHealthChecks: number;\n    transcodeStatus: TdarrPieSegment[];\n    healthCheckStatus: TdarrPieSegment[];\n    videoCodecs: TdarrPieSegment[];\n    videoContainers: TdarrPieSegment[];\n    videoResolutions: TdarrPieSegment[];\n    audioCodecs: TdarrPieSegment[];\n    audioContainers: TdarrPieSegment[];\n  }[];\n};\n\nexport type TdarrWorker = {\n  id: string;\n  filePath: string;\n  fps: number;\n  percentage: number;\n  ETA: string;\n  jobType: string;\n  status: string;\n  step: string;\n  originalSize: number;\n  estimatedSize: number | null;\n  outputSize: number | null;\n};\n\nexport type TdarrQueue = {\n  array: {\n    id: string;\n    healthCheck: string;\n    transcode: string;\n    filePath: string;\n    fileSize: number;\n    container: string;\n    codec: string;\n    resolution: string;\n    type: 'transcode' | 'health check';\n  }[];\n  totalCount: number;\n  startIndex: number;\n  endIndex: number;\n};"
  },
  {
    "path": "src/types/app.ts",
    "content": "import { Icon, IconKey, IconPassword, IconUser } from '@tabler/icons-react';\nimport { Property } from 'csstype';\n\nimport { TileBaseType } from './tile';\n\nexport interface AppType extends TileBaseType {\n  id: string;\n  name: string;\n  url: string;\n  behaviour: AppBehaviourType;\n  network: AppNetworkType;\n  appearance: AppAppearanceType;\n  integration: AppIntegrationType;\n}\n\nexport type ConfigAppType = Omit<AppType, 'integration'> & {\n  integration?: ConfigAppIntegrationType | null;\n};\n\ninterface AppBehaviourType {\n  externalUrl: string;\n  isOpeningNewTab: boolean;\n  tooltipDescription?: string;\n}\n\ninterface AppNetworkType {\n  enabledStatusChecker: boolean;\n  /**\n   * @deprecated replaced by statusCodes\n   */\n  okStatus?: number[];\n  statusCodes: string[];\n}\n\ninterface AppAppearanceType {\n  iconUrl: string;\n  appNameStatus: 'normal' | 'hover' | 'hidden';\n  positionAppName: Property.FlexDirection;\n  appNameFontSize: number;\n  lineClampAppName: number;\n}\n\nexport type IntegrationType =\n  | 'readarr'\n  | 'radarr'\n  | 'sonarr'\n  | 'lidarr'\n  | 'prowlarr'\n  | 'sabnzbd'\n  | 'jellyseerr'\n  | 'overseerr'\n  | 'deluge'\n  | 'qBittorrent'\n  | 'transmission'\n  | 'plex'\n  | 'jellyfin'\n  | 'nzbGet'\n  | 'pihole'\n  | 'adGuardHome'\n  | 'homeAssistant'\n  | 'openmediavault'\n  | 'proxmox'\n  | 'tdarr';\n\nexport type AppIntegrationType = {\n  type: IntegrationType | null;\n  properties: AppIntegrationPropertyType[];\n};\n\nexport type ConfigAppIntegrationType = Omit<AppIntegrationType, 'properties'> & {\n  properties: ConfigAppIntegrationPropertyType[];\n};\n\nexport type AppIntegrationPropertyType = {\n  type: AppIntegrationPropertyAccessabilityType;\n  field: IntegrationField;\n  value?: string | null;\n  isDefined: boolean;\n};\n\nexport type AppIntegrationPropertyAccessabilityType = 'private' | 'public';\n\ntype ConfigAppIntegrationPropertyType = Omit<AppIntegrationPropertyType, 'isDefined'>;\n\nexport type IntegrationField = 'apiKey' | 'password' | 'username';\n\nexport const integrationFieldProperties: {\n  [key in Exclude<AppIntegrationType['type'], null>]: IntegrationField[];\n} = {\n  lidarr: ['apiKey'],\n  radarr: ['apiKey'],\n  sonarr: ['apiKey'],\n  prowlarr: ['apiKey'],\n  sabnzbd: ['apiKey'],\n  readarr: ['apiKey'],\n  overseerr: ['apiKey'],\n  jellyseerr: ['apiKey'],\n  deluge: ['password'],\n  nzbGet: ['username', 'password'],\n  qBittorrent: ['username', 'password'],\n  transmission: ['username', 'password'],\n  jellyfin: ['username', 'password'],\n  plex: ['apiKey'],\n  pihole: ['apiKey'],\n  adGuardHome: ['username', 'password'],\n  homeAssistant: ['apiKey'],\n  openmediavault: ['username', 'password'],\n  proxmox: ['apiKey'],\n  tdarr: [],\n};\n\nexport type IntegrationFieldDefinitionType = {\n  type: 'private' | 'public';\n  icon: Icon;\n  label: string;\n};\n\nexport const integrationFieldDefinitions: {\n  [key in IntegrationField]: IntegrationFieldDefinitionType;\n} = {\n  apiKey: {\n    type: 'private',\n    icon: IconKey,\n    label: 'common:secrets.apiKey',\n  },\n  username: {\n    type: 'public',\n    icon: IconUser,\n    label: 'common:secrets.username',\n  },\n  password: {\n    type: 'private',\n    icon: IconPassword,\n    label: 'common:secrets.password',\n  },\n};\n"
  },
  {
    "path": "src/types/area.ts",
    "content": "export type AreaType = WrapperAreaType | CategoryAreaType | SidebarAreaType;\n\ninterface WrapperAreaType {\n  type: 'wrapper';\n  properties: {\n    id: string;\n  };\n}\n\ninterface CategoryAreaType {\n  type: 'category';\n  properties: {\n    id: string;\n  };\n}\n\ninterface SidebarAreaType {\n  type: 'sidebar';\n  properties: {\n    location: 'right' | 'left';\n  };\n}\n"
  },
  {
    "path": "src/types/category.ts",
    "content": "export interface CategoryType {\n  id: string;\n  position: number;\n  name: string;\n}\n"
  },
  {
    "path": "src/types/config.ts",
    "content": "import { IWidget } from '~/widgets/widgets';\n\nimport { AppType, ConfigAppType } from './app';\nimport { CategoryType } from './category';\nimport { SettingsType } from './settings';\nimport { WrapperType } from './wrapper';\n\nexport interface ConfigType {\n  schemaVersion: number;\n  configProperties: ConfigPropertiesType;\n  categories: CategoryType[];\n  wrappers: WrapperType[];\n  apps: AppType[];\n  widgets: IWidget<string, any>[];\n  settings: SettingsType;\n}\n\nexport type BackendConfigType = Omit<ConfigType, 'apps'> & {\n  apps: ConfigAppType[];\n};\n\nexport interface ConfigPropertiesType {\n  name: string;\n}\n"
  },
  {
    "path": "src/types/dashboardPageType.ts",
    "content": "import { SSRConfig } from 'next-i18next';\n\nimport { ConfigType } from './config';\n\nexport type DashboardServerSideProps = {\n  config: ConfigType;\n  // eslint-disable-next-line react/no-unused-prop-types\n  configName: string;\n  // eslint-disable-next-line react/no-unused-prop-types\n  _nextI18Next?: SSRConfig['_nextI18Next'];\n};\n"
  },
  {
    "path": "src/types/helpers.ts",
    "content": "export type OnlyKeysWithStructure<T, TStructure> = {\n  [P in keyof T]: T[P] extends TStructure ? P : never;\n}[keyof T];\n"
  },
  {
    "path": "src/types/settings.ts",
    "content": "import { MantineTheme } from '@mantine/core';\n\nexport interface SettingsType {\n  common: CommonSettingsType;\n  customization: CustomizationSettingsType;\n  access: BoardAccessSettingsType;\n}\n\nexport interface BoardAccessSettingsType {\n  allowGuests: boolean;\n}\n\nexport interface CommonSettingsType {\n  searchEngine: SearchEngineCommonSettingsType;\n}\n\nexport type SearchEngineCommonSettingsType =\n  | CommonSearchEngineCommonSettingsType\n  | CustomSearchEngineCommonSettingsType;\n\nexport interface CommonSearchEngineCommonSettingsType extends BaseSearchEngineType {\n  type: 'google' | 'duckDuckGo' | 'bing';\n}\n\ninterface CustomSearchEngineCommonSettingsType extends BaseSearchEngineType {\n  type: 'custom';\n  properties: {\n    template: string;\n    openInNewTab: boolean;\n    enabled: boolean;\n  };\n}\n\ninterface BaseSearchEngineType {\n  properties: {\n    openInNewTab: boolean;\n    enabled: boolean;\n  };\n}\n\nexport interface CustomizationSettingsType {\n  layout: LayoutCustomizationSettingsType;\n  pageTitle?: string;\n  metaTitle?: string;\n  logoImageUrl?: string;\n  faviconUrl?: string;\n  backgroundImageUrl?: string;\n  backgroundImageAttachment?: typeof BackgroundImageAttachment[number];\n  backgroundImageSize?: typeof BackgroundImageSize[number];\n  backgroundImageRepeat?: typeof BackgroundImageRepeat[number];\n  customCss?: string;\n  colors: ColorsCustomizationSettingsType;\n  appOpacity?: number;\n  gridstack?: GridstackSettingsType;\n  accessibility: AccessibilitySettings;\n}\n\nexport const BackgroundImageAttachment = ['fixed',  'scroll'] as const;\n\nexport const BackgroundImageSize = ['cover', 'contain'] as const;\n\nexport const BackgroundImageRepeat = ['no-repeat', 'repeat', 'repeat-x', 'repeat-y'] as const;\n\nexport interface AccessibilitySettings {\n  disablePingPulse: boolean;\n  replacePingDotsWithIcons: boolean;\n}\n\nexport interface GridstackSettingsType {\n  columnCountSmall: number; // default: 3\n  columnCountMedium: number; // default: 6\n  columnCountLarge: number; // default: 12\n}\n\ninterface LayoutCustomizationSettingsType {\n  enabledLeftSidebar: boolean;\n  enabledRightSidebar: boolean;\n  enabledDocker: boolean;\n  enabledPing: boolean;\n  enabledSearchbar: boolean;\n}\n\ninterface ColorsCustomizationSettingsType {\n  primary?: MantineTheme['primaryColor'];\n  secondary?: MantineTheme['primaryColor'];\n  shade?: MantineTheme['primaryShade'];\n}\n"
  },
  {
    "path": "src/types/shape.ts",
    "content": "export interface ShapeType {\n  lg?: SizedShapeType;\n  md?: SizedShapeType;\n  sm?: SizedShapeType;\n}\n\nexport interface SizedShapeType {\n  location: {\n    x: number;\n    y: number;\n  };\n  size: {\n    width: number;\n    height: number;\n  };\n}\n"
  },
  {
    "path": "src/types/tile.ts",
    "content": "import { AreaType } from './area';\nimport { ShapeType } from './shape';\n\nexport interface TileBaseType {\n  area: AreaType;\n  shape: ShapeType;\n}\n"
  },
  {
    "path": "src/types/wrapper.ts",
    "content": "export interface WrapperType {\n  id: string;\n  position: number;\n}\n"
  },
  {
    "path": "src/utils/api.ts",
    "content": "/**\n * This is the client-side entrypoint for your tRPC API. It is used to create the `api` object which\n * contains the Next.js App-wrapper, as well as your type-safe React Query hooks.\n *\n * We also create a few inference helpers for input and output types.\n */\nimport { createTRPCProxyClient, httpBatchLink, loggerLink } from '@trpc/client';\nimport { createTRPCNext } from '@trpc/next';\nimport { type inferRouterInputs, type inferRouterOutputs } from '@trpc/server';\nimport superjson from 'superjson';\nimport { env } from '~/env';\nimport { type RootRouter } from '~/server/api/root';\nimport { queryClient } from '~/tools/server/configurations/tanstack/queryClient.tool';\n\nconst getTrpcConfiguration = () => ({\n  /**\n   * Transformer used for data de-serialization from the server.\n   *\n   * @see https://trpc.io/docs/data-transformers\n   */\n  transformer: superjson,\n\n  /**\n   * Links used to determine request flow from client to server.\n   *\n   * @see https://trpc.io/docs/links\n   */\n  links: [\n    loggerLink({\n      enabled: (opts) =>\n        env.NEXT_PUBLIC_NODE_ENV === 'development' ||\n        (opts.direction === 'down' && opts.result instanceof Error),\n    }),\n    httpBatchLink({\n      url: `${getBaseUrl()}/api/trpc`,\n      maxURLLength: 2000,\n    }),\n  ],\n  queryClient,\n});\n\nconst getBaseUrl = () => {\n  if (typeof window !== 'undefined') return ''; // browser should use relative url\n  if (env.HOSTNAME) {\n    return `http://${env.HOSTNAME}:${env.NEXT_PUBLIC_PORT}`;\n  }\n  return `http://localhost:${env.NEXT_PUBLIC_PORT ?? 3000}`; // dev SSR should use localhost\n};\n\n/** A set of type-safe react-query hooks for your tRPC API. */\nexport const api = createTRPCNext<RootRouter>({\n  config() {\n    return getTrpcConfiguration();\n  },\n  /**\n   * Whether tRPC should await queries when server rendering pages.\n   *\n   * @see https://trpc.io/docs/nextjs#ssr-boolean-default-false\n   */\n  ssr: false,\n});\n\nexport const client = createTRPCProxyClient<RootRouter>(getTrpcConfiguration());\n\n/**\n * Inference helper for inputs.\n *\n * @example type HelloInput = RouterInputs['example']['hello']\n */\nexport type RouterInputs = inferRouterInputs<RootRouter>;\n\n/**\n * Inference helper for outputs.\n *\n * @example type HelloOutput = RouterOutputs['example']['hello']\n */\nexport type RouterOutputs = inferRouterOutputs<RootRouter>;\n\n/**\n * A tRPC client that can be used without hooks.\n */\nexport const trcpProxyClient = createTRPCProxyClient<RootRouter>(getTrpcConfiguration());\n"
  },
  {
    "path": "src/utils/auth/adapter.ts",
    "content": "import { randomUUID } from 'crypto';\nimport { and, eq } from 'drizzle-orm';\nimport {\n  BaseSQLiteDatabase,\n  SQLiteTableFn,\n  sqliteTable as defaultSqliteTableFn,\n  text,\n} from 'drizzle-orm/sqlite-core';\nimport { User } from 'next-auth';\nimport { Adapter, AdapterAccount } from 'next-auth/adapters';\nimport { db } from '~/server/db';\nimport { _users, accounts, sessions, userSettings, verificationTokens } from '~/server/db/schema';\n\n// Need to modify createTables with custom schema\nconst createTables = (sqliteTable: SQLiteTableFn) => ({\n  users: sqliteTable('user', {\n    ..._users,\n    email: text('email').notNull(), // workaround for typescript\n  }),\n  accounts,\n  sessions,\n  verificationTokens,\n});\n\nexport type DefaultSchema = ReturnType<typeof createTables>;\n\nexport const onCreateUser = async ({ user }: { user: User }) => {\n  await db.insert(userSettings).values({\n    id: randomUUID(),\n    userId: user.id,\n  });\n};\n\n// Keep this the same as original file @auth/drizzle-adapter/src/lib/sqlite.ts\n// only change changed return type from Adapter to \"satisfies Adapter\", to tell typescript createUser exists\n\nexport function SQLiteDrizzleAdapter(\n  client: InstanceType<typeof BaseSQLiteDatabase>,\n  tableFn = defaultSqliteTableFn\n) {\n  const { users, accounts, sessions, verificationTokens } = createTables(tableFn);\n\n  return {\n    createUser(data) {\n      return client\n        .insert(users)\n        .values({ ...data, id: crypto.randomUUID() })\n        .returning()\n        .get();\n    },\n    getUser(data) {\n      return client.select().from(users).where(eq(users.id, data)).get() ?? null;\n    },\n    getUserByEmail(data) {\n      return client.select().from(users).where(eq(users.email, data)).get() ?? null;\n    },\n    createSession(data) {\n      return client.insert(sessions).values(data).returning().get();\n    },\n    getSessionAndUser(data) {\n      return (\n        client\n          .select({\n            session: sessions,\n            user: users,\n          })\n          .from(sessions)\n          .where(eq(sessions.sessionToken, data))\n          .innerJoin(users, eq(users.id, sessions.userId))\n          .get() ?? null\n      );\n    },\n    updateUser(data) {\n      if (!data.id) {\n        throw new Error('No user id.');\n      }\n\n      return client.update(users).set(data).where(eq(users.id, data.id)).returning().get();\n    },\n    updateSession(data) {\n      return client\n        .update(sessions)\n        .set(data)\n        .where(eq(sessions.sessionToken, data.sessionToken))\n        .returning()\n        .get();\n    },\n    linkAccount(rawAccount) {\n      const updatedAccount = client.insert(accounts).values(rawAccount).returning().get();\n\n      const account: AdapterAccount = {\n        ...updatedAccount,\n        type: updatedAccount.type,\n        access_token: updatedAccount.access_token ?? undefined,\n        token_type: updatedAccount.token_type ?? undefined,\n        id_token: updatedAccount.id_token ?? undefined,\n        refresh_token: updatedAccount.refresh_token ?? undefined,\n        scope: updatedAccount.scope ?? undefined,\n        expires_at: updatedAccount.expires_at ?? undefined,\n        session_state: updatedAccount.session_state ?? undefined,\n      };\n\n      return account;\n    },\n    getUserByAccount(account) {\n      const results = client\n        .select()\n        .from(accounts)\n        .leftJoin(users, eq(users.id, accounts.userId))\n        .where(\n          and(\n            eq(accounts.provider, account.provider),\n            eq(accounts.providerAccountId, account.providerAccountId)\n          )\n        )\n        .get();\n\n      return results?.user ?? null;\n    },\n    deleteSession(sessionToken) {\n      return (\n        client.delete(sessions).where(eq(sessions.sessionToken, sessionToken)).returning().get() ??\n        null\n      );\n    },\n    createVerificationToken(token) {\n      return client.insert(verificationTokens).values(token).returning().get();\n    },\n    useVerificationToken(token) {\n      try {\n        return (\n          client\n            .delete(verificationTokens)\n            .where(\n              and(\n                eq(verificationTokens.identifier, token.identifier),\n                eq(verificationTokens.token, token.token)\n              )\n            )\n            .returning()\n            .get() ?? null\n        );\n      } catch (err) {\n        throw new Error('No verification token found.');\n      }\n    },\n    deleteUser(id) {\n      return client.delete(users).where(eq(users.id, id)).returning().get();\n    },\n    unlinkAccount(account) {\n      client\n        .delete(accounts)\n        .where(\n          and(\n            eq(accounts.providerAccountId, account.providerAccountId),\n            eq(accounts.provider, account.provider)\n          )\n        )\n        .run();\n\n      return undefined;\n    },\n  } satisfies Adapter;\n}\n\nexport default SQLiteDrizzleAdapter(db);\n"
  },
  {
    "path": "src/utils/auth/cookies.ts",
    "content": "export const createCookiesWithDefaultOptions = (useSecureCookies: boolean) => {\n  const cookiePrefix = useSecureCookies ? '__Secure-' : '';\n\n  return {\n    // default cookie options\n    sessionToken: {\n      // We don't use __Secure prefix as the cookie is used in the code\n      name: `next-auth.session-token`,\n      options: {\n        httpOnly: true,\n        sameSite: 'lax',\n        path: '/',\n        secure: useSecureCookies,\n      },\n    },\n    callbackUrl: {\n      name: `${cookiePrefix}next-auth.callback-url`,\n      options: {\n        httpOnly: true,\n        sameSite: 'lax',\n        path: '/',\n        secure: useSecureCookies,\n      },\n    },\n    csrfToken: {\n      // Default to __Host- for CSRF token for additional protection if using useSecureCookies\n      // NB: The `__Host-` prefix is stricter than the `__Secure-` prefix.\n      name: `${useSecureCookies ? '__Host-' : ''}next-auth.csrf-token`,\n      options: {\n        httpOnly: true,\n        sameSite: 'lax',\n        path: '/',\n        secure: useSecureCookies,\n      },\n    },\n    pkceCodeVerifier: {\n      name: `${cookiePrefix}next-auth.pkce.code_verifier`,\n      options: {\n        httpOnly: true,\n        sameSite: 'lax',\n        path: '/',\n        secure: useSecureCookies,\n        maxAge: 60 * 15, // 15 minutes in seconds\n      },\n    },\n    state: {\n      name: `${cookiePrefix}next-auth.state`,\n      options: {\n        httpOnly: true,\n        sameSite: 'lax',\n        path: '/',\n        secure: useSecureCookies,\n        maxAge: 60 * 15, // 15 minutes in seconds\n      },\n    },\n    nonce: {\n      name: `${cookiePrefix}next-auth.nonce`,\n      options: {\n        httpOnly: true,\n        sameSite: 'lax',\n        path: '/',\n        secure: useSecureCookies,\n      },\n    },\n  } as const;\n};\n"
  },
  {
    "path": "src/utils/auth/credentials.ts",
    "content": "import bcrypt from 'bcryptjs';\nimport Consola from 'consola';\nimport { eq } from 'drizzle-orm';\nimport Credentials from 'next-auth/providers/credentials';\nimport { colorSchemeParser, signInSchema } from '~/validations/user';\n\nimport { db } from '../../server/db';\nimport { users } from '../../server/db/schema';\n\nexport default Credentials({\n  name: 'credentials',\n  credentials: {\n    name: {\n      label: 'Username',\n      type: 'text',\n    },\n    password: { label: 'Password', type: 'password' },\n  },\n  async authorize(credentials) {\n    const data = await signInSchema.parseAsync(credentials);\n\n    const user = await db.query.users.findFirst({\n      with: {\n        settings: {\n          columns: {\n            colorScheme: true,\n            language: true,\n            autoFocusSearch: true,\n          },\n        },\n      },\n      where: eq(users.name, data.name),\n    });\n\n    if (!user || !user.password) {\n      return null;\n    }\n\n    Consola.log(`user ${user.name} is trying to log in. checking password...`);\n    const isValidPassword = await bcrypt.compare(data.password, user.password);\n\n    if (!isValidPassword) {\n      Consola.log(`password for user ${user.name} was incorrect`);\n      return null;\n    }\n\n    Consola.log(`user ${user.name} successfully authorized`);\n\n    return {\n      id: user.id,\n      name: user.name,\n      isAdmin: false,\n      isOwner: false,\n    };\n  },\n});\n"
  },
  {
    "path": "src/utils/auth/index.ts",
    "content": "import { DefaultSession } from 'next-auth';\nimport { CredentialsConfig, OAuthConfig } from 'next-auth/providers';\nimport { env } from '~/env';\n\nimport { OidcRedirectCallbackHeaders } from './oidc';\n\nexport { default as adapter, onCreateUser } from './adapter';\n\n/**\n * Module augmentation for `next-auth` types. Allows us to add custom properties to the `session`\n * object and keep type safety.\n *\n * @see https://next-auth.js.org/getting-started/typescript#module-augmentation\n */\ndeclare module 'next-auth' {\n  interface Session extends DefaultSession {\n    user: DefaultSession['user'] & {\n      id: string;\n      isAdmin: boolean;\n      colorScheme: 'light' | 'dark' | 'environment';\n      autoFocusSearch: boolean;\n      language: string;\n      // ...other properties\n      // role: UserRole;\n    };\n  }\n\n  interface User {\n    isAdmin: boolean;\n    isOwner?: boolean;\n    // ...other properties\n    // role: UserRole;\n  }\n}\n\ndeclare module 'next-auth/jwt' {\n  interface JWT {\n    id: string;\n    isAdmin: boolean;\n  }\n}\n\nexport const getProviders = async (headers: OidcRedirectCallbackHeaders) => {\n  const providers: (CredentialsConfig | OAuthConfig<any>)[] = [];\n\n  if (env.AUTH_PROVIDER?.includes('ldap')) providers.push((await import('./ldap')).default);\n  if (env.AUTH_PROVIDER?.includes('credentials'))\n    providers.push((await import('./credentials')).default);\n  if (env.AUTH_PROVIDER?.includes('oidc')) {\n    const createProvider = (await import('./oidc')).default;\n    providers.push(createProvider(headers));\n  }\n\n  return providers;\n};\n"
  },
  {
    "path": "src/utils/auth/ldap.ts",
    "content": "import Consola from 'consola';\nimport ldap from 'ldapjs';\nimport Credentials from 'next-auth/providers/credentials';\nimport { z } from 'zod';\nimport { env } from '~/env';\nimport { signInSchema } from '~/validations/user';\n\nimport adapter, { onCreateUser } from './adapter';\n\n// Helper types for infering properties of returned search type\ntype AttributeConstraint = string | readonly string[] | undefined;\n\ntype InferrableSearchOptions<\n  Attributes extends AttributeConstraint,\n  ArrayAttributes extends Attributes,\n> = Omit<ldap.SearchOptions, 'attributes'> & {\n  attributes?: Attributes;\n  arrayAttributes?: ArrayAttributes;\n};\n\ntype SearchResultIndex<Attributes extends AttributeConstraint> = Attributes extends string\n  ? Attributes\n  : Attributes extends readonly string[]\n    ? Attributes[number]\n    : string;\n\ntype SearchResult<\n  Attributes extends AttributeConstraint,\n  ArrayAttributes extends Attributes = never,\n> = { dn: string } & Record<\n  Exclude<SearchResultIndex<Attributes>, SearchResultIndex<ArrayAttributes>>,\n  string\n> &\n  Record<SearchResultIndex<ArrayAttributes>, string[]>;\n\nconst ldapLogin = (username: string, password: string) =>\n  new Promise<ldap.Client>((resolve, reject) => {\n    const client = ldap.createClient({\n      url: env.AUTH_LDAP_URI,\n    });\n    client.bind(username, password, (error, res) => {\n      if (error) {\n        reject('Invalid username or password');\n      } else {\n        resolve(client);\n      }\n    });\n  });\n\nconst ldapSearch = async <\n  Attributes extends AttributeConstraint,\n  ArrayAttributes extends Attributes = never,\n>(\n  client: ldap.Client,\n  base: string,\n  options: InferrableSearchOptions<Attributes, ArrayAttributes>\n) =>\n  new Promise<SearchResult<Attributes, ArrayAttributes>[]>((resolve, reject) => {\n    client.search(base, options as ldap.SearchOptions, (err, res) => {\n      const results: SearchResult<Attributes, ArrayAttributes>[] = [];\n      res.on('error', (err) => {\n        reject('error: ' + err.message);\n      });\n      res.on('searchEntry', (entry) => {\n        let userDn;\n        try {\n          //dn is the only attribute returned with special characters formatted in UTF-8 (Bad for any letters with an accent)\n          //Regex replaces any backslash followed by 2 hex characters with a percentage unless said backslash is preceded by another backslash.\n          //That can then be processed by decodeURIComponent which will turn back characters to normal.\n          userDn = decodeURIComponent(\n            entry.pojo.objectName.replace(/(?<!\\\\)\\\\([0-9a-fA-F]{2})/g, '%$1')\n          )\n        } catch { reject(new Error ('Cannot resolve distinguishedName for the user')) }\n        results.push(\n          entry.pojo.attributes.reduce<Record<string, string | string[]>>(\n            (obj, attr) => {\n              // just take first element assuming there's only one (uid, mail), unless in arrayAttributes\n              obj[attr.type] = options.arrayAttributes?.includes(attr.type)\n                ? attr.values\n                : attr.values[0];\n              return obj;\n            },\n            {\n              // Assume userDn since there's a reject if not set\n              dn: userDn!,\n            }\n          ) as SearchResult<Attributes, ArrayAttributes>\n        );\n      });\n      res.on('end', (result) => {\n        if (result?.status != 0) {\n          reject(new Error('ldap search status is not 0, search failed'));\n        } else {\n          resolve(results);\n        }\n      });\n    });\n  });\n\nexport default Credentials({\n  id: 'ldap',\n  name: 'LDAP',\n  credentials: {\n    name: { label: 'uid', type: 'text' },\n    password: { label: 'Password', type: 'password' },\n  },\n  async authorize(credentials) {\n    try {\n      const data = await signInSchema.parseAsync(credentials);\n\n      Consola.log(`user ${data.name} is trying to log in using LDAP. Connecting to LDAP server...`);\n      const client = await ldapLogin(env.AUTH_LDAP_BIND_DN, env.AUTH_LDAP_BIND_PASSWORD);\n\n      Consola.log(`Connection established. Searching User...`);\n      const ldapUser = (\n        await ldapSearch(client, env.AUTH_LDAP_BASE, {\n          filter: env.AUTH_LDAP_USERNAME_FILTER_EXTRA_ARG\n            ? `(&(${env.AUTH_LDAP_USERNAME_ATTRIBUTE}=${data.name})${env.AUTH_LDAP_USERNAME_FILTER_EXTRA_ARG})`\n            : `(${env.AUTH_LDAP_USERNAME_ATTRIBUTE}=${data.name})`,\n          scope: env.AUTH_LDAP_SEARCH_SCOPE,\n          // as const for inference\n          attributes: [\n            env.AUTH_LDAP_USERNAME_ATTRIBUTE,\n            env.AUTH_LDAP_USER_MAIL_ATTRIBUTE,\n          ] as const,\n        })\n      )[0];\n\n      if (!ldapUser) throw new Error('User not found in LDAP');\n\n      try {\n        z.string().email().parse(ldapUser[env.AUTH_LDAP_USER_MAIL_ATTRIBUTE]);\n      } catch {\n        throw new Error(\n          `User found but with invalid or non-existing Email. Not Supported: \"${\n            ldapUser[env.AUTH_LDAP_USER_MAIL_ATTRIBUTE] ?? ' '\n          }\"`\n        );\n      }\n\n      Consola.log(`User found. Logging in...`);\n      await ldapLogin(ldapUser.dn, data.password).then((client) => client.destroy());\n\n      Consola.log(`User logged in. Retrieving groups...`);\n      const userGroups = (\n        await ldapSearch(client, env.AUTH_LDAP_BASE, {\n          filter: `(&(objectClass=${env.AUTH_LDAP_GROUP_CLASS})(${\n            env.AUTH_LDAP_GROUP_MEMBER_ATTRIBUTE\n          }=${ldapUser[env.AUTH_LDAP_GROUP_MEMBER_USER_ATTRIBUTE as 'dn' | 'uid']})${\n            env.AUTH_LDAP_GROUP_FILTER_EXTRA_ARG ?? ''\n          })`,\n          scope: env.AUTH_LDAP_SEARCH_SCOPE,\n          // as const for inference\n          attributes: 'cn',\n        })\n      ).map((group) => group.cn);\n\n      client.destroy();\n\n      Consola.log(`user ${data.name} successfully authorized`);\n\n      let user = await adapter.getUserByEmail!(ldapUser[env.AUTH_LDAP_USER_MAIL_ATTRIBUTE]);\n      const isOwner = userGroups.includes(env.AUTH_LDAP_OWNER_GROUP);\n      const isAdmin = isOwner || userGroups.includes(env.AUTH_LDAP_ADMIN_GROUP);\n\n      if (!user) {\n        // CreateUser will create settings in event\n        user = adapter.createUser({\n          name: ldapUser[env.AUTH_LDAP_USERNAME_ATTRIBUTE],\n          email: ldapUser[env.AUTH_LDAP_USER_MAIL_ATTRIBUTE],\n          emailVerified: new Date(), // assume ldap email is verified\n          isAdmin: isAdmin,\n          isOwner: isOwner,\n        });\n        // For some reason adapter.createUser doesn't call createUser event, needs to be called manually to create usersettings\n        await onCreateUser({ user });\n      } else if (user.isAdmin != isAdmin || user.isOwner != isOwner) {\n        // Update roles if changed in LDAP\n        Consola.log(`updating roles of user ${user.name}`);\n        adapter.updateUser({\n          ...user,\n          isAdmin,\n          isOwner,\n        });\n      }\n\n      return {\n        id: user?.id || ldapUser.dn,\n        name: user?.name || ldapUser[env.AUTH_LDAP_USERNAME_ATTRIBUTE],\n        isAdmin: isAdmin,\n        isOwner: isOwner,\n      };\n    } catch (error) {\n      Consola.error(error);\n      return null;\n    }\n  },\n});\n"
  },
  {
    "path": "src/utils/auth/oidc-redirect.spec.ts",
    "content": "import { describe, expect, test } from 'vitest';\n\nimport { createRedirectUri } from './oidc';\n\ndescribe('redirect', () => {\n  test('Callback should return http url when not defining protocol', async () => {\n    // Arrange\n    const headers = {\n      'x-forwarded-host': 'localhost:3000',\n    };\n\n    // Act\n    const result = await createRedirectUri(headers, '/api/auth/callback/oidc');\n\n    // Assert\n    expect(result).toBe('http://localhost:3000/api/auth/callback/oidc');\n  });\n\n  test('Callback should return https url when defining protocol', async () => {\n    // Arrange\n    const headers = {\n      'x-forwarded-proto': 'https',\n      'x-forwarded-host': 'localhost:3000',\n    };\n\n    // Act\n    const result = await createRedirectUri(headers, '/api/auth/callback/oidc');\n\n    // Assert\n    expect(result).toBe('https://localhost:3000/api/auth/callback/oidc');\n  });\n\n  test('Callback should return https url when defining protocol and host', async () => {\n    // Arrange\n    const headers = {\n      'x-forwarded-proto': 'https',\n      host: 'something.else',\n    };\n\n    // Act\n    const result = await createRedirectUri(headers, '/api/auth/callback/oidc');\n\n    // Assert\n    expect(result).toBe('https://something.else/api/auth/callback/oidc');\n  });\n\n  test('Callback should return https url when defining protocol as http,https and host', async () => {\n    // Arrange\n    const headers = {\n      'x-forwarded-proto': 'http,https',\n      'x-forwarded-host': 'hello.world',\n    };\n\n    // Act\n    const result = await createRedirectUri(headers, '/api/auth/callback/oidc');\n\n    // Assert\n    expect(result).toBe('https://hello.world/api/auth/callback/oidc');\n  });\n});\n"
  },
  {
    "path": "src/utils/auth/oidc.ts",
    "content": "import Consola from 'consola';\nimport { OAuthConfig } from 'next-auth/providers/oauth';\nimport { env } from '~/env';\n\nimport adapter from './adapter';\n\ntype Profile = {\n  sub: string;\n  name: string;\n  email: string;\n  groups: string[];\n  preferred_username: string;\n  email_verified: boolean;\n};\n\nexport type OidcRedirectCallbackHeaders = {\n  'x-forwarded-proto'?: string;\n  'x-forwarded-host'?: string;\n  host?: string;\n};\n\n// The redirect_uri is constructed to work behind a reverse proxy. It is constructed from the headers x-forwarded-proto and x-forwarded-host.\nexport const createRedirectUri = (headers: OidcRedirectCallbackHeaders, pathname: string) => {\n  let protocol = headers['x-forwarded-proto'] ?? 'http';\n\n  // @see https://support.glitch.com/t/x-forwarded-proto-contains-multiple-protocols/17219\n  if (protocol.includes(',')) {\n    protocol = protocol.includes('https') ? 'https' : 'http';\n  }\n\n  const path = pathname.startsWith('/') ? pathname : `/${pathname}`;\n\n  const host = headers['x-forwarded-host'] ?? headers.host;\n\n\n  return `${protocol}://${host}${path}`;\n};\n\nconst createProvider = (headers: OidcRedirectCallbackHeaders): OAuthConfig<Profile> => ({\n  id: 'oidc',\n  name: env.AUTH_OIDC_CLIENT_NAME,\n  type: 'oauth',\n  clientId: env.AUTH_OIDC_CLIENT_ID,\n  clientSecret: env.AUTH_OIDC_CLIENT_SECRET,\n  wellKnown: `${env.AUTH_OIDC_URI}/.well-known/openid-configuration`,\n  authorization: {\n    params: {\n      scope: env.AUTH_OIDC_SCOPE_OVERWRITE,\n      redirect_uri: createRedirectUri(headers, '/api/auth/callback/oidc'),\n    },\n  },\n  idToken: true,\n  httpOptions: {\n    timeout: env.AUTH_OIDC_TIMEOUT,\n  },\n  async profile(profile) {\n    const user = await adapter.getUserByEmail!(profile.email);\n\n    if (profile.groups == undefined) {\n      Consola.warn('no groups found in profile of oidc user');\n    }\n\n    const isAdmin = profile.groups?.includes(env.AUTH_OIDC_ADMIN_GROUP);\n    const isOwner = profile.groups?.includes(env.AUTH_OIDC_OWNER_GROUP);\n\n    // check for role update\n    if (user && (user.isAdmin != isAdmin || user.isOwner != isOwner)) {\n      Consola.log(`updating roles of user ${user.name}`);\n      adapter.updateUser({\n        ...user,\n        isAdmin,\n        isOwner,\n      });\n    }\n\n    return {\n      id: profile.sub,\n      name: profile.preferred_username,\n      email: profile.email,\n      isAdmin,\n      isOwner,\n    };\n  },\n});\n\nexport default createProvider;\n"
  },
  {
    "path": "src/utils/empty-provider.ts",
    "content": "import { OAuthConfig } from 'next-auth/providers';\n\nexport default function EmptyNextAuthProvider(): OAuthConfig<any> {\n  return {\n    id: 'empty',\n    name: 'Empty',\n    type: 'oauth',\n    profile: () => {\n      throw new Error(\n        'EmptyNextAuthProvider can not be used and is only a placeholder because credentials authentication can not be used as session authentication without additional providers.'\n      );\n    },\n  };\n}\n"
  },
  {
    "path": "src/utils/i18n-zod-resolver.ts",
    "content": "import { zodResolver } from '@mantine/form';\nimport { TFunction } from 'i18next';\nimport { useTranslation } from 'next-i18next';\nimport { ErrorMapCtx, z, ZodIssueCode, ZodSchema, ZodTooBigIssue, ZodTooSmallIssue } from 'zod';\n\nexport const useI18nZodResolver = () => {\n  const { t } = useTranslation('zod');\n  return {\n    i18nZodResolver: i18nZodResolver(t),\n  };\n};\n\nconst i18nZodResolver =\n  (t: TFunction<'zod', undefined, 'zod'>) =>\n  <TSchema extends ZodSchema<Record<string, any>>>(schema: TSchema) => {\n    z.setErrorMap(zodErrorMap(t));\n    return zodResolver(schema);\n  };\n\nconst handleStringError = (issue: z.ZodInvalidStringIssue, ctx: ErrorMapCtx) => {\n  if (typeof issue.validation === 'object') {\n    if ('startsWith' in issue.validation) {\n      return {\n        key: 'errors.string.startsWith',\n        params: {\n          startsWith: issue.validation.startsWith,\n        },\n      };\n    } else if ('endsWith' in issue.validation) {\n      return {\n        key: 'errors.string.endsWith',\n        params: {\n          endsWith: issue.validation.endsWith,\n        },\n      };\n    }\n\n    return {\n      key: 'errors.invalid_string.includes',\n      params: {\n        includes: issue.validation.includes,\n      },\n    };\n  }\n\n  return {\n    message: issue.message,\n  };\n};\n\nconst handleTooSmallError = (issue: ZodTooSmallIssue, ctx: ErrorMapCtx) => {\n  if (issue.type !== 'string' && issue.type !== 'number') {\n    return {\n      message: issue.message,\n    };\n  }\n\n  return {\n    key: `errors.tooSmall.${issue.type}`,\n    params: {\n      minimum: issue.minimum,\n      count: issue.minimum,\n    },\n  };\n};\n\nconst handleTooBigError = (issue: ZodTooBigIssue, ctx: ErrorMapCtx) => {\n  if (issue.type !== 'string' && issue.type !== 'number') {\n    return {\n      message: issue.message,\n    };\n  }\n\n  return {\n    key: `errors.tooBig.${issue.type}`,\n    params: {\n      maximum: issue.maximum,\n      count: issue.maximum,\n    },\n  };\n};\n\nconst handleZodError = (issue: z.ZodIssueOptionalMessage, ctx: ErrorMapCtx) => {\n  if (ctx.defaultError === 'Required') {\n    return {\n      key: 'errors.required',\n      params: {},\n    };\n  }\n  if (issue.code === ZodIssueCode.invalid_string) {\n    return handleStringError(issue, ctx);\n  }\n  if (issue.code === ZodIssueCode.too_small) {\n    return handleTooSmallError(issue, ctx);\n  }\n  if (issue.code === ZodIssueCode.too_big) {\n    return handleTooBigError(issue, ctx);\n  }\n  if (issue.code === ZodIssueCode.custom && issue.params?.i18n) {\n    return {\n      key: `errors.custom.${issue.params.i18n.key}`,\n    };\n  }\n\n  return {\n    message: issue.message,\n  };\n};\n\nfunction zodErrorMap(t: TFunction<'zod', undefined, 'zod'>) {\n  return (issue: z.ZodIssueOptionalMessage, ctx: ErrorMapCtx) => {\n    const error = handleZodError(issue, ctx);\n    if ('message' in error && error.message)\n      return {\n        message: error.message ?? ctx.defaultError,\n      };\n    return {\n      message: t(error.key ?? 'errors.default', error.params ?? {}),\n    };\n  };\n}\n\nexport type CustomErrorParams = {\n  i18n: {\n    key: string;\n    params?: Record<string, any>;\n  };\n};\n"
  },
  {
    "path": "src/utils/security.ts",
    "content": "import bcrypt from 'bcryptjs';\nimport { ReactNode } from 'react';\n\nexport const hashPassword = (password: string, salt: string) => {\n  return bcrypt.hashSync(password, salt);\n};\n\ninterface ConditionalWrapperProps {\n  condition: boolean;\n  wrapper: (children: ReactNode) => JSX.Element;\n  children: ReactNode;\n}\n\nexport const ConditionalWrapper: React.FC<ConditionalWrapperProps> = ({ condition, wrapper, children }) =>\n  condition ? wrapper(children) : children;"
  },
  {
    "path": "src/utils/session.ts",
    "content": "import { randomUUID } from 'crypto';\n\nexport const fromDate = (seconds: number, date = Date.now()) => {\n  return new Date(date + seconds * 1000);\n};\n\n// Helper functions to generate unique keys and calculate the expiry dates for session cookies\nexport const generateSessionToken = () => {\n  return randomUUID();\n};\n"
  },
  {
    "path": "src/validations/boards.ts",
    "content": "import { DEFAULT_THEME, MANTINE_COLORS, MantineColor } from '@mantine/core';\nimport { z } from 'zod';\nimport {\n  BackgroundImageAttachment,\n  BackgroundImageRepeat,\n  BackgroundImageSize,\n} from '~/types/settings';\n\nexport const configNameSchema = z\n  .string()\n  .regex(/^[a-zA-Z0-9-_\\s()]+$/)\n  .min(1);\n\nexport const createBoardSchemaValidation = z.object({\n  name: configNameSchema,\n});\n\nexport const boardCustomizationSchema = z.object({\n  access: z.object({\n    allowGuests: z.boolean(),\n  }),\n  layout: z.object({\n    leftSidebarEnabled: z.boolean(),\n    rightSidebarEnabled: z.boolean(),\n    pingsEnabled: z.boolean(),\n  }),\n  gridstack: z.object({\n    sm: z.number().min(1).max(8),\n    md: z.number().min(3).max(16),\n    lg: z.number().min(5).max(20),\n  }),\n  pageMetadata: z.object({\n    pageTitle: z.string(),\n    metaTitle: z.string(),\n    logoSrc: z.string(),\n    faviconSrc: z.string(),\n  }),\n  appearance: z.object({\n    backgroundSrc: z.string(),\n    backgroundImageAttachment: z.enum(BackgroundImageAttachment),\n    backgroundImageSize: z.enum(BackgroundImageSize),\n    backgroundImageRepeat: z.enum(BackgroundImageRepeat),\n    primaryColor: z.custom<MantineColor>(\n      (value) => typeof value === 'string' && MANTINE_COLORS.includes(value)\n    ),\n    secondaryColor: z.custom<MantineColor>(\n      (value) => typeof value === 'string' && MANTINE_COLORS.includes(value)\n    ),\n    shade: z\n      .number()\n      .min(0)\n      .max(DEFAULT_THEME.colors['blue'].length - 1),\n    opacity: z.number().min(10).max(100),\n    customCss: z.string(),\n  }),\n});\n"
  },
  {
    "path": "src/validations/invite.ts",
    "content": "import dayjs from 'dayjs';\nimport { z } from 'zod';\n\nexport const createInviteSchema = z.object({\n  expiration: z\n    .date()\n    .min(dayjs().add(5, 'minutes').toDate())\n    .max(dayjs().add(6, 'months').toDate()),\n});\n"
  },
  {
    "path": "src/validations/user.ts",
    "content": "import { z } from 'zod';\nimport { CustomErrorParams } from '~/utils/i18n-zod-resolver';\n\nexport const minPasswordLength = 8;\n\nexport const passwordSchema = z\n  .string()\n  .min(minPasswordLength)\n  .max(100)\n  .refine((value) => /[0-9]/.test(value))\n  .refine((value) => /[a-z]/.test(value))\n  .refine((value) => /[A-Z]/.test(value))\n  .refine((value) => /[$&+,:;=?@#|'<>.^*()%!-]/.test(value));\n\nexport const signInSchema = z.object({\n  name: z.string(),\n  password: z.string(),\n});\n\nexport const signUpFormSchema = z\n  .object({\n    username: z.string().min(3),\n    password: passwordSchema,\n    passwordConfirmation: z.string().min(minPasswordLength),\n  })\n  .refine((data) => data.password === data.passwordConfirmation, {\n    params: {\n      i18n: { key: 'passwordMatch' },\n    } satisfies CustomErrorParams,\n    path: ['passwordConfirmation'],\n  });\n\nexport const createNewUserSchema = z.object({\n  username: z.string(),\n  email: z.string().email().optional(),\n  password: passwordSchema,\n});\n\nexport const colorSchemeParser = z\n  .enum(['light', 'dark', 'environment'])\n  .default('environment')\n  .catch('environment');\n\nexport const updateSettingsValidationSchema = z.object({\n  defaultBoard: z.string(),\n  language: z.string(),\n  firstDayOfWeek: z.enum(['monday', 'saturday', 'sunday']),\n  disablePingPulse: z.boolean(),\n  replaceDotsWithIcons: z.boolean(),\n  searchTemplate: z.string().nonempty().max(256),\n  openSearchInNewTab: z.boolean(),\n  autoFocusSearch: z.boolean(),\n});\n"
  },
  {
    "path": "src/widgets/WidgetWrapper.tsx",
    "content": "import { ComponentType } from 'react';\nimport { HomarrCardWrapper } from '~/components/Dashboard/Tiles/HomarrCardWrapper';\nimport { WidgetsMenu } from '~/components/Dashboard/Tiles/Widgets/WidgetsMenu';\n\nimport Widgets from '.';\nimport ErrorBoundary from './boundary';\nimport { IWidget } from './widgets';\n\ninterface WidgetWrapperProps {\n  widgetType: string;\n  widget: IWidget<string, any>;\n  className: string;\n  WidgetComponent: ComponentType<{ widget: IWidget<string, any> }>;\n}\n\n// If a property has no value, set it to the default value\nconst useWidget = <T extends IWidget<string, any>>(widget: T): T => {\n  const definition = Widgets[widget.type as keyof typeof Widgets];\n\n  const newProps = { ...widget.properties };\n\n  Object.entries(definition.options).forEach(([key, option]) => {\n    if (newProps[key] == null) {\n      newProps[key] = option.defaultValue;\n    }\n  });\n\n  return {\n    ...widget,\n    properties: newProps,\n  };\n};\n\nexport const WidgetWrapper = ({\n  widgetType,\n  widget,\n  className,\n  WidgetComponent,\n}: WidgetWrapperProps) => {\n  const widgetWithDefaultProps = useWidget(widget);\n\n  return (\n    <ErrorBoundary integration={widgetType} widget={widgetWithDefaultProps}>\n      <HomarrCardWrapper className={className}>\n        <WidgetsMenu integration={widgetType} widget={widgetWithDefaultProps} />\n        <WidgetComponent widget={widgetWithDefaultProps} />\n      </HomarrCardWrapper>\n    </ErrorBoundary>\n  );\n};\n"
  },
  {
    "path": "src/widgets/bookmark/BookmarkWidgetTile.tsx",
    "content": "import {\n  Alert,\n  Box,\n  Button,\n  Card,\n  Divider,\n  Flex,\n  Group,\n  Image,\n  ScrollArea,\n  Stack,\n  Switch,\n  Text,\n  TextInput,\n  Title,\n  createStyles,\n  useMantineTheme,\n} from '@mantine/core';\nimport { useForm } from '@mantine/form';\nimport {\n  IconAlertTriangle,\n  IconBookmark,\n  IconLink,\n  IconPlaylistX,\n  IconTrash,\n  IconTypography,\n} from '@tabler/icons-react';\nimport { useTranslation } from 'next-i18next';\nimport { useEffect } from 'react';\nimport React from 'react';\nimport { v4 } from 'uuid';\nimport { z } from 'zod';\nimport { useEditModeStore } from '~/components/Dashboard/Views/useEditModeStore';\nimport { IconSelector } from '~/components/IconSelector/IconSelector';\n\nimport { defineWidget } from '../helper';\nimport { IDraggableEditableListInputValue, IWidget } from '../widgets';\n\ninterface BookmarkItem {\n  id: string;\n  name: string;\n  href: string;\n  iconUrl: string;\n  openNewTab: boolean;\n  hideHostname: boolean;\n  hideIcon: boolean;\n}\n\nconst definition = defineWidget({\n  id: 'bookmark',\n  icon: IconBookmark,\n  options: {\n    name: {\n      type: 'text',\n      defaultValue: '',\n      info: true,\n      infoLink: 'https://homarr.dev/docs/widgets/bookmarks/',\n    },\n    items: {\n      type: 'draggable-editable-list',\n      defaultValue: [],\n      getLabel(data) {\n        return data.name;\n      },\n      create() {\n        return {\n          id: v4(),\n          name: 'Homarr Documentation',\n          href: 'https://homarr.dev',\n          iconUrl: '/imgs/logo/logo.png',\n          openNewTab: false,\n          hideHostname: false,\n          hideIcon: false,\n        };\n      },\n      itemComponent({ data, onChange, delete: deleteData }) {\n        const { t } = useTranslation('modules/bookmark');\n        const form = useForm({\n          initialValues: data,\n          validate: {\n            name: (value) => {\n              const validation = z.string().min(1).max(100).safeParse(value);\n              if (validation.success) {\n                return undefined;\n              }\n\n              return t('item.validation.length', { shortest: '1', longest: '100' });\n            },\n            href: (value) => {\n              if (!z.string().min(1).max(8192).safeParse(value).success) {\n                return t('item.validation.length', { shortest: '1', longest: '200' });\n              }\n\n              if (!z.string().url().safeParse(value).success) {\n                return t('item.validation.invalidLink');\n              }\n\n              return undefined;\n            },\n            iconUrl: (value) => {\n              if (z.string().min(1).max(400).safeParse(value).success) {\n                return undefined;\n              }\n\n              return t('item.validation.length', { shortest: '1', longest: '400' });\n            },\n          },\n          validateInputOnChange: true,\n          validateInputOnBlur: true,\n        });\n\n        useEffect(() => {\n          if (!form.isValid()) {\n            return;\n          }\n\n          onChange({ ...form.values, openNewTab: form.values.openNewTab });\n        }, [form.values]);\n\n        return (\n          <form>\n            <Stack>\n              <TextInput\n                icon={<IconTypography size=\"1rem\" />}\n                {...form.getInputProps('name')}\n                label={t('item.name')}\n                withAsterisk\n              />\n              <TextInput\n                icon={<IconLink size=\"1rem\" />}\n                {...form.getInputProps('href')}\n                label={t('item.url')}\n                withAsterisk\n              />\n              <IconSelector\n                defaultValue={data.iconUrl}\n                value={form.values.iconUrl}\n                onChange={(value) => {\n                  form.setFieldValue('iconUrl', value ?? '');\n                }}\n              />\n              <Switch\n                {...form.getInputProps('openNewTab')}\n                label={t('item.newTab')}\n                checked={form.values.openNewTab}\n              />\n              <Switch\n                {...form.getInputProps('hideHostname')}\n                label={t('item.hideHostname')}\n                checked={form.values.hideHostname}\n              />\n              <Switch\n                {...form.getInputProps('hideIcon')}\n                label={t('item.hideIcon')}\n                checked={form.values.hideIcon}\n              />\n              <Button\n                onClick={() => deleteData()}\n                leftIcon={<IconTrash size=\"1rem\" />}\n                variant=\"light\"\n                type=\"button\"\n              >\n                {t('item.delete')}\n              </Button>\n              {!form.isValid() && (\n                <Alert color=\"red\" icon={<IconAlertTriangle size=\"1rem\" />}>\n                  {t('item.validation.errorMsg')}\n                </Alert>\n              )}\n            </Stack>\n          </form>\n        );\n      },\n    } satisfies IDraggableEditableListInputValue<BookmarkItem>,\n    layout: {\n      type: 'select',\n      data: [{ value: 'autoGrid' }, { value: 'horizontal' }, { value: 'vertical' }],\n      defaultValue: 'autoGrid',\n    },\n  },\n  gridstack: {\n    minWidth: 1,\n    minHeight: 1,\n    maxWidth: 24,\n    maxHeight: 24,\n  },\n  component: BookmarkWidgetTile,\n});\n\nexport type IBookmarkWidget = IWidget<(typeof definition)['id'], typeof definition>;\n\ninterface BookmarkWidgetTileProps {\n  widget: IBookmarkWidget;\n}\n\nfunction BookmarkWidgetTile({ widget }: BookmarkWidgetTileProps) {\n  const { classes } = useStyles();\n  const { enabled: isEditModeEnabled } = useEditModeStore();\n  const { fn, colors, colorScheme } = useMantineTheme();\n  const { t } = useTranslation('modules/bookmark');\n\n  if (widget.properties.items.length === 0) {\n    return (\n      <Stack align=\"center\">\n        <IconPlaylistX />\n        <Stack spacing={0}>\n          <Title order={5} align=\"center\">\n            {t('card.noneFound.title')}\n          </Title>\n          <Text align=\"center\" size=\"sm\">\n            {t('card.noneFound.text')}\n          </Text>\n        </Stack>\n      </Stack>\n    );\n  }\n\n  switch (widget.properties.layout) {\n    case 'autoGrid':\n      return (\n        <Stack h=\"100%\" spacing={0}>\n          <Title size=\"h4\" px=\"0.25rem\">\n            {widget.properties.name}\n          </Title>\n          <Box\n            className={classes.grid}\n            mr={isEditModeEnabled && widget.properties.name === '' ? 'xl' : undefined}\n            h=\"100%\"\n          >\n            {widget.properties.items.map((item: BookmarkItem, index) => (\n              <Card\n                className={classes.autoGridItem}\n                key={index}\n                px=\"xl\"\n                radius=\"md\"\n                component=\"a\"\n                href={item.href}\n                target={item.openNewTab ? '_blank' : undefined}\n                withBorder\n                bg={\n                  colorScheme === 'dark' ? colors.dark[5].concat('80') : colors.blue[0].concat('80')\n                }\n                sx={{\n                  '&:hover': { backgroundColor: fn.primaryColor().concat('40') }, //'40' = 25% opacity\n                  flex: '1 1 auto',\n                }}\n                display=\"flex\"\n              >\n                <BookmarkItemContent item={item} />\n              </Card>\n            ))}\n          </Box>\n        </Stack>\n      );\n    case 'horizontal':\n    case 'vertical':\n      const flexDirection = widget.properties.layout === 'vertical' ? 'column' : 'row';\n      return (\n        <Stack h=\"100%\" spacing={0}>\n          <Title size=\"h4\" px=\"0.25rem\">\n            {widget.properties.name}\n          </Title>\n          <ScrollArea\n            scrollbarSize={8}\n            type=\"auto\"\n            h=\"100%\"\n            offsetScrollbars\n            mr={isEditModeEnabled && widget.properties.name === '' ? 'xl' : undefined}\n            styles={{\n              viewport: {\n                //mantine being mantine again... this might break. Needed for taking 100% of widget space\n                '& div[style=\"min-width: 100%; display: table;\"]': {\n                  display: 'flex !important',\n                  height: '100%',\n                },\n              },\n            }}\n          >\n            <Flex direction={flexDirection} gap=\"0\" h=\"100%\" w=\"100%\">\n              {widget.properties.items.map((item: BookmarkItem, index) => (\n                <div\n                  key={index}\n                  style={{ display: 'flex', flex: '1', flexDirection: flexDirection }}\n                >\n                  <Divider\n                    m=\"3px\"\n                    orientation={\n                      widget.properties.layout !== 'vertical' ? 'vertical' : 'horizontal'\n                    }\n                    color={index === 0 ? 'transparent' : undefined}\n                  />\n                  <Card\n                    px=\"md\"\n                    py=\"1px\"\n                    component=\"a\"\n                    href={item.href}\n                    target={item.openNewTab ? '_blank' : undefined}\n                    radius=\"md\"\n                    bg=\"transparent\"\n                    sx={{\n                      '&:hover': { backgroundColor: fn.primaryColor().concat('40') }, //'40' = 25% opacity\n                      flex: '1 1 auto',\n                      overflow: 'unset',\n                    }}\n                    display=\"flex\"\n                  >\n                    <BookmarkItemContent item={item} />\n                  </Card>\n                </div>\n              ))}\n            </Flex>\n          </ScrollArea>\n        </Stack>\n      );\n    default:\n      return null;\n  }\n}\n\nconst BookmarkItemContent = ({ item }: { item: BookmarkItem }) => {\n  const { colorScheme } = useMantineTheme();\n  return (\n    <Group spacing=\"0rem 1rem\">\n      <Image\n        hidden={item.hideIcon}\n        src={item.iconUrl}\n        width={47}\n        height={47}\n        fit=\"contain\"\n        withPlaceholder\n      />\n      <Stack spacing={0}>\n        <Text size=\"md\">{item.name}</Text>\n        <Text\n          color={colorScheme === 'dark' ? 'gray.6' : 'gray.7'}\n          size=\"sm\"\n          hidden={item.hideHostname}\n        >\n          {new URL(item.href).hostname}\n        </Text>\n      </Stack>\n    </Group>\n  );\n};\n\nconst useStyles = createStyles(() => ({\n  grid: {\n    display: 'grid',\n    gap: 10,\n    gridTemplateColumns: 'repeat(auto-fit, minmax(150px, 1fr))',\n  },\n  autoGridItem: {\n    flex: '1 1 auto',\n  },\n}));\n\nexport default definition;\n"
  },
  {
    "path": "src/widgets/boundary.tsx",
    "content": "import { Button, Card, Center, Code, Group, ScrollArea, Stack, Text, Title } from '@mantine/core';\nimport { openModal } from '@mantine/modals';\nimport { IconBrandGithub, IconBug, IconInfoCircle, IconRefresh } from '@tabler/icons-react';\nimport Consola from 'consola';\nimport { withTranslation } from 'next-i18next';\nimport React, { ReactNode } from 'react';\nimport { WidgetsMenu } from '~/components/Dashboard/Tiles/Widgets/WidgetsMenu';\n\nimport { IWidget } from './widgets';\n\ntype ErrorBoundaryState = {\n  hasError: boolean;\n  error: Error | undefined;\n};\n\ntype ErrorBoundaryProps = {\n  t: (key: string) => string;\n  children: ReactNode;\n  integration: string;\n  widget: IWidget<string, any>;\n};\n\n/**\n * A custom error boundary, that catches errors within widgets and renders an error component.\n * The error component can be refreshed and shows a modal with error details\n */\nclass ErrorBoundary extends React.Component<ErrorBoundaryProps, ErrorBoundaryState> {\n  constructor(props: any) {\n    super(props);\n\n    // Define a state variable to track whether is an error or not\n    this.state = { hasError: false, error: undefined };\n  }\n\n  static getDerivedStateFromError(error: Error) {\n    // Update state so the next render will show the fallback UI\n    return { hasError: true, error };\n  }\n\n  componentDidCatch(error: Error, errorInfo: any) {\n    Consola.error(`Error while rendering widget, ${error}: ${errorInfo}`);\n  }\n\n  render() {\n    // Check if the error is thrown\n    if (this.state.hasError) {\n      return (\n        <Card\n          m={10}\n          sx={(theme) => ({\n            backgroundColor: theme.colors.red[5],\n          })}\n          radius=\"lg\"\n          shadow=\"sm\"\n          withBorder\n          h=\"calc(100% - 20px)\"\n        >\n          <WidgetsMenu integration={this.props.integration} widget={this.props.widget} />\n          <ScrollArea h=\"100%\" type=\"auto\" offsetScrollbars>\n            <Center>\n              <Stack align=\"center\" spacing=\"xs\">\n                <IconBug color=\"white\" />\n                <Stack spacing={0} align=\"center\">\n                  <Title order={5} color=\"white\" align=\"center\">\n                    {this.props.t('card.title')}\n                  </Title>\n                  {this.state.error && (\n                    <Text color=\"white\" align=\"center\" size=\"sm\">\n                      {this.state.error.toString()}\n                    </Text>\n                  )}\n                </Stack>\n                <Group spacing=\"xs\">\n                  <Button\n                    onClick={() =>\n                      openModal({\n                        title: 'Your widget had an error',\n                        children: (\n                          <>\n                            <Text size=\"sm\" mb=\"sm\">\n                              {this.props.t('modal.text')}\n                            </Text>\n                            {this.state.error && (\n                              <>\n                                <Text weight=\"bold\" size=\"sm\">\n                                  {this.props.t('modal.label')}\n                                </Text>\n                                <Code block>{this.state.error.toString()}</Code>\n                              </>\n                            )}\n                            <Button\n                              sx={(theme) => ({\n                                backgroundColor: theme.colors.gray[8],\n                                '&:hover': {\n                                  backgroundColor: theme.colors.gray[9],\n                                },\n                              })}\n                              leftIcon={<IconBrandGithub />}\n                              component=\"a\"\n                              href=\"https://github.com/ajnart/homarr/issues/new?assignees=&labels=%F0%9F%90%9B+Bug&template=bug.yml&title=New%20bug\"\n                              target=\"_blank\"\n                              mt=\"md\"\n                              fullWidth\n                            >\n                              {this.props.t('modal.reportButton')}\n                            </Button>\n                          </>\n                        ),\n                      })\n                    }\n                    leftIcon={<IconInfoCircle size={16} />}\n                    variant=\"light\"\n                  >\n                    {this.props.t('card.buttons.details')}\n                  </Button>\n                  <Button\n                    onClick={() => this.setState({ hasError: false })}\n                    leftIcon={<IconRefresh size={16} />}\n                    variant=\"light\"\n                  >\n                    {this.props.t('card.buttons.tryAgain')}\n                  </Button>\n                </Group>\n              </Stack>\n            </Center>\n          </ScrollArea>\n        </Card>\n      );\n    }\n\n    // Return children components in case of no error\n    return this.props.children;\n  }\n}\n\nexport default withTranslation('widgets/error-boundary')(ErrorBoundary);\n"
  },
  {
    "path": "src/widgets/calendar/CalendarDay.tsx",
    "content": "import {\n  Button,\n  Container,\n  Indicator,\n  IndicatorProps,\n  Popover,\n  useMantineTheme,\n} from '@mantine/core';\nimport { useDisclosure } from '@mantine/hooks';\n\nimport { MediaList } from './MediaList';\nimport { MediasType } from './type';\n\ninterface CalendarDayProps {\n  date: Date;\n  medias: MediasType;\n  size: string;\n}\n\nexport const CalendarDay = ({ date, medias, size }: CalendarDayProps) => {\n  const [opened, { close, open }] = useDisclosure(false);\n  const { radius, fn } = useMantineTheme();\n  var indicatorSize = 10;\n  var indicatorOffset = -4;\n  switch (size) {\n    case 'xs': {\n      indicatorSize += 0;\n      indicatorOffset -= 0;\n      break;\n    }\n    case 'sm': {\n      indicatorSize += 1;\n      indicatorOffset -= 1;\n      break;\n    }\n    case 'md': {\n      indicatorSize += 2;\n      indicatorOffset -= 1;\n      break;\n    }\n    case 'lg': {\n      indicatorSize += 3;\n      indicatorOffset -= 2;\n      break;\n    }\n    case 'xl': {\n      indicatorSize += 4;\n      indicatorOffset -= 3;\n      break;\n    }\n  }\n\n  return (\n    <Popover\n      position=\"bottom\"\n      withArrow\n      withinPortal\n      radius=\"lg\"\n      shadow=\"sm\"\n      transitionProps={{\n        transition: 'pop',\n      }}\n      onClose={close}\n      opened={opened}\n    >\n      <Popover.Target>\n        <Container\n          onClick={medias.totalCount > 0 && !opened ? open : close}\n          h=\"100%\"\n          w=\"100%\"\n          sx={{\n            padding: '18% !important',\n            borderRadius: ['xs', 'sm'].includes(size) ? radius.md : radius.lg,\n            borderStyle: 'solid',\n            borderWidth: '0.2rem',\n            borderColor: opened ? fn.primaryColor() : 'transparent',\n          }}\n        >\n          <DayIndicator\n            size={indicatorSize}\n            offset={indicatorOffset}\n            color=\"red\"\n            position=\"bottom-start\"\n            medias={medias.books}\n          >\n            <DayIndicator\n              size={indicatorSize}\n              offset={indicatorOffset}\n              color=\"yellow\"\n              position=\"top-start\"\n              medias={medias.movies}\n            >\n              <DayIndicator\n                size={indicatorSize}\n                offset={indicatorOffset}\n                color=\"blue\"\n                position=\"top-end\"\n                medias={medias.tvShows}\n              >\n                <DayIndicator\n                  size={indicatorSize}\n                  offset={indicatorOffset}\n                  color=\"green\"\n                  position=\"bottom-end\"\n                  medias={medias.musics}\n                >\n                  <div style={{ textAlign: 'center', whiteSpace: 'nowrap' }}>{date.getDate()}</div>\n                </DayIndicator>\n              </DayIndicator>\n            </DayIndicator>\n          </DayIndicator>\n        </Container>\n      </Popover.Target>\n      <Popover.Dropdown>\n        <MediaList medias={medias} />\n      </Popover.Dropdown>\n    </Popover>\n  );\n};\n\ninterface DayIndicatorProps {\n  size: any;\n  offset: any;\n  color: string;\n  medias: any[];\n  children: JSX.Element;\n  position: IndicatorProps['position'];\n}\n\nconst DayIndicator = ({ size, offset, color, medias, children, position }: DayIndicatorProps) => {\n  if (medias.length === 0) return children;\n\n  return (\n    <Indicator size={size} withBorder offset={offset} color={color} position={position} zIndex={0}>\n      {children}\n    </Indicator>\n  );\n};\n"
  },
  {
    "path": "src/widgets/calendar/CalendarTile.tsx",
    "content": "import { useMantineTheme } from '@mantine/core';\nimport { Calendar } from '@mantine/dates';\nimport { IconCalendarTime } from '@tabler/icons-react';\nimport { useSession } from 'next-auth/react';\nimport { useState } from 'react';\nimport { useEditModeStore } from '~/components/Dashboard/Views/useEditModeStore';\nimport { useConfigContext } from '~/config/provider';\nimport { getLanguageByCode } from '~/tools/language';\nimport { RouterOutputs, api } from '~/utils/api';\n\nimport { defineWidget } from '../helper';\nimport { IWidget } from '../widgets';\nimport { CalendarDay } from './CalendarDay';\nimport { getBgColorByDateAndTheme } from './bg-calculator';\nimport { MediasType } from './type';\n\nconst definition = defineWidget({\n  id: 'calendar',\n  icon: IconCalendarTime,\n  options: {\n    hideWeekDays: {\n      type: 'switch',\n      defaultValue: true,\n    },\n    showUnmonitored: {\n      type: 'switch',\n      defaultValue: false,\n    },\n    radarrReleaseType: {\n      type: 'select',\n      defaultValue: 'inCinemas',\n      data: [{ value: 'inCinemas' }, { value: 'physicalRelease' }, { value: 'digitalRelease' }],\n    },\n    fontSize: {\n      type: 'select',\n      defaultValue: 'xs',\n      data: [{ value: 'xs' }, { value: 'sm' }, { value: 'md' }, { value: 'lg' }, { value: 'xl' }],\n    },\n  },\n  gridstack: {\n    minWidth: 2,\n    minHeight: 2,\n    maxWidth: 12,\n    maxHeight: 12,\n  },\n  component: CalendarTile,\n});\n\nexport type ICalendarWidget = IWidget<(typeof definition)['id'], typeof definition>;\n\ninterface CalendarTileProps {\n  widget: ICalendarWidget;\n}\n\nfunction CalendarTile({ widget }: CalendarTileProps) {\n  const { colorScheme, radius } = useMantineTheme();\n  const { name: configName } = useConfigContext();\n  const [month, setMonth] = useState(new Date());\n  const isEditMode = useEditModeStore((x) => x.enabled);\n  const { data: sessionData } = useSession();\n  const { data: userWithSettings } = api.user.withSettings.useQuery(undefined, {\n    enabled: !!sessionData?.user,\n  });\n\n  const language = getLanguageByCode(userWithSettings?.settings.language ?? 'en');\n\n  const { data: medias } = api.calendar.medias.useQuery(\n    {\n      configName: configName!,\n      month: month.getMonth() + 1,\n      year: month.getFullYear(),\n      options: {\n        showUnmonitored: widget.properties.showUnmonitored,\n      },\n    },\n    {\n      staleTime: 1000 * 60 * 60 * 5,\n      enabled: isEditMode === false,\n    }\n  );\n\n  const firstDayOfWeek = userWithSettings?.settings.firstDayOfWeek ?? 'monday';\n\n  return (\n    <Calendar\n      defaultDate={new Date()}\n      onPreviousMonth={setMonth}\n      onNextMonth={setMonth}\n      size={widget.properties.fontSize}\n      locale={language.locale}\n      firstDayOfWeek={getFirstDayOfWeek(firstDayOfWeek)}\n      hideWeekdays={widget.properties.hideWeekDays}\n      style={{ position: 'relative' }}\n      date={month}\n      maxLevel=\"month\"\n      styles={{\n        calendarHeader: {\n          maxWidth: 'inherit',\n          marginBottom: '0.35rem !important',\n        },\n        calendarHeaderLevel: {\n          height: '100%',\n        },\n        calendarHeaderControl: {\n          height: '100%',\n        },\n        calendar: {\n          height: '100%',\n          display: 'flex',\n          flexDirection: 'column',\n          width: '100%',\n        },\n        monthLevelGroup: {\n          height: '100%',\n        },\n        monthLevel: {\n          height: '100%',\n          display: 'flex',\n          flexDirection: 'column',\n          width: '100%',\n        },\n        monthCell: {\n          textAlign: 'center',\n        },\n        month: {\n          flex: 1,\n        },\n        day: {\n          borderRadius: ['xs', 'sm'].includes(widget.properties.fontSize) ? radius.md : radius.lg,\n        },\n      }}\n      getDayProps={(date) => ({\n        bg: getBgColorByDateAndTheme(colorScheme, date),\n      })}\n      renderDay={(date) => (\n        <CalendarDay\n          date={date}\n          medias={getReleasedMediasForDate(medias, date, widget)}\n          size={widget.properties.fontSize}\n        />\n      )}\n    />\n  );\n}\n\nconst getFirstDayOfWeek = (\n  firstDayOfWeek: RouterOutputs['user']['withSettings']['settings']['firstDayOfWeek']\n) => {\n  if (firstDayOfWeek === 'sunday') return 0;\n  if (firstDayOfWeek === 'monday') return 1;\n  return 6;\n};\nconst getReleasedMediasForDate = (\n  medias: MediasType | undefined,\n  date: Date,\n  widget: ICalendarWidget\n): MediasType => {\n  const { radarrReleaseType } = widget.properties;\n\n  const books =\n    medias?.books.filter((b) => new Date(b.releaseDate).toDateString() === date.toDateString()) ??\n    [];\n  const movies =\n    medias?.movies.filter(\n      (m) => new Date(m[radarrReleaseType]).toDateString() === date.toDateString()\n    ) ?? [];\n  const musics =\n    medias?.musics.filter((m) => new Date(m.releaseDate).toDateString() === date.toDateString()) ??\n    [];\n  const tvShows =\n    medias?.tvShows.filter(\n      (tv) => new Date(tv.airDateUtc).toDateString() === date.toDateString()\n    ) ?? [];\n  const totalCount = medias ? books.length + movies.length + musics.length + tvShows.length : 0;\n\n  return {\n    books,\n    movies,\n    musics,\n    tvShows,\n    totalCount,\n  };\n};\n\nexport default definition;\n"
  },
  {
    "path": "src/widgets/calendar/MediaList.tsx",
    "content": "import { Divider, ScrollArea, createStyles } from '@mantine/core';\nimport { useViewportSize } from '@mantine/hooks';\nimport React from 'react';\nimport {\n  LidarrMediaDisplay,\n  RadarrMediaDisplay,\n  ReadarrMediaDisplay,\n  SonarrMediaDisplay,\n} from '~/modules/common';\n\nimport { MediasType } from './type';\n\ninterface MediaListProps {\n  medias: MediasType;\n}\n\nexport const MediaList = ({ medias }: MediaListProps) => {\n  const { classes } = useStyles();\n  const { height } = useViewportSize();\n  const lastMediaType = getLastMediaType(medias);\n\n  return (\n    <ScrollArea\n      offsetScrollbars\n      pt={5}\n      className={classes.scrollArea}\n      styles={{\n        viewport: {\n          maxHeight: 450,\n          minHeight: 210,\n        },\n      }}\n    >\n      {mapMedias(medias.tvShows, SonarrMediaDisplay, lastMediaType === 'tv-show')}\n      {mapMedias(medias.movies, RadarrMediaDisplay, lastMediaType === 'movie')}\n      {mapMedias(medias.musics, LidarrMediaDisplay, lastMediaType === 'music')}\n      {mapMedias(medias.books, ReadarrMediaDisplay, lastMediaType === 'book')}\n    </ScrollArea>\n  );\n};\n\nconst mapMedias = (\n  medias: any[],\n  MediaComponent: (props: { media: any }) => JSX.Element | null,\n  containsLastItem: boolean\n) =>\n  medias.map((media, index) => (\n    <div key={index}>\n      <MediaComponent media={media} />\n      {containsLastItem && index === medias.length - 1 ? null : <MediaDivider />}\n    </div>\n  ));\n\nconst MediaDivider = () => <Divider variant=\"dashed\" size=\"sm\" my=\"xl\" />;\n\nconst getLastMediaType = (medias: MediasType) => {\n  if (medias.books.length >= 1) return 'book';\n  if (medias.musics.length >= 1) return 'music';\n  if (medias.movies.length >= 1) return 'movie';\n  return 'tv-show';\n};\n\nconst useStyles = createStyles(() => ({\n  scrollArea: {\n    width: 400,\n  },\n}));\n"
  },
  {
    "path": "src/widgets/calendar/bg-calculator.ts",
    "content": "import { ColorScheme, useMantineTheme } from '@mantine/core';\nimport { isToday } from '~/tools/shared/time/date.tool';\n\nexport const getBgColorByDateAndTheme = (colorScheme: ColorScheme, date: Date) => {\n  if (!isToday(date)) {\n    return undefined;\n  }\n\n  const { colors } = useMantineTheme();\n\n  if (colorScheme === 'dark') {\n    return colors.dark[5];\n  }\n\n  return colors.gray[2];\n};\n"
  },
  {
    "path": "src/widgets/calendar/type.ts",
    "content": "export interface MediasType {\n  tvShows: any[]; // Sonarr\n  movies: any[]; // Radarr\n  musics: any[]; // Lidarr\n  books: any[]; // Readarr\n  totalCount: number;\n}\n"
  },
  {
    "path": "src/widgets/dashDot/DashDotCompactNetwork.tsx",
    "content": "import { Group, Stack, Text } from '@mantine/core';\nimport { IconArrowNarrowDown, IconArrowNarrowUp } from '@tabler/icons-react';\nimport { useTranslation } from 'next-i18next';\nimport { bytes } from '~/tools/bytesHelper';\nimport { RouterOutputs } from '~/utils/api';\n\ninterface DashDotCompactNetworkProps {\n  info: DashDotInfo;\n}\n\nexport type DashDotInfo = RouterOutputs['dashDot']['info'];\n\nexport const DashDotCompactNetwork = ({ info }: DashDotCompactNetworkProps) => {\n  const { t } = useTranslation('modules/dashdot');\n\n  const upSpeed = bytes.toPerSecondString(info?.network?.speedUp);\n  const downSpeed = bytes.toPerSecondString(info?.network?.speedDown);\n\n  return (\n    <Group noWrap align=\"start\" position=\"apart\" w=\"100%\">\n      <Text weight={500}>{t('card.graphs.network.label')}</Text>\n      <Stack align=\"end\" spacing={0}>\n        <Group spacing={0}>\n          <Text size=\"xs\" color=\"dimmed\" align=\"right\">\n            {upSpeed}\n          </Text>\n          <IconArrowNarrowUp size={16} stroke={1.5} />\n        </Group>\n        <Group spacing={0}>\n          <Text size=\"xs\" color=\"dimmed\" align=\"right\">\n            {downSpeed}\n          </Text>\n          <IconArrowNarrowDown size={16} stroke={1.5} />\n        </Group>\n      </Stack>\n    </Group>\n  );\n};\n"
  },
  {
    "path": "src/widgets/dashDot/DashDotCompactStorage.tsx",
    "content": "import { Group, Stack, Text } from '@mantine/core';\nimport { useTranslation } from 'next-i18next';\nimport { bytes } from '~/tools/bytesHelper';\nimport { percentage } from '~/tools/shared/math/percentage.tool';\nimport { api } from '~/utils/api';\n\nimport { DashDotInfo } from './DashDotCompactNetwork';\n\ninterface DashDotCompactStorageProps {\n  info: DashDotInfo;\n  url: string;\n}\n\nexport const DashDotCompactStorage = ({ info, url }: DashDotCompactStorageProps) => {\n  const { t } = useTranslation('modules/dashdot');\n  const { data: storageLoad } = useDashDotStorage(url);\n\n  const totalUsed = calculateTotalLayoutSize({\n    layout: storageLoad ?? [],\n  });\n  const totalSize = calculateTotalLayoutSize({\n    layout: info?.storage ?? [],\n    key: 'size',\n  });\n\n  return (\n    <Group noWrap align=\"start\" position=\"apart\" w=\"100%\">\n      <Text weight={500}>{t('card.graphs.storage.label')}</Text>\n      <Stack align=\"end\" spacing={0}>\n        <Text color=\"dimmed\" size=\"xs\">\n          {percentage(totalUsed, totalSize)}%\n        </Text>\n        <Text color=\"dimmed\" size=\"xs\">\n          {bytes.toString(totalUsed)} / {bytes.toString(totalSize)}\n        </Text>\n      </Stack>\n    </Group>\n  );\n};\n\nconst calculateTotalLayoutSize = <TLayoutItem,>({\n  layout,\n  key,\n}: CalculateTotalLayoutSizeProps<TLayoutItem>) =>\n  layout.reduce((total, current) => {\n    if (key) {\n      return total + (current[key] as number);\n    }\n    return total + (current as number);\n  }, 0);\n\ninterface CalculateTotalLayoutSizeProps<TLayoutItem> {\n  layout: TLayoutItem[];\n  key?: keyof TLayoutItem;\n}\n\nconst useDashDotStorage = (url: string) =>\n  api.dashDot.storage.useQuery({\n    url,\n  });\n"
  },
  {
    "path": "src/widgets/dashDot/DashDotGraph.tsx",
    "content": "import { Title, createStyles, getStylesRef, useMantineTheme } from '@mantine/core';\nimport { useTranslation } from 'next-i18next';\n\nimport { DashDotCompactNetwork, DashDotInfo } from './DashDotCompactNetwork';\nimport { DashDotCompactStorage } from './DashDotCompactStorage';\n\ninterface DashDotGraphProps {\n  graph: string;\n  graphHeight: number;\n  isCompact: boolean;\n  multiView: boolean;\n  dashDotUrl: string;\n  usePercentages: boolean;\n  info: DashDotInfo;\n}\n\nexport const DashDotGraph = ({\n  graph,\n  graphHeight,\n  isCompact,\n  multiView,\n  dashDotUrl,\n  usePercentages,\n  info,\n}: DashDotGraphProps) => {\n  const { t } = useTranslation('modules/dashdot');\n  const { classes } = useStyles();\n\n  if (graph === 'storage' && isCompact) {\n    return <DashDotCompactStorage info={info} url={dashDotUrl} />;\n  }\n\n  if (graph === 'network' && isCompact) {\n    return <DashDotCompactNetwork info={info} />;\n  }\n\n  const title = t(`card.graphs.${graph}.title`);\n\n  return (\n    <div className={classes.graphContainer}>\n      <Title className={classes.graphTitle} order={4}>\n        {title}\n      </Title>\n      <iframe\n        className={classes.iframe}\n        key={graph}\n        title={title}\n        src={useIframeSrc(dashDotUrl, graph, multiView, usePercentages)}\n        style={{\n          height: `${graphHeight}px`,\n        }}\n      />\n    </div>\n  );\n};\n\nconst useIframeSrc = (\n  dashDotUrl: string,\n  graph: string,\n  multiView: boolean,\n  usePercentages: boolean\n) => {\n  const { colorScheme, colors, radius } = useMantineTheme();\n  const surface = (colorScheme === 'dark' ? colors.dark[7] : colors.gray[0]).substring(1); // removes # from hex value\n\n  return (\n    `${dashDotUrl}` +\n    '?singleGraphMode=true' + // obsolete in newer versions\n    `&graph=${graph}` +\n    `&theme=${colorScheme}` +\n    `&surface=${surface}` +\n    '&gap=5' +\n    `&innerRadius=${radius.lg}` +\n    `&multiView=${multiView}` +\n    `&showPercentage=${usePercentages.toString()}` +\n    '&textOffset=16' +\n    '&textSize=12'\n  );\n};\n\nexport const useStyles = createStyles((theme, _params) => ({\n  iframe: {\n    flex: '1 0 auto',\n    maxWidth: '100%',\n    width: '100%',\n    borderRadius: theme.radius.lg,\n    border: 'none',\n    colorScheme: 'light', // fixes white borders around iframe\n  },\n  graphTitle: {\n    ref: getStylesRef('graphTitle'),\n    position: 'absolute',\n    right: 0,\n    bottom: 0,\n    opacity: 0,\n    transition: 'opacity .1s ease-in-out',\n    pointerEvents: 'none',\n    marginBottom: 12,\n    marginRight: 12,\n  },\n  graphContainer: {\n    position: 'relative',\n    [`&:hover .${getStylesRef('graphTitle')}`]: {\n      opacity: 0.5,\n    },\n  },\n}));\n"
  },
  {
    "path": "src/widgets/dashDot/DashDotTile.tsx",
    "content": "import { Center, Grid, Stack, Text, Title, createStyles } from '@mantine/core';\nimport { IconUnlink } from '@tabler/icons-react';\nimport { useTranslation } from 'next-i18next';\nimport { api } from '~/utils/api';\n\nimport { defineWidget } from '../helper';\nimport { IWidget } from '../widgets';\nimport { DashDotGraph } from './DashDotGraph';\n\nconst definition = defineWidget({\n  id: 'dashdot',\n  icon: 'https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/dashdot.png',\n  options: {\n    dashName: {\n      type: 'text',\n      defaultValue: 'Dash.',\n    },\n    url: {\n      type: 'text',\n      defaultValue: '',\n    },\n    usePercentages: {\n      type: 'switch',\n      defaultValue: false,\n    },\n    columns: {\n      type: 'number',\n      defaultValue: 2,\n    },\n    graphHeight: {\n      type: 'number',\n      defaultValue: 115,\n      inputProps: {\n        step: 5,\n        stepHoldDelay: 500,\n        stepHoldInterval: 100,\n      },\n    },\n    graphsOrder: {\n      type: 'draggable-list',\n      defaultValue: [\n        {\n          key: 'storage',\n          subValues: {\n            enabled: true,\n            compactView: true,\n            span: 2,\n            multiView: false,\n          },\n        },\n        {\n          key: 'network',\n          subValues: {\n            enabled: true,\n            compactView: true,\n            span: 2,\n          },\n        },\n        {\n          key: 'cpu',\n          subValues: {\n            enabled: true,\n            multiView: false,\n            span: 1,\n          },\n        },\n        {\n          key: 'ram',\n          subValues: {\n            enabled: true,\n            span: 1,\n          },\n        },\n        {\n          key: 'gpu',\n          subValues: {\n            enabled: false,\n            span: 1,\n          },\n        },\n      ],\n      items: {\n        cpu: {\n          enabled: {\n            type: 'switch',\n          },\n          span: {\n            type: 'number',\n          },\n          multiView: {\n            type: 'switch',\n          },\n        },\n        storage: {\n          enabled: {\n            type: 'switch',\n          },\n          span: {\n            type: 'number',\n          },\n          compactView: {\n            type: 'switch',\n          },\n          multiView: {\n            type: 'switch',\n          },\n        },\n        ram: {\n          enabled: {\n            type: 'switch',\n          },\n          span: {\n            type: 'number',\n          },\n        },\n        network: {\n          enabled: {\n            type: 'switch',\n          },\n          span: {\n            type: 'number',\n          },\n          compactView: {\n            type: 'switch',\n          },\n        },\n        gpu: {\n          enabled: {\n            type: 'switch',\n          },\n          span: {\n            type: 'number',\n          },\n        },\n      },\n    },\n  },\n  gridstack: {\n    minWidth: 2,\n    minHeight: 2,\n    maxWidth: 12,\n    maxHeight: 14,\n  },\n  component: DashDotTile,\n});\n\nexport type IDashDotTile = IWidget<(typeof definition)['id'], typeof definition>;\n\ninterface DashDotTileProps {\n  widget: IDashDotTile;\n}\n\nfunction DashDotTile({ widget }: DashDotTileProps) {\n  const { classes } = useDashDotTileStyles();\n  const { t } = useTranslation('modules/dashdot');\n\n  const dashDotUrl = widget.properties.url;\n  const locationProtocol = window.location.protocol;\n  const detectedProtocolDowngrade =\n    locationProtocol === 'https:' && dashDotUrl.toLowerCase().startsWith('http:');\n\n  const { data: info } = useDashDotInfoQuery({\n    dashDotUrl,\n    enabled: !detectedProtocolDowngrade,\n  });\n\n  if (detectedProtocolDowngrade) {\n    return (\n      <Center h=\"100%\">\n        <Stack spacing=\"xs\" align=\"center\">\n          <IconUnlink size={40} strokeWidth={1.2} />\n          <Title order={5}>{t('card.errors.protocolDowngrade.title')}</Title>\n          <Text align=\"center\" size=\"sm\">\n            {t('card.errors.protocolDowngrade.text')}\n          </Text>\n        </Stack>\n      </Center>\n    );\n  }\n\n  const { dashName, graphsOrder, usePercentages, columns, graphHeight } = widget.properties;\n\n  return (\n    <Stack spacing=\"xs\">\n      <Title order={3}>{dashName || t('card.title')}</Title>\n      {!info && <p>{t('card.errors.noInformation')}</p>}\n      {info && (\n        <div className={classes.graphsContainer}>\n          <Grid grow gutter=\"sm\" w=\"100%\" columns={columns}>\n            {graphsOrder\n              .filter((g) => g.subValues.enabled)\n              .map((g) => (\n                <Grid.Col key={g.key} span={Math.min(columns, g.subValues.span)}>\n                  <DashDotGraph\n                    dashDotUrl={dashDotUrl}\n                    info={info}\n                    graph={g.key as any}\n                    graphHeight={graphHeight}\n                    isCompact={g.subValues.compactView ?? false}\n                    multiView={g.subValues.multiView ?? false}\n                    usePercentages={usePercentages}\n                  />\n                </Grid.Col>\n              ))}\n          </Grid>\n        </div>\n      )}\n    </Stack>\n  );\n}\nconst useDashDotInfoQuery = ({ dashDotUrl, enabled }: { dashDotUrl: string; enabled: boolean }) =>\n  api.dashDot.info.useQuery(\n    {\n      url: dashDotUrl,\n    },\n    {\n      refetchInterval: 50000,\n      enabled,\n    }\n  );\n\nexport const useDashDotTileStyles = createStyles((theme) => ({\n  graphsContainer: {\n    marginRight: `calc(${theme.spacing.sm} * -1)`,\n  },\n}));\n\nexport default definition;\n"
  },
  {
    "path": "src/widgets/dashDot/api.ts",
    "content": "import { useConfigContext } from '~/config/provider';\nimport { RouterInputs, api } from '~/utils/api';\n\nimport {\n  UsenetHistoryRequestParams,\n  UsenetInfoRequestParams,\n  UsenetPauseRequestParams,\n  UsenetQueueRequestParams,\n  UsenetResumeRequestParams,\n} from '../useNet/types';\n\nconst POLLING_INTERVAL = 2000;\n\nexport const useGetUsenetInfo = ({ appId }: UsenetInfoRequestParams) => {\n  const { name: configName } = useConfigContext();\n\n  return api.usenet.info.useQuery(\n    {\n      appId,\n      configName: configName!,\n    },\n    {\n      refetchInterval: POLLING_INTERVAL,\n      keepPreviousData: true,\n      retry: 2,\n      enabled: !!appId,\n    }\n  );\n};\n\nexport const useGetUsenetDownloads = (params: UsenetQueueRequestParams) => {\n  const { name: configName } = useConfigContext();\n  return api.usenet.queue.useQuery(\n    {\n      configName: configName!,\n      ...params,\n    },\n    {\n      refetchInterval: POLLING_INTERVAL,\n      keepPreviousData: true,\n      retry: 2,\n    }\n  );\n};\n\nexport const useGetUsenetHistory = (params: UsenetHistoryRequestParams) => {\n  const { name: configName } = useConfigContext();\n  return api.usenet.history.useQuery(\n    {\n      configName: configName!,\n      ...params,\n    },\n    {\n      refetchInterval: POLLING_INTERVAL,\n      keepPreviousData: true,\n      retry: 2,\n    }\n  );\n};\n\nexport const usePauseUsenetQueueMutation = (params: UsenetPauseRequestParams) => {\n  const { name: configName } = useConfigContext();\n  const { mutateAsync } = api.usenet.pause.useMutation();\n  const utils = api.useContext();\n  return async (variables: Omit<RouterInputs['usenet']['pause'], 'configName'>) => {\n    await mutateAsync(\n      {\n        configName: configName!,\n        ...variables,\n      },\n      {\n        onSettled() {\n          utils.usenet.info.invalidate({ appId: params.appId });\n        },\n      }\n    );\n  };\n};\n\nexport const useResumeUsenetQueueMutation = (params: UsenetResumeRequestParams) => {\n  const { name: configName } = useConfigContext();\n  const { mutateAsync } = api.usenet.resume.useMutation();\n  const utils = api.useContext();\n  return async (variables: Omit<RouterInputs['usenet']['resume'], 'configName'>) => {\n    await mutateAsync(\n      {\n        configName: configName!,\n        ...variables,\n      },\n      {\n        onSettled() {\n          utils.usenet.info.invalidate({ appId: params.appId });\n        },\n      }\n    );\n  };\n};\n"
  },
  {
    "path": "src/widgets/dashDot/types.ts",
    "content": "export interface DashDotGraph {\n  id: string;\n  name: string;\n  twoSpan: boolean;\n  isMultiView: boolean | undefined;\n}\n"
  },
  {
    "path": "src/widgets/date/DateTile.tsx",
    "content": "import { Stack, Text, createStyles } from '@mantine/core';\nimport { useElementSize } from '@mantine/hooks';\nimport { IconClock } from '@tabler/icons-react';\nimport dayjs from 'dayjs';\nimport advancedFormat from 'dayjs/plugin/advancedFormat';\nimport timezones from 'dayjs/plugin/timezone';\nimport utc from 'dayjs/plugin/utc';\nimport { useSession } from 'next-auth/react';\nimport { useEffect, useState } from 'react';\nimport { getLanguageByCode } from '~/tools/language';\n\nimport { defineWidget } from '../helper';\nimport { IWidget } from '../widgets';\n\ndayjs.extend(advancedFormat);\ndayjs.extend(utc);\ndayjs.extend(timezones);\n\nconst definition = defineWidget({\n  id: 'date',\n  icon: IconClock,\n  options: {\n    timezone: {\n      type: 'select',\n      data: () => Intl.supportedValuesOf('timeZone').map((value) => ({ value, label: value })),\n      defaultValue: Intl.DateTimeFormat().resolvedOptions().timeZone,\n      info: true,\n      infoLink: \"https://www.timeanddate.com/time/map/\",\n    },\n    customTitle: {\n      type: 'text',\n      defaultValue: '',\n    },\n    display24HourFormat: {\n      type: 'switch',\n      defaultValue: false,\n    },\n    dateFormat: {\n      type: 'select',\n      defaultValue: 'dddd, MMMM D',\n      data: () => [\n        { value: 'hide' },\n        { value: 'dddd, MMMM D', label: dayjs().format('dddd, MMMM D') },\n        { value: 'dddd, D MMMM', label: dayjs().format('dddd, D MMMM') },\n        { value: 'MMM D', label: dayjs().format('MMM D') },\n        { value: 'D MMM', label: dayjs().format('D MMM') },\n        { value: 'DD/MM/YYYY', label: dayjs().format('DD/MM/YYYY') },\n        { value: 'MM/DD/YYYY', label: dayjs().format('MM/DD/YYYY') },\n        { value: 'DD/MM', label: dayjs().format('DD/MM') },\n        { value: 'MM/DD', label: dayjs().format('MM/DD') },\n      ],\n    },\n    titleState: {\n      type: 'select',\n      defaultValue: 'both',\n      data: [{ value: 'both' }, { value: 'city' }, { value: 'none' }],\n      info: true,\n    },\n  },\n  gridstack: {\n    minWidth: 1,\n    minHeight: 1,\n    maxWidth: 12,\n    maxHeight: 12,\n  },\n  component: DateTile,\n});\n\nexport type IDateWidget = IWidget<(typeof definition)['id'], typeof definition>;\n\ninterface DateTileProps {\n  widget: IDateWidget;\n}\n\nfunction DateTile({ widget }: DateTileProps) {\n  const formatString = widget.properties.display24HourFormat ? 'HH:mm' : 'h:mm A';\n  const { ref, width } = useElementSize();\n  const { cx, classes } = useStyles();\n  const { data: sessionData } = useSession();\n  const [now, setDate] = useState(new Date());\n\n  useEffect(() => {\n    // Refresh the time every second\n    const interval = setInterval(() => setDate(new Date()), 1000);\n    return () => clearInterval(interval);\n  }, []);\n\n  const language = getLanguageByCode(sessionData?.user.language ?? 'en');\n  dayjs.locale(language.locale);\n\n  return (\n    <Stack ref={ref} className={cx(classes.wrapper, 'dashboard-tile-clock-wrapper')}>\n      {widget.properties.titleState !== 'none' &&\n        (widget.properties.customTitle.length > 0 || widget.properties.titleState === 'both') && (\n          <Text\n            size={width < 150 ? 'sm' : 'lg'}\n            className={cx(classes.extras, 'dashboard-tile-clock-city')}\n          >\n            {widget.properties.customTitle.length > 0 && widget.properties.customTitle}\n            {widget.properties.titleState === 'both' &&\n              dayjs(now).tz(widget.properties.timezone).format(' (z)')}\n          </Text>\n        )}\n      <Text className={cx(classes.clock, 'dashboard-tile-clock-hour')}>\n        {dayjs(now).tz(widget.properties.timezone).format(formatString)}\n      </Text>\n      {!widget.properties.dateFormat.includes('hide') && (\n        <Text\n          size={width < 150 ? 'sm' : 'lg'}\n          pt=\"0.2rem\"\n          className={cx(classes.extras, 'dashboard-tile-clock-date')}\n        >\n          {dayjs(now).tz(widget.properties.timezone).format(widget.properties.dateFormat)}\n        </Text>\n      )}\n    </Stack>\n  );\n}\n\nconst useStyles = createStyles(() => ({\n  wrapper: {\n    display: 'flex',\n    flexDirection: 'column',\n    justifyContent: 'space-evenly',\n    alignItems: 'center',\n    height: '100%',\n    gap: 0,\n  },\n  clock: {\n    lineHeight: '1',\n    whiteSpace: 'nowrap',\n    fontWeight: 700,\n    fontSize: '2.125rem',\n  },\n  extras: {\n    lineHeight: '1',\n    whiteSpace: 'nowrap',\n  },\n}));\n\nexport default definition;\n"
  },
  {
    "path": "src/widgets/dnshole/DnsHoleControls.tsx",
    "content": "import {\n  ActionIcon,\n  Badge,\n  Box,\n  Button,\n  Card,\n  Center,\n  Flex,\n  Group,\n  Image,\n  Stack,\n  Text,\n  Title,\n  Tooltip,\n  UnstyledButton,\n} from '@mantine/core';\nimport { useDisclosure } from '@mantine/hooks';\nimport {\n  IconClockPause,\n  IconDeviceGamepad,\n  IconPlayerPlay,\n  IconPlayerStop,\n} from '@tabler/icons-react';\nimport { useSession } from 'next-auth/react';\nimport { useTranslation } from 'next-i18next';\nimport { useState } from 'react';\nimport { useConfigContext } from '~/config/provider';\nimport { api } from '~/utils/api';\n\nimport { defineWidget } from '../helper';\nimport { WidgetLoading } from '../loading';\nimport { IWidget } from '../widgets';\nimport { useDnsHoleSummeryQuery } from './DnsHoleSummary';\nimport { TimerModal } from './TimerModal';\n\nconst definition = defineWidget({\n  id: 'dns-hole-controls',\n  icon: IconDeviceGamepad,\n  options: {\n    showToggleAllButtons: {\n      type: 'switch',\n      defaultValue: true,\n    },\n  },\n  gridstack: {\n    minWidth: 2,\n    minHeight: 1,\n    maxWidth: 12,\n    maxHeight: 12,\n  },\n  component: DnsHoleControlsWidgetTile,\n});\n\nexport type IDnsHoleControlsWidget = IWidget<(typeof definition)['id'], typeof definition>;\n\ninterface DnsHoleControlsWidgetProps {\n  widget: IDnsHoleControlsWidget;\n}\n\n/**\n *\n * @param fetching - a expression that return a boolean if the data is been fetched\n * @param currentStatus the current status of the dns integration, either enabled or disabled\n * @returns\n */\nconst dnsLightStatus = (\n  fetching: boolean,\n  currentStatus: 'enabled' | 'disabled'\n): 'blue' | 'green' | 'red' => {\n  if (fetching) {\n    return 'blue';\n  }\n  if (currentStatus === 'enabled') {\n    return 'green';\n  }\n  return 'red';\n};\n\nfunction DnsHoleControlsWidgetTile({ widget }: DnsHoleControlsWidgetProps) {\n  const { data: sessionData } = useSession();\n  const [opened, { close, open }] = useDisclosure(false);\n  const [appId, setAppId] = useState('');\n  const { isInitialLoading, data, isFetching: fetchingDnsSummary } = useDnsHoleSummeryQuery();\n  const { mutateAsync, isLoading: changingStatus } = useDnsHoleControlMutation();\n  const { t } = useTranslation(['common', 'modules/dns-hole-controls']);\n\n  const enableControls = sessionData?.user.isAdmin ?? false;\n\n  const { name: configName, config } = useConfigContext();\n\n  const trpcUtils = api.useUtils();\n\n  if (isInitialLoading || !data || !configName) {\n    return <WidgetLoading />;\n  }\n\n  if (data.status.length === 0) {\n    return (\n      <Center h=\"100%\">\n        <Stack align=\"center\">\n          <IconDeviceGamepad size={40} strokeWidth={1} />\n          <Title align=\"center\" order={6}>\n            {t('modules/dns-hole-controls:descriptor.errors.general.title')}\n          </Title>\n          <Text align=\"center\">\n            {t('modules/dns-hole-controls:descriptor.errors.general.text')}\n          </Text>\n        </Stack>\n      </Center>\n    );\n  }\n\n  type getDnsStatusAcc = {\n    enabled: string[];\n    disabled: string[];\n  };\n\n  const getDnsStatus = () => {\n    const dnsList = data?.status.reduce(\n      (acc: getDnsStatusAcc, dns) => {\n        if (dns.status === 'enabled') {\n          acc.enabled.push(dns.appId);\n        } else if (dns.status === 'disabled') {\n          acc.disabled.push(dns.appId);\n        }\n        return acc;\n      },\n      { enabled: [], disabled: [] }\n    );\n\n    if (dnsList.enabled.length === 0 && dnsList.disabled.length === 0) {\n      return undefined;\n    }\n    return dnsList;\n  };\n\n  const toggleDns = async (\n    action: 'enable' | 'disable',\n    appsToChange?: string[],\n    hours: number = 0,\n    minutes: number = 0\n  ) => {\n    const duration = hours * 3600 + minutes * 60;\n    await mutateAsync(\n      {\n        action,\n        duration,\n        configName,\n        appsToChange,\n      },\n      {\n        onSettled: () => {\n          trpcUtils.dnsHole.summary.invalidate();\n        },\n      }\n    );\n    setAppId('');\n  };\n\n  return (\n    <Stack h=\"100%\" spacing=\"0.25rem\">\n      {enableControls && widget.properties.showToggleAllButtons && (\n        <Flex gap=\"xs\">\n          <Tooltip label={t('enableAll')}>\n            <Button\n              onClick={() => toggleDns('enable', getDnsStatus()?.disabled)}\n              disabled={\n                getDnsStatus()?.disabled.length === 0 || fetchingDnsSummary || changingStatus\n              }\n              variant=\"light\"\n              color=\"green\"\n              fullWidth\n              h=\"2rem\"\n            >\n              <IconPlayerPlay size={20} />\n            </Button>\n          </Tooltip>\n\n          <Tooltip label={t('setTimer')}>\n            <Button\n              onClick={open}\n              disabled={\n                getDnsStatus()?.enabled.length === 0 || fetchingDnsSummary || changingStatus\n              }\n              variant=\"light\"\n              color=\"yellow\"\n              fullWidth\n              h=\"2rem\"\n            >\n              <IconClockPause size={20} />\n            </Button>\n          </Tooltip>\n\n          <Tooltip label={t('disableAll')}>\n            <Button\n              onClick={() => toggleDns('disable', getDnsStatus()?.enabled)}\n              disabled={\n                getDnsStatus()?.enabled.length === 0 || fetchingDnsSummary || changingStatus\n              }\n              variant=\"light\"\n              color=\"red\"\n              fullWidth\n              h=\"2rem\"\n            >\n              <IconPlayerStop size={20} />\n            </Button>\n          </Tooltip>\n        </Flex>\n      )}\n\n      <TimerModal\n        toggleDns={toggleDns}\n        getDnsStatus={getDnsStatus}\n        opened={opened}\n        close={close}\n        appId={appId}\n      />\n\n      <Stack\n        spacing=\"0.25rem\"\n        display=\"flex\"\n        style={{\n          flex: '1',\n          justifyContent:\n            enableControls && widget.properties.showToggleAllButtons ? 'flex-end' : 'space-evenly',\n        }}\n      >\n        {data.status.map((dnsHole, index) => {\n          const app = config?.apps.find((x) => x.id === dnsHole.appId);\n\n          if (!app) {\n            return null;\n          }\n\n          return (\n            <Card withBorder={true} key={dnsHole.appId} p=\"xs\" radius=\"md\">\n              <Group>\n                <Box\n                  sx={(theme) => ({\n                    backgroundColor:\n                      theme.colorScheme === 'dark' ? theme.colors.dark[4] : theme.colors.gray[2],\n                    textAlign: 'center',\n                    padding: 5,\n                    borderRadius: theme.radius.md,\n                  })}\n                >\n                  <Image src={app.appearance.iconUrl} width={40} height={40} fit=\"contain\" />\n                </Box>\n                <Stack spacing=\"0rem\">\n                  <Text>{app.name}</Text>\n                  <Flex direction=\"row\" gap=\"md\">\n                    <UnstyledButton\n                      onClick={() =>\n                        toggleDns(dnsHole.status === 'enabled' ? 'disable' : 'enable', [app.id])\n                      }\n                      disabled={fetchingDnsSummary || changingStatus}\n                      style={{ pointerEvents: enableControls ? 'auto' : 'none' }}\n                    >\n                      <Badge\n                        variant=\"dot\"\n                        color={dnsLightStatus(fetchingDnsSummary || changingStatus, dnsHole.status)}\n                        styles={(theme) => ({\n                          root: {\n                            '&:hover': {\n                              background:\n                                theme.colorScheme === 'dark'\n                                  ? theme.colors.dark[4]\n                                  : theme.colors.gray[2],\n                            },\n                            '&:active': {\n                              background:\n                                theme.colorScheme === 'dark'\n                                  ? theme.colors.dark[5]\n                                  : theme.colors.gray[3],\n                            },\n                          },\n                        })}\n                      >\n                        {t(dnsHole.status)}\n                      </Badge>\n                    </UnstyledButton>\n                    {enableControls && (\n                      <ActionIcon\n                        size={20}\n                        radius=\"xl\"\n                        top=\"2.67px\"\n                        variant=\"default\"\n                        onClick={() => {\n                          setAppId(app.id);\n                          open();\n                        }}\n                      >\n                        <IconClockPause size={20} color=\"red\" />\n                      </ActionIcon>\n                    )}\n                  </Flex>\n                </Stack>\n              </Group>\n            </Card>\n          );\n        })}\n      </Stack>\n    </Stack>\n  );\n}\nconst useDnsHoleControlMutation = () => api.dnsHole.control.useMutation();\n\nexport default definition;\n"
  },
  {
    "path": "src/widgets/dnshole/DnsHoleSummary.tsx",
    "content": "import { Card, Center, Container, Flex, Text } from '@mantine/core';\nimport { useElementSize } from '@mantine/hooks';\nimport {\n  IconAd,\n  IconBarrierBlock,\n  IconPercentage,\n  IconSearch,\n  IconWorldWww,\n  TablerIconsProps,\n} from '@tabler/icons-react';\nimport { useTranslation } from 'next-i18next';\nimport { useConfigContext } from '~/config/provider';\nimport { formatNumber, formatPercentage } from '~/tools/client/math';\nimport { RouterOutputs, api } from '~/utils/api';\n\nimport { defineWidget } from '../helper';\nimport { WidgetLoading } from '../loading';\nimport { IWidget } from '../widgets';\n\nconst availableLayouts = ['grid', 'row', 'column'] as const;\ntype AvailableLayout = (typeof availableLayouts)[number];\n\nconst definition = defineWidget({\n  id: 'dns-hole-summary',\n  icon: IconAd,\n  options: {\n    usePiHoleColors: {\n      type: 'switch',\n      defaultValue: true,\n    },\n    layout: {\n      type: 'select',\n      defaultValue: 'grid' as AvailableLayout,\n      data: availableLayouts.map((x) => ({ value: x })),\n    },\n  },\n  gridstack: {\n    minWidth: 2,\n    minHeight: 1,\n    maxWidth: 12,\n    maxHeight: 12,\n  },\n  component: DnsHoleSummaryWidgetTile,\n});\n\nexport type IDnsHoleSummaryWidget = IWidget<(typeof definition)['id'], typeof definition>;\n\ninterface DnsHoleSummaryWidgetProps {\n  widget: IDnsHoleSummaryWidget;\n}\n\nfunction DnsHoleSummaryWidgetTile({ widget }: DnsHoleSummaryWidgetProps) {\n  const { isInitialLoading, data } = useDnsHoleSummeryQuery();\n\n  if (isInitialLoading || !data) {\n    return <WidgetLoading />;\n  }\n\n  return (\n    <Container h=\"100%\" p={0} style={constructContainerStyle(widget.properties.layout)}>\n      {stats.map((item, index) => (\n        <StatCard\n          key={item.label ?? index}\n          item={item}\n          usePiHoleColors={widget.properties.usePiHoleColors}\n          data={data}\n        />\n      ))}\n    </Container>\n  );\n}\n\nconst stats = [\n  {\n    icon: IconBarrierBlock,\n    value: (x) => formatNumber(x.adsBlockedToday, 2),\n    label: 'card.metrics.queriesBlockedToday',\n    color: 'rgba(240, 82, 60, 0.4)',\n  },\n  {\n    icon: IconPercentage,\n    value: (x) => formatPercentage(x.adsBlockedTodayPercentage, 2),\n    label: 'card.metrics.queriesBlockedTodayPercentage',\n    color: 'rgba(255, 165, 20, 0.4)',\n  },\n  {\n    icon: IconSearch,\n    value: (x) => formatNumber(x.dnsQueriesToday, 2),\n    label: 'card.metrics.queriesToday',\n    color: 'rgba(0, 175, 218, 0.4)',\n  },\n  {\n    icon: IconWorldWww,\n    value: (x) => formatNumber(x.domainsBeingBlocked, 2),\n    label: 'card.metrics.domainsOnAdlist',\n    color: 'rgba(0, 176, 96, 0.4)',\n  },\n] satisfies StatItem[];\n\ntype StatItem = {\n  icon: (props: TablerIconsProps) => JSX.Element;\n  value: (x: RouterOutputs['dnsHole']['summary']) => string;\n  label?: string;\n  color: string;\n};\n\nexport const useDnsHoleSummeryQuery = () => {\n  const { name: configName } = useConfigContext();\n\n  return api.dnsHole.summary.useQuery(\n    {\n      configName: configName!,\n    },\n    {\n      refetchInterval: 1000 * 60 * 2,\n    }\n  );\n};\n\ntype StatCardProps = {\n  item: StatItem;\n  data: RouterOutputs['dnsHole']['summary'];\n  usePiHoleColors: boolean;\n};\nconst StatCard = ({ item, data, usePiHoleColors }: StatCardProps) => {\n  const { t } = useTranslation('modules/dns-hole-summary');\n  const { ref, height, width } = useElementSize();\n  const isLong = width > height + 20;\n\n  return (\n    <Card\n      ref={ref}\n      m=\"0.4rem\"\n      p=\"0.2rem\"\n      bg={usePiHoleColors ? item.color : 'rgba(96, 96, 96, 0.1)'}\n      style={{\n        flex: 1,\n      }}\n      withBorder\n    >\n      <Center h=\"100%\" w=\"100%\">\n        <Flex\n          h=\"100%\"\n          w=\"100%\"\n          align=\"center\"\n          justify=\"space-evenly\"\n          direction={isLong ? 'row' : 'column'}\n        >\n          <item.icon size={30} style={{ margin: '0 10' }} />\n          <Flex\n            justify=\"center\"\n            direction=\"column\"\n            style={{\n              flex: isLong ? 1 : undefined,\n            }}\n          >\n            <Text align=\"center\" lh={1.2} size=\"md\" weight=\"bold\">\n              {item.value(data)}\n            </Text>\n            {item.label && (\n              <Text align=\"center\" lh={1.2} size=\"0.75rem\">\n                {t<string>(item.label)}\n              </Text>\n            )}\n          </Flex>\n        </Flex>\n      </Center>\n    </Card>\n  );\n};\n\nconst constructContainerStyle = (flexLayout: (typeof availableLayouts)[number]) => {\n  if (flexLayout === 'grid') {\n    return {\n      display: 'grid',\n      gridTemplateColumns: '1fr 1fr',\n      gridTemplateRows: '1fr 1fr',\n    };\n  }\n\n  return {\n    display: 'flex',\n    flexDirection: flexLayout,\n  };\n};\n\nexport default definition;\n"
  },
  {
    "path": "src/widgets/dnshole/TimerModal.tsx",
    "content": "import {\n  ActionIcon,\n  Button,\n  Flex,\n  Group,\n  Modal,\n  NumberInput,\n  NumberInputHandlers,\n  Stack,\n  Text,\n  rem,\n} from '@mantine/core';\nimport { IconClockPause } from '@tabler/icons-react';\nimport { useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\ninterface TimerModalProps {\n  toggleDns: any;\n  getDnsStatus(): any;\n  opened: boolean;\n  close(): any;\n  appId: string;\n}\n\nexport function TimerModal({ toggleDns, getDnsStatus, opened, close, appId }: TimerModalProps) {\n  const [hours, setHours] = useState(0);\n  const [minutes, setMinutes] = useState(0);\n  const hoursHandlers = useRef<NumberInputHandlers>();\n  const minutesHandlers = useRef<NumberInputHandlers>();\n  const { t } = useTranslation('modules/dns-hole-controls');\n\n  return (\n    <Modal\n      withinPortal\n      radius=\"lg\"\n      shadow=\"sm\"\n      size=\"sm\"\n      opened={opened}\n      onClose={() => {\n        close();\n        setHours(0);\n        setMinutes(0);\n      }}\n      title={t('durationModal.title')}\n    >\n      <Flex direction=\"column\" align=\"center\" justify=\"center\">\n        <Stack align=\"flex-end\">\n          <Group spacing={5}>\n            <Text>{t('durationModal.hours')}</Text>\n            <ActionIcon\n              size={35}\n              variant=\"default\"\n              onClick={() => hoursHandlers.current?.decrement()}\n            >\n              –\n            </ActionIcon>\n            <NumberInput\n              hideControls\n              value={hours}\n              onChange={(val) => setHours(Number(val))}\n              handlersRef={hoursHandlers}\n              max={999}\n              min={0}\n              step={1}\n              styles={{ input: { width: rem(54), textAlign: 'center' } }}\n            />\n            <ActionIcon\n              size={35}\n              variant=\"default\"\n              onClick={() => hoursHandlers.current?.increment()}\n            >\n              +\n            </ActionIcon>\n          </Group>\n          <Group spacing={5}>\n            <Text>{t('durationModal.minutes')}</Text>\n            <ActionIcon\n              size={35}\n              variant=\"default\"\n              onClick={() => minutesHandlers.current?.decrement()}\n            >\n              –\n            </ActionIcon>\n            <NumberInput\n              hideControls\n              value={minutes}\n              onChange={(val) => setMinutes(Number(val))}\n              handlersRef={minutesHandlers}\n              max={59}\n              min={0}\n              step={1}\n              styles={{ input: { width: rem(54), textAlign: 'center' } }}\n            />\n            <ActionIcon\n              size={35}\n              variant=\"default\"\n              onClick={() => minutesHandlers.current?.increment()}\n            >\n              +\n            </ActionIcon>\n          </Group>\n        </Stack>\n        <Text ta=\"center\" c=\"dimmed\" my={5}>\n          {t('durationModal.unlimited')}\n        </Text>\n        <Button\n          variant=\"light\"\n          color=\"red\"\n          leftIcon={<IconClockPause size={20} />}\n          h=\"2rem\"\n          w=\"12rem\"\n          onClick={() => {\n            toggleDns('disable', appId !== '' ? [appId] : getDnsStatus()?.enabled, hours, minutes);\n            setHours(0);\n            setMinutes(0);\n            close();\n          }}\n        >\n          {t('durationModal.set')}\n        </Button>\n      </Flex>\n    </Modal>\n  );\n}\n"
  },
  {
    "path": "src/widgets/dnshole/type.ts",
    "content": "export type AdStatistics = {\n  domainsBeingBlocked: number;\n  adsBlockedToday: number;\n  adsBlockedTodayPercentage: number;\n  dnsQueriesToday: number;\n  status: {\n    status: PiholeApiSummaryType['status'];\n    appId: string;\n  }[];\n};\n\nexport type PiholeApiSummaryType = {\n  domains_being_blocked: number;\n  dns_queries_today: number;\n  ads_blocked_today: number;\n  ads_percentage_today: number;\n  unique_domains: number;\n  queries_forwarded: number;\n  queries_cached: number;\n  clients_ever_seen: number;\n  unique_clients: number;\n  dns_queries_all_types: number;\n  reply_UNKNOWN: number;\n  reply_NODATA: number;\n  reply_NXDOMAIN: number;\n  reply_CNAME: number;\n  reply_IP: number;\n  reply_DOMAIN: number;\n  reply_RRNAME: number;\n  reply_SERVFAIL: number;\n  reply_REFUSED: number;\n  reply_NOTIMP: number;\n  reply_OTHER: number;\n  reply_DNSSEC: number;\n  reply_NONE: number;\n  reply_BLOB: number;\n  dns_queries_all_replies: number;\n  privacy_level: number;\n  status: 'enabled' | 'disabled';\n  gravity_last_updated: {\n    file_exists: boolean;\n    absolute: number;\n    relative: { days: number; hours: number; minutes: number };\n  };\n};\n"
  },
  {
    "path": "src/widgets/download-speed/Tile.tsx",
    "content": "import {\n  Avatar,\n  Box,\n  Card,\n  Group,\n  Stack,\n  Text,\n  Title,\n  Tooltip,\n  useMantineTheme,\n} from '@mantine/core';\nimport { useElementSize, useListState } from '@mantine/hooks';\nimport { linearGradientDef } from '@nivo/core';\nimport { Datum, ResponsiveLine, Serie } from '@nivo/line';\nimport { IconDownload, IconUpload } from '@tabler/icons-react';\nimport { useTranslation } from 'next-i18next';\nimport { useEffect } from 'react';\nimport { AppAvatar } from '~/components/AppAvatar';\nimport { useConfigContext } from '~/config/provider';\nimport { useColorTheme } from '~/tools/color';\nimport { humanFileSize } from '~/tools/humanFileSize';\nimport {\n  NormalizedDownloadQueueResponse,\n  TorrentTotalDownload,\n} from '~/types/api/downloads/queue/NormalizedDownloadQueueResponse';\n\nimport definition, { ITorrentNetworkTraffic } from './TorrentNetworkTrafficTile';\nimport { useGetDownloadClientsQueue } from './useGetNetworkSpeed';\n\ninterface TorrentNetworkTrafficTileProps {\n  widget: ITorrentNetworkTraffic;\n}\n\nexport default function TorrentNetworkTrafficTile({ widget }: TorrentNetworkTrafficTileProps) {\n  const { config } = useConfigContext();\n  const { ref: refRoot, height: heightRoot } = useElementSize();\n  const { ref: refTitle, height: heightTitle } = useElementSize();\n  const { ref: refFooter, height: heightFooter } = useElementSize();\n  const { primaryColor, secondaryColor } = useColorTheme();\n  const { t } = useTranslation(`modules/${definition.id}`);\n\n  const [clientDataHistory, setClientDataHistory] = useListState<NormalizedDownloadQueueResponse>();\n\n  const { data, dataUpdatedAt } = useGetDownloadClientsQueue();\n\n  useEffect(() => {\n    if (data) {\n      setClientDataHistory.append(data);\n    }\n\n    if (clientDataHistory.length < 30) {\n      return;\n    }\n    setClientDataHistory.remove(0);\n  }, [dataUpdatedAt]);\n\n  if (!data) {\n    return null;\n  }\n\n  const recoredAppsOverTime = clientDataHistory.flatMap((x) => x.apps.map((app) => app));\n\n  // removing duplicates the \"naive\" way: https://stackoverflow.com/a/9229821/15257712\n  const uniqueRecordedAppsOverTime = recoredAppsOverTime\n    .map((x) => x.appId)\n    .filter((item, position) => recoredAppsOverTime.map((y) => y.appId).indexOf(item) === position);\n\n  const lineChartData: Serie[] = uniqueRecordedAppsOverTime.flatMap((appId) => {\n    const records = recoredAppsOverTime.filter((x) => x.appId === appId);\n\n    const series: Serie[] = [\n      {\n        id: `download_${appId}`,\n        data: records.map((record, index) => ({\n          x: index,\n          y: record.totalDownload,\n        })),\n      },\n    ];\n\n    if (records.some((x) => x.type === 'torrent')) {\n      const torrentRecords = records.map((record, index): Datum | null => {\n        if (record.type !== 'torrent') {\n          return null;\n        }\n\n        return {\n          x: index,\n          y: record.totalUpload,\n        };\n      });\n      const filteredRecords = torrentRecords.filter((x) => x !== null) as Datum[];\n      series.push({\n        id: `upload_${appId}`,\n        data: filteredRecords,\n      });\n    }\n\n    return series;\n  });\n\n  const totalDownload = uniqueRecordedAppsOverTime\n    .map((appId) => {\n      const records = recoredAppsOverTime.filter((x) => x.appId === appId);\n      const lastRecord = records.at(-1);\n      return lastRecord?.totalDownload ?? 0;\n    })\n    .reduce((acc, n) => acc + n, 0);\n\n  const totalUpload = uniqueRecordedAppsOverTime\n    .map((appId) => {\n      const records = recoredAppsOverTime.filter((x) => x.appId === appId && x.type === 'torrent');\n      const lastRecord = records.at(-1) as TorrentTotalDownload;\n      return lastRecord?.totalUpload ?? 0;\n    })\n    .reduce((acc, n) => acc + n, 0);\n\n  const graphHeight = heightRoot - heightFooter - heightTitle;\n\n  const { colors } = useMantineTheme();\n\n  return (\n    <Stack ref={refRoot} style={{ height: '100%' }}>\n      <Group ref={refTitle}>\n        <IconDownload />\n        <Title order={4}>{t('card.lineChart.title')}</Title>\n      </Group>\n      <Box\n        style={{\n          height: graphHeight,\n          width: '100%',\n          position: 'relative',\n        }}\n      >\n        <Box style={{ height: '100%', width: '100%', position: 'absolute' }}>\n          <ResponsiveLine\n            isInteractive\n            enableSlices=\"x\"\n            sliceTooltip={({ slice }) => {\n              const { points } = slice;\n\n              const recordsFromPoints = uniqueRecordedAppsOverTime.map((appId) => {\n                const records = recoredAppsOverTime.filter((x) => x.appId === appId);\n                const point = points.find((x) => x.id.includes(appId));\n                const pointIndex = Number(point?.data.x) ?? 0;\n                const color = point?.serieColor;\n                return {\n                  record: records[pointIndex],\n                  color,\n                };\n              });\n\n              return (\n                <Card p=\"xs\" radius=\"md\" withBorder>\n                  <Card.Section p=\"xs\">\n                    <Stack spacing=\"xs\">\n                      {recordsFromPoints.map((entry, index) => {\n                        const app = config?.apps.find((x) => x.id === entry.record.appId);\n\n                        if (!app) {\n                          return null;\n                        }\n\n                        return (\n                          <Group key={`download-client-tooltip-${index}`}>\n                            <AppAvatar iconUrl={app.appearance.iconUrl} />\n\n                            <Stack spacing={0}>\n                              <Text size=\"sm\">{app.name}</Text>\n                              <Group>\n                                <Group spacing=\"xs\">\n                                  <IconDownload opacity={0.6} size={14} />\n                                  <Text size=\"xs\" color=\"dimmed\">\n                                    {humanFileSize(entry.record.totalDownload, false)}\n                                  </Text>\n                                </Group>\n\n                                {entry.record.type === 'torrent' && (\n                                  <Group spacing=\"xs\">\n                                    <IconUpload opacity={0.6} size={14} />\n                                    <Text size=\"xs\" color=\"dimmed\">\n                                      {humanFileSize(entry.record.totalUpload, false)}\n                                    </Text>\n                                  </Group>\n                                )}\n                              </Group>\n                            </Stack>\n                          </Group>\n                        );\n                      })}\n                    </Stack>\n                  </Card.Section>\n                </Card>\n              );\n            }}\n            data={lineChartData}\n            curve=\"monotoneX\"\n            yFormat=\" >-.2f\"\n            axisLeft={null}\n            axisBottom={null}\n            axisRight={null}\n            enablePoints={false}\n            enableGridX={false}\n            enableGridY={false}\n            enableArea\n            defs={[\n              linearGradientDef('gradientA', [\n                { offset: 0, color: 'inherit' },\n                { offset: 100, color: 'inherit', opacity: 0 },\n              ]),\n            ]}\n            colors={lineChartData.flatMap((data) =>\n              data.id.toString().startsWith('upload_')\n                ? colors[secondaryColor][5]\n                : colors[primaryColor][5]\n            )}\n            fill={[{ match: '*', id: 'gradientA' }]}\n            margin={{ bottom: 5 }}\n            animate={false}\n          />\n        </Box>\n      </Box>\n\n      <Group position=\"apart\" ref={refFooter}>\n        <Group>\n          <Group spacing=\"xs\">\n            <IconDownload color={colors[primaryColor][5]} opacity={0.6} size={18} />\n            <Text color=\"dimmed\" size=\"sm\">\n              {humanFileSize(totalDownload, false)}\n            </Text>\n          </Group>\n          <Group spacing=\"xs\">\n            <IconUpload color={colors[secondaryColor][5]} opacity={0.6} size={18} />\n            <Text color=\"dimmed\" size=\"sm\">\n              {humanFileSize(totalUpload, false)}\n            </Text>\n          </Group>\n        </Group>\n        <Avatar.Group>\n          {uniqueRecordedAppsOverTime.map((appId, index) => {\n            const app = config?.apps.find((x) => x.id === appId);\n\n            if (!app) {\n              return null;\n            }\n\n            return (\n              <Tooltip\n                label={app.name}\n                key={`download-client-app-tooltip-${index}`}\n                withArrow\n                withinPortal\n              >\n                <AppAvatar iconUrl={app.appearance.iconUrl} />\n              </Tooltip>\n            );\n          })}\n        </Avatar.Group>\n      </Group>\n    </Stack>\n  );\n}\n"
  },
  {
    "path": "src/widgets/download-speed/TorrentNetworkTrafficTile.tsx",
    "content": "import { IconArrowsUpDown } from '@tabler/icons-react';\nimport dynamic from 'next/dynamic';\n\nimport { defineWidget } from '../helper';\nimport { IWidget } from '../widgets';\n\nconst torrentNetworkTrafficTile = dynamic(() => import('./Tile'), {\n  ssr: false,\n});\n\nconst definition = defineWidget({\n  id: 'dlspeed',\n  icon: IconArrowsUpDown,\n  options: {},\n\n  gridstack: {\n    minWidth: 2,\n    minHeight: 2,\n    maxWidth: 12,\n    maxHeight: 6,\n  },\n  component: torrentNetworkTrafficTile,\n});\n\nexport type ITorrentNetworkTraffic = IWidget<(typeof definition)['id'], typeof definition>;\n\nexport default definition;\n"
  },
  {
    "path": "src/widgets/download-speed/useGetNetworkSpeed.tsx",
    "content": "import { useConfigContext } from '~/config/provider';\nimport { api } from '~/utils/api';\n\nexport const useGetDownloadClientsQueue = () => {\n  const { name: configName } = useConfigContext();\n  return api.download.get.useQuery(\n    {\n      configName: configName!,\n    },\n    {\n      refetchInterval: 3000,\n    }\n  );\n};\n"
  },
  {
    "path": "src/widgets/health-monitoring/HealthMonitoringCpu.tsx",
    "content": "import { Center, Flex, Group, HoverCard, RingProgress, Text } from '@mantine/core';\nimport { IconCpu } from '@tabler/icons-react';\nimport { useTranslation } from 'react-i18next';\n\nconst HealthMonitoringCpu = ({ info, cpuTemp, fahrenheit }: any) => {\n  const { t } = useTranslation('modules/health-monitoring');\n  const toFahrenheit = (value: number) => {\n    return Math.round(value * 1.8 + 32);\n  };\n\n  interface LoadDataItem {\n    label: string;\n    stats: number;\n    progress: number;\n    color: string;\n  }\n\n  const loadData = [\n    {\n      label: `${t('cpu.minute', { minute: 1 })}`,\n      stats: info.loadAverage['1min'],\n      progress: info.loadAverage['1min'],\n      color: 'teal',\n    },\n    {\n      label: `${t('cpu.minutes', { minutes: 5 })}`,\n      stats: info.loadAverage['5min'],\n      progress: info.loadAverage['5min'],\n      color: 'blue',\n    },\n    {\n      label: `${t('cpu.minutes', { minutes: 15 })}`,\n      stats: info.loadAverage['15min'],\n      progress: info.loadAverage['15min'],\n      color: 'red',\n    },\n  ] as const;\n\n  return (\n    <Group position=\"center\">\n      <RingProgress\n        roundCaps\n        size={120}\n        thickness={12}\n        label={\n          <Center style={{ flexDirection: 'column' }}>\n            {info.cpuUtilization.toFixed(2)}%\n            <HoverCard width={280} shadow=\"md\" position=\"top\" withinPortal>\n              <HoverCard.Target>\n                <IconCpu size={40} />\n              </HoverCard.Target>\n              <HoverCard.Dropdown>\n                <Text fz=\"lg\" tt=\"uppercase\" fw={700} c=\"dimmed\" align=\"center\">\n                  {t('cpu.load')}\n                </Text>\n                <Flex\n                  direction={{ base: 'column', sm: 'row' }}\n                  gap={{ base: 'sm', sm: 'lg' }}\n                  justify={{ sm: 'center' }}\n                >\n                  {loadData.map((load: LoadDataItem) => (\n                    <RingProgress\n                      size={80}\n                      roundCaps\n                      thickness={8}\n                      label={\n                        <Text color={load.color} weight={700} align=\"center\" size=\"xl\">\n                          {load.progress}\n                        </Text>\n                      }\n                      sections={[{ value: load.progress, color: load.color, tooltip: load.label }]}\n                    />\n                  ))}\n                </Flex>\n              </HoverCard.Dropdown>\n            </HoverCard>\n          </Center>\n        }\n        sections={[\n          {\n            value: info.cpuUtilization.toFixed(2),\n            color: info.cpuUtilization.toFixed(2) > 70 ? 'red' : 'green',\n          },\n        ]}\n      />\n      {cpuTemp && (\n        <RingProgress\n          roundCaps\n          size={120}\n          thickness={12}\n          label={\n            <Center\n              style={{\n                flexDirection: 'column',\n              }}\n            >\n              {fahrenheit ? `${toFahrenheit(cpuTemp.cputemp)}°F` : `${cpuTemp.cputemp}°C`}\n              <IconCpu size={40} />\n            </Center>\n          }\n          sections={[\n            {\n              value: cpuTemp.cputemp,\n              color: cpuTemp.cputemp < 60 ? 'green' : 'red',\n            },\n          ]}\n        />\n      )}\n    </Group>\n  );\n};\n\nexport default HealthMonitoringCpu;\n"
  },
  {
    "path": "src/widgets/health-monitoring/HealthMonitoringFileSystem.tsx",
    "content": "import { Center, Flex, Group, HoverCard, RingProgress, Text } from '@mantine/core';\nimport { IconServer } from '@tabler/icons-react';\nimport { useTranslation } from 'react-i18next';\nimport { humanFileSize } from '~/tools/humanFileSize';\n\nimport { ringColor } from './HealthMonitoringTile';\n\nconst HealthMonitoringFileSystem = ({ fileSystem }: any) => {\n  const { t } = useTranslation('modules/health-monitoring');\n\n  interface FileSystemDisk {\n    devicename: string;\n    used: string;\n    percentage: number;\n    available: number;\n  }\n\n  const sortedFileSystem = fileSystem.slice().sort((a: FileSystemDisk, b: FileSystemDisk) => {\n    return a.devicename.localeCompare(b.devicename);\n  });\n\n  return (\n    <Group position=\"center\">\n      <Flex\n        direction={{ base: 'column', sm: 'row' }}\n        gap={{ base: 'sm', sm: 'lg' }}\n        justify={{ sm: 'center' }}\n      >\n        {sortedFileSystem.map((disk: FileSystemDisk) => (\n          <RingProgress\n            size={120}\n            roundCaps\n            thickness={12}\n            label={\n              <Center style={{ flexDirection: 'column' }}>\n                {disk.devicename}\n                <HoverCard width={280} radius=\"sm\" position=\"top-end\" withinPortal>\n                  <HoverCard.Target>\n                    <IconServer size={40} />\n                  </HoverCard.Target>\n                  <HoverCard.Dropdown>\n                    <Text fz=\"lg\" tt=\"uppercase\" fw={700} c=\"dimmed\" align=\"center\">\n                      {t('fileSystem.available', {\n                        available: humanFileSize(disk.available),\n                        percentage: 100 - disk.percentage,\n                      })}\n                    </Text>\n                  </HoverCard.Dropdown>\n                </HoverCard>\n              </Center>\n            }\n            sections={[\n              {\n                value: disk.percentage,\n                color: ringColor(disk.percentage),\n                tooltip: disk.used,\n              },\n            ]}\n          />\n        ))}\n      </Flex>\n    </Group>\n  );\n};\n\nexport default HealthMonitoringFileSystem;\n"
  },
  {
    "path": "src/widgets/health-monitoring/HealthMonitoringMemory.tsx",
    "content": "import { Center, Group, HoverCard, RingProgress, Text } from '@mantine/core';\nimport { IconBrain } from '@tabler/icons-react';\nimport { useTranslation } from 'react-i18next';\n\nimport { ringColor } from './HealthMonitoringTile';\n\nconst HealthMonitoringMemory = ({ info }: any) => {\n  const { t } = useTranslation('modules/health-monitoring');\n  const totalMemoryGB: any = (info.memTotal / 1024 ** 3).toFixed(2);\n  const freeMemoryGB: any = (info.memAvailable / 1024 ** 3).toFixed(2);\n  const usedMemoryGB: any = ((info.memTotal - info.memAvailable) / 1024 ** 3).toFixed(2);\n  const percentageUsed: any = ((usedMemoryGB / totalMemoryGB) * 100).toFixed(2);\n  const percentageFree: any = (100 - percentageUsed).toFixed(2);\n\n  return (\n    <Group position=\"center\">\n      <RingProgress\n        roundCaps\n        size={120}\n        thickness={12}\n        label={\n          <Center style={{ flexDirection: 'column' }}>\n            {usedMemoryGB}GiB\n            <HoverCard width={280} shadow=\"md\" position=\"top\" withinPortal>\n              <HoverCard.Target>\n                <IconBrain size={40} />\n              </HoverCard.Target>\n              <HoverCard.Dropdown>\n                <Text fz=\"lg\" tt=\"uppercase\" fw={700} c=\"dimmed\" align=\"center\">\n                  {t('memory.totalMem', { total: totalMemoryGB })}\n                </Text>\n                <Text fz=\"lg\" fw={500} align=\"center\">\n                  {t('memory.available', { available: freeMemoryGB, percentage: percentageFree })}\n                </Text>\n              </HoverCard.Dropdown>\n            </HoverCard>\n          </Center>\n        }\n        sections={[\n          {\n            value: percentageUsed,\n            color: ringColor(percentageUsed),\n          },\n        ]}\n      />\n    </Group>\n  );\n};\n\nexport default HealthMonitoringMemory;\n"
  },
  {
    "path": "src/widgets/health-monitoring/HealthMonitoringTile.tsx",
    "content": "import { Card, Center, Divider, Group, ScrollArea, Stack, Tabs, Text, Title } from '@mantine/core';\nimport {\n  IconAlertTriangle,\n  IconCloudDownload,\n  IconHeartRateMonitor,\n  IconInfoSquare,\n  IconStatusChange,\n} from '@tabler/icons-react';\nimport dayjs from 'dayjs';\nimport duration from 'dayjs/plugin/duration';\nimport { useTranslation } from 'next-i18next';\nimport { useConfigContext } from '~/config/provider';\nimport { api } from '~/utils/api';\n\nimport { defineWidget } from '../helper';\nimport { WidgetLoading } from '../loading';\nimport { IWidget } from '../widgets';\nimport HealthMonitoringCpu from './HealthMonitoringCpu';\nimport HealthMonitoringFileSystem from './HealthMonitoringFileSystem';\nimport HealthMonitoringMemory from './HealthMonitoringMemory';\nimport { ClusterStatusTile } from './cluster/HealthMonitoringClusterTile';\n\ndayjs.extend(duration);\n\nconst defaultViewStates = ['none', 'node', 'vm', 'lxc', 'storage'] as const;\ntype DefaultViewState = (typeof defaultViewStates)[number];\n\nconst indicatorColorControls = ['all', 'any'] as const;\ntype IndicatorColorControl = (typeof indicatorColorControls)[number];\n\nconst defaultTabStates = ['system', 'cluster'] as const;\ntype DefaultTabStates = (typeof defaultTabStates)[number];\n\nconst definition = defineWidget({\n  id: 'health-monitoring',\n  icon: IconHeartRateMonitor,\n  options: {\n    fahrenheit: {\n      type: 'switch',\n      defaultValue: false,\n    },\n    cpu: {\n      type: 'switch',\n      defaultValue: true,\n    },\n    memory: {\n      type: 'switch',\n      defaultValue: true,\n    },\n    fileSystem: {\n      type: 'switch',\n      defaultValue: true,\n    },\n    defaultTabState: {\n      type: 'select',\n      defaultValue: 'system' as DefaultTabStates,\n      data: defaultTabStates.map((stateValue) => ({ value: stateValue })),\n      info: true,\n    },\n    node: {\n      type: 'text',\n      defaultValue: '',\n      info: true,\n    },\n    defaultViewState: {\n      type: 'select',\n      defaultValue: 'none' as DefaultViewState,\n      data: defaultViewStates.map((stateValue) => ({ value: stateValue })),\n    },\n    summary: {\n      type: 'switch',\n      defaultValue: true,\n    },\n    showNode: {\n      type: 'switch',\n      defaultValue: true,\n    },\n    showVM: {\n      type: 'switch',\n      defaultValue: true,\n    },\n    showLXCs: {\n      type: 'switch',\n      defaultValue: true,\n    },\n    showStorage: {\n      type: 'switch',\n      defaultValue: true,\n    },\n    sectionIndicatorColor: {\n      type: 'select',\n      defaultValue: 'all' as IndicatorColorControl,\n      data: indicatorColorControls.map((sectionColor) => ({ value: sectionColor })),\n      info: true,\n    },\n    ignoreCert: {\n      type: 'switch',\n      defaultValue: true,\n      info: true,\n    },\n  },\n  gridstack: {\n    minWidth: 2,\n    minHeight: 2,\n    maxWidth: 12,\n    maxHeight: 12,\n  },\n  component: HealthMonitoringWidgetTile,\n});\n\nexport type IHealthMonitoringWidget = IWidget<(typeof definition)['id'], typeof definition>;\n\ninterface HealthMonitoringWidgetProps {\n  widget: IHealthMonitoringWidget;\n}\nfunction HealthMonitoringWidgetTile({ widget }: HealthMonitoringWidgetProps) {\n  const { t } = useTranslation('modules/health-monitoring');\n  let { data, isInitialLoading, isError } = useStatusQuery(\n    widget.properties.node,\n    widget.properties.ignoreCert\n  );\n\n  if (isInitialLoading) {\n    return <WidgetLoading />;\n  }\n\n  if (isError || !data) {\n    return (\n      <Center>\n        <Stack align=\"center\">\n          <IconAlertTriangle />\n          <Title order={6}>{t('errors.general.title')}</Title>\n          <Text>{t('errors.general.text')}</Text>\n        </Stack>\n      </Center>\n    );\n  }\n\n  if (data.system && data.cluster) {\n    return (\n      <ScrollArea\n        h=\"100%\"\n        styles={{\n          viewport: {\n            '& div[style=\"min-width: 100%\"]': {\n              display: 'flex !important',\n              height: '100%',\n            },\n          },\n        }}\n      >\n        <Tabs defaultValue={widget.properties.defaultTabState} variant=\"outline\">\n          <Tabs.List grow>\n            <Tabs.Tab value=\"system\">\n              <b>{t('headings.system')}</b>\n            </Tabs.Tab>\n            <Tabs.Tab value=\"cluster\">\n              <b>{t('headings.cluster')}</b>\n            </Tabs.Tab>\n          </Tabs.List>\n          <Tabs.Panel mt=\"lg\" value=\"system\">\n            <SystemStatusTile data={data.system} properties={widget.properties} />\n          </Tabs.Panel>\n          <Tabs.Panel mt=\"lg\" value=\"cluster\">\n            <ClusterStatusTile data={data.cluster} properties={widget.properties} />\n          </Tabs.Panel>\n        </Tabs>\n      </ScrollArea>\n    );\n  } else {\n    return (\n      <ScrollArea\n        h=\"100%\"\n        styles={{\n          viewport: {\n            '& div[style=\"min-width: 100%\"]': {\n              display: 'flex !important',\n              height: '100%',\n            },\n          },\n        }}\n      >\n        {data.system && <SystemStatusTile data={data.system} properties={widget.properties} />}\n        {data.cluster && <ClusterStatusTile data={data.cluster} properties={widget.properties} />}\n      </ScrollArea>\n    );\n  }\n}\n\nconst SystemStatusTile = ({ data, properties }: { data: any; properties: any }) => {\n  const { t } = useTranslation('modules/health-monitoring');\n\n  return (\n    <Stack>\n      <Card>\n        <Group position=\"center\">\n          <IconInfoSquare size={40} />\n          <Text fz=\"lg\" tt=\"uppercase\" fw={700} c=\"dimmed\" align=\"center\">\n            {t('info.uptime')}:\n            <br />\n            {formatUptime(data.systemInfo.uptime)}\n          </Text>\n          <Group position=\"center\">\n            {data.systemInfo.availablePkgUpdates === 0 ? (\n              ''\n            ) : (\n              <IconCloudDownload size={40} color=\"red\" />\n            )}\n            {data.systemInfo.rebootRequired ? <IconStatusChange size={40} color=\"red\" /> : ''}\n          </Group>\n        </Group>\n      </Card>\n      <Divider my=\"sm\" />\n      <Group position=\"center\">\n        {properties.cpu && (\n          <HealthMonitoringCpu\n            info={data.systemInfo}\n            cpuTemp={data.cpuTemp}\n            fahrenheit={properties.fahrenheit}\n          />\n        )}\n        {properties.memory && <HealthMonitoringMemory info={data.systemInfo} />}\n      </Group>\n      {properties.fileSystem && (\n        <>\n          <Divider my=\"sm\" />\n          <HealthMonitoringFileSystem fileSystem={data.fileSystem} />\n        </>\n      )}\n    </Stack>\n  );\n};\n\nexport const ringColor = (percentage: number) => {\n  if (percentage < 30) return 'green';\n  else if (percentage < 60) return 'yellow';\n  else if (percentage < 90) return 'orange';\n  else return 'red';\n};\n\nexport const getIntegrations = () => {\n  const { name: configName } = useConfigContext();\n  return api.healthMonitoring.integrations.useQuery(\n    {\n      configName: configName!,\n    },\n    {\n      staleTime: 1000 * 10,\n    }\n  );\n};\n\nconst useStatusQuery = (node: string, ignoreCerts: boolean) => {\n  const { name: configName } = useConfigContext();\n\n  return api.healthMonitoring.fetchData.useQuery(\n    {\n      configName: configName!,\n      filterNode: node!,\n      ignoreCerts: ignoreCerts!,\n    },\n    {\n      refetchInterval: 5000,\n    }\n  );\n};\n\nexport default definition;\n\nexport const formatUptime = (uptime: number) => {\n  const { t } = useTranslation('modules/health-monitoring');\n  const time = dayjs.duration(uptime, 's');\n  return t('info.uptimeFormat', {\n    days: Math.floor(time.asDays()),\n    hours: time.hours(),\n    minutes: time.minutes(),\n  });\n};\n"
  },
  {
    "path": "src/widgets/health-monitoring/cluster/HealthMonitoringClusterDetailPopover.tsx",
    "content": "import {\n  Badge,\n  Center,\n  Divider,\n  Flex,\n  Group,\n  List,\n  RingProgress,\n  Stack,\n  Text,\n} from '@mantine/core';\nimport {\n  IconArrowNarrowDown,\n  IconArrowNarrowUp,\n  IconBrain,\n  IconClockHour3,\n  IconCpu,\n  IconCube,\n  IconDatabase,\n  IconDeviceLaptop,\n  IconHeartBolt,\n  IconNetwork,\n  IconServer,\n} from '@tabler/icons-react';\nimport dayjs from 'dayjs';\nimport duration from 'dayjs/plugin/duration';\nimport { useTranslation } from 'react-i18next';\nimport { humanFileSize } from '~/tools/humanFileSize';\nimport { ResourceData } from '~/widgets/health-monitoring/cluster/types';\n\ndayjs.extend(duration);\n\nexport const ResourceTypeEntryDetails = ({ entry }: { entry: ResourceData }) => {\n  const { t } = useTranslation('modules/health-monitoring');\n  return (\n    <Stack spacing={0}>\n      <Group noWrap align=\"start\" position=\"apart\">\n        <Group noWrap align=\"center\">\n          <ResourceIcon entry={entry} size={35} />\n          <Stack spacing={0}>\n            <Text fw={700} size=\"md\">\n              {entry.name}\n            </Text>\n            <Text color={entry.running ? 'green' : 'yellow'}>{capitalize(entry.status)}</Text>\n          </Stack>\n        </Group>\n        <Group align=\"end\">\n          {entry.type !== 'node' && (\n            <Stack align=\"end\" spacing={0}>\n              <Text fw={200} size=\"sm\">\n                {t('cluster.popover.node')}\n              </Text>\n              <Text color=\"dimmed\" size=\"xs\">\n                {entry.node}\n              </Text>\n            </Stack>\n          )}\n          {(entry.type === 'lxc' || entry.type === 'vm') && (\n            <Stack align=\"end\" spacing={0}>\n              <Text fw={200} size=\"sm\">\n                {t('cluster.popover.vmid')}\n              </Text>\n              <Text color=\"dimmed\" size=\"xs\">\n                {entry.vmId}\n              </Text>\n            </Stack>\n          )}\n          {entry.type === 'storage' && (\n            <Stack align=\"end\" spacing={0}>\n              <Text fw={200} size=\"sm\">\n                {t('cluster.popover.plugin')}\n              </Text>\n              <Text color=\"dimmed\" size=\"xs\">\n                {entry.storagePlugin}\n              </Text>\n            </Stack>\n          )}\n        </Group>\n      </Group>\n      <Divider mt={0} mb=\"xs\" />\n      {entry.type !== 'storage' && <ComputeResourceDetails entry={entry} />}\n      {entry.type === 'storage' && <StorageResourceDetails entry={entry} />}\n    </Stack>\n  );\n};\n\nconst ComputeResourceDetails = ({ entry }: { entry: ResourceData }) => {\n  const { t } = useTranslation('modules/health-monitoring');\n  return (\n    <List>\n      <List.Item icon={<IconCpu size={16} />}>\n        {t('cluster.popover.cores', { maxCpu: entry.maxCpu })}\n      </List.Item>\n      <List.Item icon={<IconBrain size={16} />}>{displayMemoryText(entry)}</List.Item>\n      <List.Item icon={<IconDatabase size={16} />}>{displayDiskText(entry)}</List.Item>\n      <List.Item icon={<IconClockHour3 size={16} />}>\n        {t('cluster.popover.uptime', { uptime: formatUptime(entry) })}\n      </List.Item>\n      {entry.haState && (\n        <List.Item icon={<IconHeartBolt size={16} />}>\n          {t('cluster.popover.ha', { haState: capitalize(entry.haState) })}\n        </List.Item>\n      )}\n      <NetStats entry={entry} />\n      <DiskStats entry={entry} />\n    </List>\n  );\n};\n\nconst StorageResourceDetails = ({ entry }: { entry: ResourceData }) => {\n  const storagePercent = entry.maxDisk ? (entry.disk / entry.maxDisk) * 100 : 0;\n  return (\n    <Stack spacing={0}>\n      <Center>\n        <RingProgress\n          roundCaps\n          size={100}\n          thickness={10}\n          label={<Text ta=\"center\">{storagePercent.toFixed(1)}%</Text>}\n          sections={[{ value: storagePercent, color: storagePercent > 75 ? 'orange' : 'green' }]}\n        />\n        <Group align=\"center\" spacing={0}>\n          <Text>{displayDiskText(entry, false)}</Text>\n        </Group>\n      </Center>\n      <Flex gap=\"sm\" mt={0} justify=\"end\">\n        <StorageType entry={entry} />\n      </Flex>\n    </Stack>\n  );\n};\n\nconst DiskStats = ({ entry }: { entry: ResourceData }) => {\n  if (!entry.diskWrite || !entry.diskRead) {\n    return null;\n  }\n  return (\n    <List.Item icon={<IconDatabase size={16} />}>\n      <Group spacing=\"sm\">\n        <Group spacing={0}>\n          <Text>{humanFileSize(entry.diskWrite, false)}</Text>\n          <IconArrowNarrowDown size={14} />\n        </Group>\n        <Group spacing={0}>\n          <Text>{humanFileSize(entry.diskRead, false)}</Text>\n          <IconArrowNarrowUp size={14} />\n        </Group>\n      </Group>\n    </List.Item>\n  );\n};\n\nconst NetStats = ({ entry }: { entry: ResourceData }) => {\n  if (!entry.netIn || !entry.netOut) {\n    return null;\n  }\n  return (\n    <List.Item icon={<IconNetwork size={16} />}>\n      <Group spacing=\"sm\">\n        <Group spacing={0}>\n          <Text>{humanFileSize(entry.netIn, false)}</Text>\n          <IconArrowNarrowDown size={14} />\n        </Group>\n        <Group spacing={0}>\n          <Text>{humanFileSize(entry.netOut, false)}</Text>\n          <IconArrowNarrowUp size={14} />\n        </Group>\n      </Group>\n    </List.Item>\n  );\n};\n\nconst StorageType = ({ entry }: { entry: ResourceData }) => {\n  const { t } = useTranslation('modules/health-monitoring');\n  if (entry.storageShared) {\n    return <Badge color=\"blue\">{t('cluster.popover.sharedStorage')}</Badge>;\n  } else {\n    return <Badge color=\"teal\">{t('cluster.popover.localStorage')}</Badge>;\n  }\n};\n\nconst capitalize = (input: string) => {\n  return input[0].toUpperCase() + input.slice(1);\n};\n\nconst ResourceIcon = ({ entry, size }: { entry: ResourceData; size: number }) => {\n  if (entry.type === 'node') {\n    return <IconServer size={size} />;\n  } else if (entry.type === 'qemu') {\n    return <IconDeviceLaptop size={size} />;\n  } else if (entry.type === 'storage') {\n    return <IconDatabase size={size} />;\n  } else {\n    return <IconCube size={size} />;\n  }\n};\n\nconst displayMemoryText = (entry: ResourceData) => {\n  const { t } = useTranslation('modules/health-monitoring');\n  if (!entry.maxMem) {\n    return t('cluster.popover.memSize', { maxMem: humanFileSize(0, false) });\n  } else if (!entry.mem) {\n    return t('cluster.popover.memSize', { maxMem: humanFileSize(entry.maxMem, false) });\n  } else {\n    return t('cluster.popover.memRatio', {\n      usedMem: humanFileSize(entry.mem, false),\n      maxMem: humanFileSize(entry.maxMem, false),\n    });\n  }\n};\n\nconst displayDiskText = (entry: ResourceData, useTrans: boolean = true) => {\n  const { t } = useTranslation('modules/health-monitoring');\n  const maxDisk = !entry.maxDisk ? humanFileSize(0, false) : humanFileSize(entry.maxDisk, false);\n  const disk = !entry.disk ? humanFileSize(0, false) : humanFileSize(entry.disk, false);\n\n  if (!entry.maxDisk || !entry.disk) {\n    return useTrans ? t('cluster.popover.diskSize', { maxDisk: maxDisk }) : maxDisk;\n  } else {\n    return useTrans\n      ? t('cluster.popover.diskRatio', { usedDisk: disk, maxDisk: maxDisk })\n      : disk + ' / ' + maxDisk;\n  }\n};\n\nconst formatUptime = (entry: ResourceData) => {\n  const { t } = useTranslation('modules/health-monitoring');\n  if (entry.uptime > 0) {\n    return dayjs.duration(entry.uptime * 1000).humanize();\n  }\n  return t('cluster.popover.na');\n};\n"
  },
  {
    "path": "src/widgets/health-monitoring/cluster/HealthMonitoringClusterResourceRow.tsx",
    "content": "import { Accordion, Badge, Group, Indicator, Popover, Table, Text } from '@mantine/core';\nimport { TablerIconsProps } from '@tabler/icons-react';\nimport { useTranslation } from 'react-i18next';\nimport { ResourceTypeEntryDetails } from '~/widgets/health-monitoring/cluster/HealthMonitoringClusterDetailPopover';\nimport { ResourceData } from '~/widgets/health-monitoring/cluster/types';\n\ninterface ResourceType {\n  data: ResourceData[];\n  icon: (props: TablerIconsProps) => JSX.Element;\n  title: string;\n  count: number;\n  length: number;\n  indicatorColorControl: string;\n}\n\ninterface ResourceTypeProps {\n  item: ResourceType;\n  id: string;\n  include: boolean;\n  tableConfig: TableViewConfig;\n}\n\ninterface TableViewConfig {\n  showCpu: boolean;\n  showRam: boolean;\n  showNode: boolean;\n}\n\nconst indicatorColorControl = (entry: ResourceType) => {\n  return (entry.indicatorColorControl === 'all' && entry.count == entry.length) ||\n    (entry.indicatorColorControl === 'any' && entry.count > 0)\n    ? 'green'\n    : 'orange';\n};\n\nexport const ResourceType = ({ item, id, include, tableConfig }: ResourceTypeProps) => {\n  const { t } = useTranslation('modules/health-monitoring');\n  if (!include) {\n    return null;\n  }\n  return (\n    <Accordion.Item value={id}>\n      <Accordion.Control icon={<item.icon />}>\n        <Group style={{ rowGap: '0' }}>\n          <Text>{item.title}</Text>\n          <Badge variant=\"dot\" color={indicatorColorControl(item)} size=\"lg\">\n            {item.count} / {item.length}\n          </Badge>\n        </Group>\n      </Accordion.Control>\n      <Accordion.Panel>\n        <Table highlightOnHover>\n          <thead>\n            <tr>\n              <th>{t('cluster.table.header.name')}</th>\n              {tableConfig.showCpu && <th>{t('cluster.table.header.cpu')}</th>}\n              {tableConfig.showRam && <th>{t('cluster.table.header.ram')}</th>}\n              {tableConfig.showNode && <th>{t('cluster.table.header.node')}</th>}\n            </tr>\n          </thead>\n          <tbody>\n            {item.data.map((data) => {\n              return <ResourceTypeEntry entry={data} tableConfig={tableConfig} />;\n            })}\n          </tbody>\n        </Table>\n      </Accordion.Panel>\n    </Accordion.Item>\n  );\n};\n\ninterface ResourceTypeEntryProps {\n  entry: ResourceData;\n  tableConfig: TableViewConfig;\n}\n\nconst ResourceTypeEntry = ({ entry, tableConfig }: ResourceTypeEntryProps) => {\n  return (\n    <Popover\n      withArrow\n      withinPortal\n      radius=\"lg\"\n      shadow=\"sm\"\n      transitionProps={{\n        transition: 'pop',\n      }}\n    >\n      <Popover.Target>\n        <tr>\n          <td>\n            <Group noWrap>\n              <Indicator size={14} children={null} color={entry.running ? 'green' : 'yellow'} />\n              <Text lineClamp={1}>{entry.name}</Text>\n            </Group>\n          </td>\n          {tableConfig.showCpu && (\n            <td style={{ whiteSpace: 'nowrap' }}>{(entry.cpu * 100).toFixed(1)}%</td>\n          )}\n          {tableConfig.showRam && (\n            <td style={{ whiteSpace: 'nowrap' }}>\n              {(entry.maxMem ? (entry.mem / entry.maxMem) * 100 : 0).toFixed(1)}%\n            </td>\n          )}\n          {tableConfig.showNode && <td style={{ WebkitLineClamp: '1' }}>{entry.node}</td>}\n        </tr>\n      </Popover.Target>\n      <Popover.Dropdown>\n        <ResourceTypeEntryDetails entry={entry} />\n      </Popover.Dropdown>\n    </Popover>\n  );\n};\n"
  },
  {
    "path": "src/widgets/health-monitoring/cluster/HealthMonitoringClusterTile.tsx",
    "content": "import { Accordion, Card, Center, Flex, Group, RingProgress, Stack, Text } from '@mantine/core';\nimport {\n  IconBrain,\n  IconCpu,\n  IconCube,\n  IconDatabase,\n  IconDeviceLaptop,\n  IconInfoSquare,\n  IconServer,\n} from '@tabler/icons-react';\nimport { useTranslation } from 'react-i18next';\nimport { ResourceData } from '~/widgets/health-monitoring/cluster/types';\n\nimport { formatUptime } from '../HealthMonitoringTile';\nimport { ResourceType } from './HealthMonitoringClusterResourceRow';\n\nexport const ClusterStatusTile = ({ data, properties }: { data: any; properties: any }) => {\n  const { t } = useTranslation('modules/health-monitoring');\n\n  const running = (total: number, current: ResourceData) => {\n    return current.running ? total + 1 : total;\n  };\n\n  const activeNodes = data.nodes.reduce(running, 0);\n  const activeVMs = data.vms.reduce(running, 0);\n  const activeLXCs = data.lxcs.reduce(running, 0);\n  const activeStorage = data.storage.reduce(running, 0);\n\n  const usedMem = data.nodes.reduce(\n    (sum: number, item: ResourceData) => (item.running ? item.mem + sum : sum),\n    0\n  );\n  const maxMem = data.nodes.reduce(\n    (sum: number, item: ResourceData) => (item.running ? item.maxMem + sum : sum),\n    0\n  );\n  const maxCpu = data.nodes.reduce(\n    (sum: number, item: ResourceData) => (item.running ? item.maxCpu + sum : sum),\n    0\n  );\n  const usedCpu = data.nodes.reduce(\n    (sum: number, item: ResourceData) => (item.running ? item.cpu * item.maxCpu + sum : sum),\n    0\n  );\n  const uptime = data.nodes.reduce(\n    (sum: number, { uptime }: ResourceData) => (sum > uptime ? sum : uptime),\n    0\n  );\n\n  const cpuPercent = (usedCpu / maxCpu) * 100;\n  const memPercent = (usedMem / maxMem) * 100;\n\n  return (\n    <Stack h=\"100%\">\n      <Card>\n        <Group position=\"center\">\n          <IconInfoSquare size={40} />\n          <Text fz=\"lg\" tt=\"uppercase\" fw={700} c=\"dimmed\" align=\"center\">\n            {t('info.uptime')}:\n            <br />\n            {formatUptime(uptime)}\n          </Text>\n        </Group>\n      </Card>\n      <SummaryHeader cpu={cpuPercent} memory={memPercent} include={properties.summary} />\n      <Accordion\n        variant=\"contained\"\n        chevronPosition=\"right\"\n        defaultValue={properties.defaultViewState}\n      >\n        <ResourceType\n          item={{\n            data: data.nodes,\n            icon: IconServer,\n            title: t('cluster.accordion.title.nodes'),\n            count: activeNodes,\n            length: data.nodes.length,\n            indicatorColorControl: properties.sectionIndicatorColor,\n          }}\n          id={'node'}\n          include={properties.showNode}\n          tableConfig={{ showCpu: true, showRam: true, showNode: false }}\n        />\n        <ResourceType\n          item={{\n            data: data.vms,\n            icon: IconDeviceLaptop,\n            title: t('cluster.accordion.title.vms'),\n            count: activeVMs,\n            length: data.vms.length,\n            indicatorColorControl: properties.sectionIndicatorColor,\n          }}\n          id={'vm'}\n          include={properties.showVM}\n          tableConfig={{ showCpu: true, showRam: true, showNode: false }}\n        />\n        <ResourceType\n          item={{\n            data: data.lxcs,\n            icon: IconCube,\n            title: t('cluster.accordion.title.lxcs'),\n            count: activeLXCs,\n            length: data.lxcs.length,\n            indicatorColorControl: properties.sectionIndicatorColor,\n          }}\n          id={'lxc'}\n          include={properties.showLXCs}\n          tableConfig={{ showCpu: true, showRam: true, showNode: false }}\n        />\n        <ResourceType\n          item={{\n            data: data.storage,\n            icon: IconDatabase,\n            title: t('cluster.accordion.title.storage'),\n            count: activeStorage,\n            length: data.storage.length,\n            indicatorColorControl: properties.sectionIndicatorColor,\n          }}\n          id={'storage'}\n          include={properties.showStorage}\n          tableConfig={{ showCpu: false, showRam: false, showNode: true }}\n        />\n      </Accordion>\n    </Stack>\n  );\n};\n\ninterface SummaryHeaderProps {\n  cpu: number;\n  memory: number;\n  include: boolean;\n}\n\nconst SummaryHeader = ({ cpu, memory, include }: SummaryHeaderProps) => {\n  const { t } = useTranslation('modules/health-monitoring');\n  if (!include) return null;\n\n  return (\n    <Center>\n      <Group noWrap>\n        <Flex direction=\"row\">\n          <RingProgress\n            roundCaps\n            size={60}\n            thickness={6}\n            label={\n              <Center>\n                <IconCpu />\n              </Center>\n            }\n            sections={[{ value: cpu, color: cpu > 75 ? 'orange' : 'green' }]}\n          />\n          <Stack align=\"center\" justify=\"center\" spacing={0}>\n            <Text weight={500}>{t('cluster.summary.cpu')}</Text>\n            <Text>{cpu.toFixed(1)}%</Text>\n          </Stack>\n        </Flex>\n        <Flex>\n          <RingProgress\n            roundCaps\n            size={60}\n            thickness={6}\n            label={\n              <Center>\n                <IconBrain />\n              </Center>\n            }\n            sections={[{ value: memory, color: memory > 75 ? 'orange' : 'green' }]}\n          />\n          <Stack align=\"center\" justify=\"center\" spacing={0}>\n            <Text weight={500}>{t('cluster.summary.ram')}</Text>\n            <Text>{memory.toFixed(1)}%</Text>\n          </Stack>\n        </Flex>\n      </Group>\n    </Center>\n  );\n};\n"
  },
  {
    "path": "src/widgets/health-monitoring/cluster/types.ts",
    "content": "export type ResourceSummary = {\n  vms: ResourceData[];\n  lxcs: ResourceData[];\n  nodes: ResourceData[];\n  storage: ResourceData[];\n};\n\nexport type ResourceData = {\n  id: string;\n  cpu: number;\n  maxCpu: number;\n  maxMem: number;\n  mem: number;\n  name: string;\n  node: string;\n  status: string;\n  running: boolean;\n  type: string;\n  uptime: number;\n  vmId: number;\n  netIn: number;\n  netOut: number;\n  diskRead: number;\n  diskWrite: number;\n  disk: number;\n  maxDisk: number;\n  haState: string;\n  storagePlugin: string;\n  storageShared: boolean;\n};"
  },
  {
    "path": "src/widgets/helper.ts",
    "content": "// Method which allows to define the type verry specific and type checks all\nimport { IWidgetDefinition } from './widgets';\n\n// The options of IWidgetDefinition are so heavily typed that it even used 'true' as type\nexport const defineWidget = <TKey extends string, TOptions extends IWidgetDefinition<TKey>>(\n  options: TOptions\n) => options;\n"
  },
  {
    "path": "src/widgets/iframe/IFrameTile.tsx",
    "content": "import { Center, Container, Stack, Text, Title, createStyles } from '@mantine/core';\nimport { IconBrowser, IconUnlink } from '@tabler/icons-react';\nimport { useTranslation } from 'next-i18next';\n\nimport { defineWidget } from '../helper';\nimport { IWidget } from '../widgets';\n\nfunction sanitizeUrl(url: string) {\n  let parsedUrl: URL;\n  try {\n    parsedUrl = new URL(url);\n  } catch (e) {\n    return 'about:blank';\n  }\n  if (['http:', 'https:'].includes(parsedUrl.protocol)) {\n    return parsedUrl.href;\n  } else {\n    throw new Error(`Protocol '${parsedUrl.protocol}' is not supported. Use HTTP or HTTPS.`);\n  }\n}\n\nconst definition = defineWidget({\n  id: 'iframe',\n  icon: IconBrowser,\n  gridstack: {\n    maxHeight: 12,\n    maxWidth: 12,\n    minHeight: 1,\n    minWidth: 1,\n  },\n  options: {\n    embedUrl: {\n      type: 'text',\n      defaultValue: '',\n    },\n    allowFullScreen: {\n      type: 'switch',\n      defaultValue: false,\n    },\n    allowScrolling: {\n      type: 'switch',\n      defaultValue: true,\n    },\n    allowTransparency: {\n      type: 'switch',\n      defaultValue: false,\n    },\n    allowPayment: {\n      type: 'switch',\n      defaultValue: false,\n    },\n    allowAutoPlay: {\n      type: 'switch',\n      defaultValue: false,\n    },\n    allowMicrophone: {\n      type: 'switch',\n      defaultValue: false,\n    },\n    allowCamera: {\n      type: 'switch',\n      defaultValue: false,\n    },\n    allowGeolocation: {\n      type: 'switch',\n      defaultValue: false,\n    },\n  },\n  component: IFrameTile,\n});\n\nexport type IIFrameWidget = IWidget<(typeof definition)['id'], typeof definition>;\n\ninterface IFrameTileProps {\n  widget: IIFrameWidget;\n}\n\nfunction IFrameTile({ widget }: IFrameTileProps) {\n  const { t } = useTranslation('modules/iframe');\n  const { classes } = useStyles();\n\n  if (!widget.properties.embedUrl) {\n    return (\n      <Center h=\"100%\">\n        <Stack align=\"center\">\n          <IconUnlink size={36} strokeWidth={1.2} />\n          <Stack align=\"center\" spacing={0}>\n            <Title order={6} align=\"center\">\n              {t('card.errors.noUrl.title')}\n            </Title>\n            <Text align=\"center\" maw={200}>\n              {t('card.errors.noUrl.text')}\n            </Text>\n          </Stack>\n        </Stack>\n      </Center>\n    );\n  }\n\n  const allowedPermissions: string[] = [];\n\n  if (widget.properties.allowTransparency) {\n    allowedPermissions.push('transparency');\n  }\n\n  if (widget.properties.allowFullScreen) {\n    allowedPermissions.push('fullscreen');\n  }\n\n  if (widget.properties.allowPayment) {\n    allowedPermissions.push('payment');\n  }\n\n  if (widget.properties.allowAutoPlay) {\n    allowedPermissions.push('autoplay');\n  }\n\n  if (widget.properties.allowCamera) {\n    allowedPermissions.push('camera');\n  }\n\n  if (widget.properties.allowMicrophone) {\n    allowedPermissions.push('microphone');\n  }\n\n  if (widget.properties.allowGeolocation) {\n    allowedPermissions.push('geolocation');\n  }\n\n  return (\n    <Container h=\"100%\" w=\"100%\" maw=\"initial\" mah=\"initial\" p={0}>\n      <iframe\n        className={classes.iframe}\n        src={sanitizeUrl(widget.properties.embedUrl)}\n        title=\"widget iframe\"\n        allow={allowedPermissions.join(' ')}\n      >\n        <Text>{t('card.errors.browserSupport')}</Text>\n      </iframe>\n    </Container>\n  );\n}\n\nconst useStyles = createStyles(({ radius }) => ({\n  iframe: {\n    borderRadius: radius.sm,\n    width: '100%',\n    height: '100%',\n    border: 'none',\n    background: 'none',\n    backgroundColor: 'transparent',\n  },\n}));\n\nexport default definition;\n"
  },
  {
    "path": "src/widgets/index.ts",
    "content": "import bookmark from './bookmark/BookmarkWidgetTile';\nimport calendar from './calendar/CalendarTile';\nimport dashdot from './dashDot/DashDotTile';\nimport date from './date/DateTile';\nimport dnsHoleControls from './dnshole/DnsHoleControls';\nimport dnsHoleSummary from './dnshole/DnsHoleSummary';\nimport torrentNetworkTraffic from './download-speed/TorrentNetworkTrafficTile';\nimport healthMonitoring from './health-monitoring/HealthMonitoringTile';\nimport iframe from './iframe/IFrameTile';\nimport indexerManager from './indexer-manager/IndexerManagerTile';\nimport mediaRequestsList from './media-requests/MediaRequestListTile';\nimport mediaRequestsStats from './media-requests/MediaRequestStatsTile';\nimport mediaServer from './media-server/MediaServerTile';\nimport notebook from './notebook/NotebookWidgetTile';\nimport rss from './rss/RssWidgetTile';\nimport smartHomeEntityState from './smart-home/entity-state/entity-state.widget';\nimport smartHomeTriggerAutomation from './smart-home/trigger-automation/trigger-automation.widget';\nimport mediaTranscoding from '~/widgets/media-transcoding/MediaTranscodingTile';\nimport torrent from './torrent/TorrentTile';\nimport usenet from './useNet/UseNetTile';\nimport videoStream from './video/VideoStreamTile';\nimport weather from './weather/WeatherTile';\n\nexport default {\n  calendar,\n  'indexer-manager': indexerManager,\n  dashdot,\n  usenet,\n  weather,\n  'torrents-status': torrent,\n  dlspeed: torrentNetworkTraffic,\n  date,\n  rss,\n  'video-stream': videoStream,\n  iframe,\n  'media-server': mediaServer,\n  'media-requests-list': mediaRequestsList,\n  'media-requests-stats': mediaRequestsStats,\n  'dns-hole-summary': dnsHoleSummary,\n  'dns-hole-controls': dnsHoleControls,\n  bookmark,\n  notebook,\n  'smart-home/entity-state': smartHomeEntityState,\n  'smart-home/trigger-automation': smartHomeTriggerAutomation,\n  'health-monitoring': healthMonitoring,\n  'media-transcoding': mediaTranscoding,\n};\n"
  },
  {
    "path": "src/widgets/indexer-manager/IndexerManagerTile.tsx",
    "content": "import {\n  Anchor,\n  Button,\n  Card,\n  Flex,\n  Group,\n  ScrollArea,\n  Text,\n  useMantineTheme,\n} from '@mantine/core';\nimport { IconCircleCheck, IconCircleX, IconReportSearch, IconTestPipe } from '@tabler/icons-react';\nimport { useSession } from 'next-auth/react';\nimport { useTranslation } from 'next-i18next';\nimport { useConfigContext } from '~/config/provider';\nimport { api } from '~/utils/api';\n\nimport { defineWidget } from '../helper';\nimport { WidgetLoading } from '../loading';\nimport { IWidget } from '../widgets';\n\nconst definition = defineWidget({\n  id: 'indexer-manager',\n  icon: IconReportSearch,\n  options: {\n    openIndexerSiteInNewTab: {\n      type: 'switch',\n      defaultValue: true,\n    },\n  },\n  gridstack: {\n    minWidth: 1,\n    minHeight: 1,\n    maxWidth: 12,\n    maxHeight: 12,\n  },\n  component: IndexerManagerWidgetTile,\n});\n\nexport type IIndexerManagerWidget = IWidget<(typeof definition)['id'], typeof definition>;\n\ninterface IndexerManagerWidgetProps {\n  widget: IIndexerManagerWidget;\n}\n\nfunction IndexerManagerWidgetTile({ widget }: IndexerManagerWidgetProps) {\n  const { t } = useTranslation('modules/indexer-manager');\n  const mantineTheme = useMantineTheme();\n  const { data: sessionData } = useSession();\n  const { name: configName } = useConfigContext();\n  const utils = api.useUtils();\n  const { isLoading: testAllLoading, mutateAsync: testAllAsync } =\n    api.indexerManager.testAllIndexers.useMutation({\n      onSuccess: async () => {\n        await utils.indexerManager.invalidate();\n      },\n    });\n  const { isInitialLoading: indexersLoading, data: indexersData } =\n    api.indexerManager.indexers.useQuery({\n      configName: configName!,\n    });\n  const { isInitialLoading: statusesLoading, data: statusesData } =\n    api.indexerManager.statuses.useQuery(\n      {\n        configName: configName!,\n      },\n      {\n        refetchInterval: 1000 * 60 * 2,\n      }\n    );\n  if (indexersLoading || !indexersData || statusesLoading) {\n    return <WidgetLoading />;\n  }\n\n  return (\n    <Flex h=\"100%\" gap={0} direction=\"column\">\n      <Text mt={2}>{t('indexersStatus.title')}</Text>\n      <Card py={5} px={10} radius=\"md\" withBorder style={{ flex: '1' }}>\n        <ScrollArea h=\"100%\">\n          {indexersData.map((indexer: any) => (\n            <Group key={indexer.id} position=\"apart\">\n              <Anchor\n                href={indexer.indexerUrls[0]}\n                target={widget.properties.openIndexerSiteInNewTab ? '_blank' : '_self'}\n                c={mantineTheme.colorScheme === 'dark' ? 'gray.3' : 'gray.8'}\n              >\n                <Text color=\"dimmed\" align=\"center\" size=\"xs\">\n                  {indexer.name}\n                </Text>\n              </Anchor>\n              {!statusesData.find((status: any) => indexer.id === status.indexerId) &&\n              indexer.enable ? (\n                <IconCircleCheck color=\"#2ecc71\" />\n              ) : (\n                <IconCircleX color=\"#d9534f\" />\n              )}\n            </Group>\n          ))}\n        </ScrollArea>\n      </Card>\n      {sessionData && (\n        <Button\n          mt={5}\n          radius=\"md\"\n          variant=\"light\"\n          onClick={() => {\n            testAllAsync({ configName: configName! });\n          }}\n          loading={testAllLoading}\n          loaderPosition=\"right\"\n          rightIcon={<IconTestPipe size={20} />}\n        >\n          {t('indexersStatus.testAllButton')}\n        </Button>\n      )}\n    </Flex>\n  );\n}\n\nexport default definition;\n"
  },
  {
    "path": "src/widgets/loading.tsx",
    "content": "import { Center, Loader } from '@mantine/core';\n\nexport const WidgetLoading = () => (\n  <Center h=\"100%\">\n    <Loader variant=\"bars\" />\n  </Center>\n);\n"
  },
  {
    "path": "src/widgets/media-requests/MediaRequestListTile.tsx",
    "content": "import {\n  ActionIcon,\n  Anchor,\n  Badge,\n  Card,\n  Center,\n  Flex,\n  Group,\n  Image,\n  ScrollArea,\n  Stack,\n  Text,\n  Tooltip,\n  Avatar,\n  useMantineTheme,\n} from '@mantine/core';\nimport { notifications } from '@mantine/notifications';\nimport { IconCheck, IconGitPullRequest, IconThumbDown, IconThumbUp } from '@tabler/icons-react';\nimport { useSession } from 'next-auth/react';\nimport { useTranslation } from 'next-i18next';\nimport { useConfigContext } from '~/config/provider';\nimport { api } from '~/utils/api';\n\nimport { defineWidget } from '../helper';\nimport { WidgetLoading } from '../loading';\nimport { IWidget } from '../widgets';\nimport { useMediaRequestQuery } from './media-request-query';\nimport { MediaRequest, MediaRequestAvailability, MediaRequestStatus } from './media-request-types';\n\nconst definition = defineWidget({\n  id: 'media-requests-list',\n  icon: IconGitPullRequest,\n  options: {\n    replaceLinksWithExternalHost: {\n      type: 'switch',\n      defaultValue: true,\n    },\n    openInNewTab: {\n      type: 'switch',\n      defaultValue: true,\n    },\n  },\n  component: MediaRequestListTile,\n  gridstack: {\n    minWidth: 3,\n    minHeight: 2,\n    maxWidth: 12,\n    maxHeight: 12,\n  },\n});\n\nexport type MediaRequestListWidget = IWidget<(typeof definition)['id'], typeof definition>;\n\ninterface MediaRequestListWidgetProps {\n  widget: MediaRequestListWidget;\n}\n\ntype MediaRequestDecisionVariables = {\n  request: MediaRequest;\n  isApproved: boolean;\n};\nconst useMediaRequestDecisionMutation = () => {\n  const { name: configName } = useConfigContext();\n  const utils = api.useContext();\n  const { mutateAsync } = api.overseerr.decide.useMutation({\n    onSuccess() {\n      utils.mediaRequest.allMedia.invalidate();\n      utils.mediaRequest.users.invalidate();\n    },\n  });\n  const { t } = useTranslation('modules/media-requests-list');\n  return async (variables: MediaRequestDecisionVariables) => {\n    const action = variables.isApproved ? t('mutation.approving') : t('mutation.declining');\n    notifications.show({\n      id: `decide-${variables.request.id}`,\n      color: 'yellow',\n      title: `${action} ${t('mutation.request')}`,\n      message: undefined,\n      loading: true,\n    });\n    await mutateAsync(\n      {\n        configName: configName!,\n        id: variables.request.id,\n        isApproved: variables.isApproved,\n      },\n      {\n        onSuccess(_data, variables) {\n          const title = variables.isApproved ? t('mutation.approved') : t('mutation.declined');\n          notifications.update({\n            id: `decide-${variables.id}`,\n            color: 'teal',\n            title,\n            message: undefined,\n            icon: <IconCheck size=\"1rem\" />,\n            autoClose: 2000,\n          });\n        },\n      }\n    );\n  };\n};\n\nfunction MediaRequestListTile({ widget }: MediaRequestListWidgetProps) {\n  const { t } = useTranslation('modules/media-requests-list');\n  const { data, isLoading } = useMediaRequestQuery(widget);\n  // Use mutation to approve or deny a pending request\n  const decideAsync = useMediaRequestDecisionMutation();\n  const { data: sessionData } = useSession();\n\n  const mantineTheme = useMantineTheme();\n\n  if (!data || isLoading) {\n    return <WidgetLoading />;\n  }\n\n  if (data.length === 0) {\n    return (\n      <Center h=\"100%\">\n        <Text>{t('noRequests')}</Text>\n      </Center>\n    );\n  }\n\n  const countPendingApproval = data.filter(\n    (x) => x.status === MediaRequestStatus.PendingApproval\n  ).length;\n\n  // Return a sorted data by status to show pending first, then the default order\n  const sortedData = data.sort((a: MediaRequest, b: MediaRequest) => {\n    if (a.status === MediaRequestStatus.PendingApproval) {\n      return -1;\n    }\n    if (b.status === MediaRequestStatus.PendingApproval) {\n      return 1;\n    }\n    return 0;\n  });\n\n  return (\n    <ScrollArea h=\"100%\">\n      <Stack>\n        {sortedData.map((item, index) => (\n          <Card radius=\"md\" withBorder key={index}>\n            <Flex wrap=\"nowrap\" justify=\"space-between\" gap=\"md\">\n              <Flex gap=\"md\">\n                <Image\n                  src={item.posterPath}\n                  width={30}\n                  height={50}\n                  alt=\"poster\"\n                  radius=\"xs\"\n                  withPlaceholder\n                />\n                <Stack spacing={0}>\n                  <Group spacing=\"xs\">\n                    {item.airDate && <Text>{item.airDate.split('-')[0]}</Text>}\n                    <MediaRequestStatusBadge\n                      status={item.status}\n                      availability={item.availability}\n                    />\n                  </Group>\n                  <Anchor\n                    href={item.href}\n                    target={widget.properties.openInNewTab ? '_blank' : '_self'}\n                    c={mantineTheme.colorScheme === 'dark' ? 'gray.3' : 'gray.8'}\n                  >\n                    <Text lineClamp={1}>{item.name}</Text>\n                  </Anchor>\n                </Stack>\n              </Flex>\n              <Stack justify=\"center\">\n                <Flex gap=\"xs\">\n                  <Avatar\n                    src={item.userProfilePicture}\n                    size={25}\n                    alt=\"requester avatar\"\n                    radius=\"xl\"\n                  >\n                    <Image\n                      src={item.fallbackUserProfilePicture}\n                      alt=\"requester avatar\"\n                    />\n                  </Avatar>\n                  <Anchor\n                    href={item.userLink}\n                    target={widget.properties.openInNewTab ? '_blank' : '_self'}\n                    c={mantineTheme.colorScheme === 'dark' ? 'gray.3' : 'gray.8'}\n                  >\n                    {item.userName}\n                  </Anchor>\n                </Flex>\n\n                {item.status === MediaRequestStatus.PendingApproval &&\n                  sessionData?.user?.isAdmin && (\n                    <Group>\n                      <Tooltip label={t('tooltips.approve')} withArrow withinPortal>\n                        <ActionIcon\n                          variant=\"light\"\n                          color=\"green\"\n                          onClick={async () => {\n                            notifications.show({\n                              id: `approve ${item.id}`,\n                              color: 'yellow',\n                              title: t('tooltips.approving'),\n                              message: undefined,\n                              loading: true,\n                            });\n\n                            await decideAsync({\n                              request: item,\n                              isApproved: true,\n                            });\n                          }}\n                        >\n                          <IconThumbUp />\n                        </ActionIcon>\n                      </Tooltip>\n                      <Tooltip label={t('tooltips.decline')} withArrow withinPortal>\n                        <ActionIcon\n                          variant=\"light\"\n                          color=\"red\"\n                          onClick={async () => {\n                            await decideAsync({\n                              request: item,\n                              isApproved: false,\n                            });\n                          }}\n                        >\n                          <IconThumbDown />\n                        </ActionIcon>\n                      </Tooltip>\n                    </Group>\n                  )}\n              </Stack>\n            </Flex>\n\n            <Image\n              src={item.backdropPath}\n              pos=\"absolute\"\n              w=\"100%\"\n              h=\"100%\"\n              opacity={0.1}\n              top={0}\n              left={0}\n              style={{ pointerEvents: 'none' }}\n            />\n          </Card>\n        ))}\n      </Stack>\n    </ScrollArea>\n  );\n}\n\nconst MediaRequestStatusBadge = ({\n  status,\n  availability,\n}: {\n  status: MediaRequestStatus;\n  availability: MediaRequestAvailability;\n}) => {\n  const { t } = useTranslation('modules/media-requests-list');\n  switch (status) {\n    case MediaRequestStatus.Approved:\n      switch (availability) {\n        case MediaRequestAvailability.Available:\n          return <Badge color=\"green\">{t('state.available')}</Badge>;\n        case MediaRequestAvailability.Partial:\n          return <Badge color=\"yellow\">{t('state.partial')}</Badge>;\n        default:\n          return <Badge color=\"violet\">{t('state.approved')}</Badge>;\n      }\n    case MediaRequestStatus.Declined:\n      return <Badge color=\"red\">{t('state.declined')}</Badge>;\n    case MediaRequestStatus.PendingApproval:\n      return <Badge color=\"orange\">{t('state.pendingApproval')}</Badge>;\n    default:\n      return <></>;\n  }\n};\n\nexport default definition;\n"
  },
  {
    "path": "src/widgets/media-requests/MediaRequestStatsTile.tsx",
    "content": "import {\n  Avatar,\n  Card,\n  Flex,\n  Group,\n  Indicator,\n  Stack,\n  Text,\n  Tooltip,\n  Image,\n  useMantineTheme,\n} from '@mantine/core';\nimport { useElementSize } from '@mantine/hooks';\nimport { IconChartBar, IconExternalLink } from '@tabler/icons-react';\nimport { useTranslation } from 'next-i18next';\n\nimport { defineWidget } from '../helper';\nimport { WidgetLoading } from '../loading';\nimport { IWidget } from '../widgets';\nimport { useMediaRequestQuery, useUsersQuery } from './media-request-query';\nimport { MediaRequestStatus } from './media-request-types';\n\nconst definition = defineWidget({\n  id: 'media-requests-stats',\n  icon: IconChartBar,\n  options: {\n    replaceLinksWithExternalHost: {\n      type: 'switch',\n      defaultValue: false,\n    },\n    openInNewTab: {\n      type: 'switch',\n      defaultValue: true,\n    },\n  },\n  gridstack: {\n    minWidth: 2,\n    minHeight: 2,\n    maxWidth: 12,\n    maxHeight: 12,\n  },\n  component: MediaRequestStatsTile,\n});\n\nexport type MediaRequestStatsWidget = IWidget<(typeof definition)['id'], typeof definition>;\n\ninterface MediaRequestStatsWidgetProps {\n  widget: MediaRequestStatsWidget;\n}\n\nfunction MediaRequestStatsTile({ widget }: MediaRequestStatsWidgetProps) {\n  const { t } = useTranslation('modules/media-requests-stats');\n  const {\n    data: mediaData,\n    isFetching: mediaFetching,\n    isLoading: mediaLoading,\n  } = useMediaRequestQuery(widget);\n  const {\n    data: usersData,\n    isFetching: usersFetching,\n    isLoading: usersLoading,\n  } = useUsersQuery(widget);\n  const { ref, height } = useElementSize();\n  const { colorScheme } = useMantineTheme();\n\n  if (!mediaData || !usersData || mediaLoading || usersLoading) {\n    return (\n      <Stack ref={ref} h=\"100%\">\n        <WidgetLoading />\n      </Stack>\n    );\n  }\n\n  const appList: string[] = [];\n  mediaData.forEach((item) => {\n    if (!appList.includes(item.appId)) appList.push(item.appId);\n  });\n\n  const baseStats: { label: string; number: number }[] = [\n    {\n      label: t('mediaStats.pending'),\n      number: mediaData.filter((x) => x.status === MediaRequestStatus.PendingApproval).length,\n    },\n    {\n      label: t('mediaStats.tvRequests'),\n      number: mediaData.filter((x) => x.type === 'tv').length,\n    },\n    {\n      label: t('mediaStats.movieRequests'),\n      number: mediaData.filter((x) => x.type === 'movie').length,\n    },\n    {\n      label: t('mediaStats.approved'),\n      number: mediaData.filter((x) => x.status === MediaRequestStatus.Approved).length,\n    },\n    {\n      label: t('mediaStats.totalRequests'),\n      number: mediaData.length,\n    },\n  ];\n\n  const users = usersData\n    .sort((x, y) => (x.userRequestCount > y.userRequestCount ? -1 : 1))\n    .slice(0, Math.trunc(height / 60));\n\n  return (\n    <Flex h=\"100%\" gap={0} direction=\"column\">\n      <Text mt={-5}>{t('mediaStats.title')}</Text>\n      <Card py={5} px={10} radius=\"md\" style={{ overflow: 'unset' }} withBorder>\n        {baseStats.map((stat, index) => {\n          return (\n            <Group key={index} position=\"apart\">\n              <Text color=\"dimmed\" align=\"center\" size=\"xs\">\n                {stat.label}\n              </Text>\n              <Text align=\"center\" size=\"xs\">\n                {stat.number}\n              </Text>\n            </Group>\n          );\n        })}\n      </Card>\n      <Text mt={2}>{t('userStats.title')}</Text>\n      <Stack ref={ref} style={{ flex: 1 }} spacing={5} p={0} sx={{ overflow: 'hidden' }}>\n        {users.map((user) => {\n          return (\n            <Card\n              key={user.id}\n              p={0}\n              component=\"a\"\n              href={user.userLink}\n              target={widget.properties.openInNewTab ? '_blank' : '_self'}\n              mah={95}\n              mih={55}\n              radius=\"md\"\n              style={{ flex: 1 }}\n              withBorder\n            >\n              <Group\n                spacing={5}\n                px={10}\n                py={5}\n                align=\"center\"\n                h=\"100%\"\n                display=\"flex\"\n                style={{ flexDirection: 'row' }}\n              >\n                {appList.length > 1 && (\n                  <Tooltip.Floating\n                    label={user.app.charAt(0).toUpperCase() + user.app.slice(1)}\n                    c={colorScheme === 'light' ? 'black' : 'dark.0'}\n                    color={colorScheme === 'light' ? 'gray.2' : 'dark.4'}\n                  >\n                    <Indicator\n                      withBorder\n                      top={18}\n                      left={8}\n                      size={15}\n                      ml={-5}\n                      zIndex={1}\n                      color={user.app === 'overseerr' ? '#ECB000' : '#6677CC'}\n                      processing={mediaFetching || usersFetching}\n                      children\n                    />\n                  </Tooltip.Floating>\n                )}\n                <Avatar radius=\"xl\" size={45} src={user.userProfilePicture} alt=\"user avatar\" >\n                  <Image src={user.fallbackUserProfilePicture} alt=\"user avatar\" />\n                </Avatar>\n                <Stack spacing={0} style={{ flex: 1 }}>\n                  <Text>{user.userName}</Text>\n                  <Text size=\"xs\">\n                    {t('userStats.requests', { number: user.userRequestCount })}\n                  </Text>\n                </Stack>\n                <IconExternalLink size={20} />\n              </Group>\n            </Card>\n          );\n        })}\n      </Stack>\n    </Flex>\n  );\n}\n\nexport default definition;\n"
  },
  {
    "path": "src/widgets/media-requests/media-request-query.tsx",
    "content": "import { useConfigContext } from '~/config/provider';\nimport { api } from '~/utils/api';\n\nimport { MediaRequestListWidget } from './MediaRequestListTile';\nimport { MediaRequestStatsWidget } from './MediaRequestStatsTile';\n\nexport const useMediaRequestQuery = (widget: MediaRequestListWidget | MediaRequestStatsWidget) => {\n  const { name: configName } = useConfigContext();\n  return api.mediaRequest.allMedia.useQuery(\n    { configName: configName!, widget: widget },\n    {\n      refetchInterval: 3 * 60 * 1000,\n    }\n  );\n};\n\nexport const useUsersQuery = (widget: MediaRequestListWidget | MediaRequestStatsWidget) => {\n  const { name: configName } = useConfigContext();\n  return api.mediaRequest.users.useQuery(\n    { configName: configName!, widget: widget },\n    {\n      refetchInterval: 3 * 60 * 1000,\n    }\n  );\n};\n"
  },
  {
    "path": "src/widgets/media-requests/media-request-types.tsx",
    "content": "export type MediaRequest = {\n  appId: string;\n  id: number;\n  createdAt: string;\n  rootFolder: string;\n  type: 'movie' | 'tv';\n  name: string;\n  userName: string;\n  userProfilePicture: string;\n  fallbackUserProfilePicture: string;\n  userLink: string;\n  userRequestCount: number;\n  airDate?: string;\n  status: MediaRequestStatus;\n  availability: MediaRequestAvailability;\n  backdropPath: string;\n  posterPath: string;\n  href: string;\n};\n\nexport type Users = {\n  app: string;\n  id: number;\n  userName: string;\n  userProfilePicture: string;\n  fallbackUserProfilePicture: string;\n  userLink: string;\n  userRequestCount: number;\n};\n\nexport enum MediaRequestStatus {\n  PendingApproval = 1,\n  Approved = 2,\n  Declined = 3,\n}\n\nexport enum MediaRequestAvailability {\n  Unknown = 1,\n  Pending = 2,\n  Processing = 3,\n  Partial = 4,\n  Available = 5,\n}\n"
  },
  {
    "path": "src/widgets/media-server/DetailCollapseable.tsx",
    "content": "import { Card, Divider, Flex, Group, Stack, Text } from '@mantine/core';\nimport { IconDeviceMobile, IconId } from '@tabler/icons-react';\nimport { GenericSessionInfo } from '~/types/api/media-server/session-info';\n\nexport const DetailCollapseable = ({ session }: { session: GenericSessionInfo }) => {\n  let details: { title: string; metrics: { name: string; value: string | undefined }[] }[] = [];\n\n  if (session.currentlyPlaying) {\n    if (session.currentlyPlaying.metadata.video) {\n      details = [\n        ...details,\n        {\n          title: 'Video',\n          metrics: [\n            {\n              name: 'Resolution',\n              value: `${session.currentlyPlaying.metadata.video.width}x${session.currentlyPlaying.metadata.video.height}`,\n            },\n            {\n              name: 'Framerate',\n              value: session.currentlyPlaying.metadata.video.videoFrameRate,\n            },\n            {\n              name: 'Video Codec',\n              value: session.currentlyPlaying.metadata.video.videoCodec,\n            },\n            {\n              name: 'Bitrate',\n              value: session.currentlyPlaying.metadata.video.bitrate\n                ? String(session.currentlyPlaying.metadata.video.bitrate)\n                : undefined,\n            },\n          ],\n        },\n      ];\n    }\n    if (session.currentlyPlaying.metadata.audio) {\n      details = [\n        ...details,\n        {\n          title: 'Audio',\n          metrics: [\n            {\n              name: 'Audio Channels',\n              value: `${session.currentlyPlaying.metadata.audio.audioChannels}`,\n            },\n            {\n              name: 'Audio Codec',\n              value: session.currentlyPlaying.metadata.audio.audioCodec,\n            },\n          ],\n        },\n      ];\n    }\n\n    if (session.currentlyPlaying.metadata.transcoding) {\n      details = [\n        ...details,\n        {\n          title: 'Transcoding',\n          metrics: [\n            {\n              name: 'Resolution',\n              value: `${session.currentlyPlaying.metadata.transcoding.width}x${session.currentlyPlaying.metadata.transcoding.height}`,\n            },\n            {\n              name: 'Context',\n              value: session.currentlyPlaying.metadata.transcoding.context,\n            },\n            {\n              name: 'Hardware Encoding Requested',\n              value: session.currentlyPlaying.metadata.transcoding.transcodeHwRequested\n                ? 'yes'\n                : 'no',\n            },\n            {\n              name: 'Source Codec',\n              value:\n                session.currentlyPlaying.metadata.transcoding.sourceAudioCodec ||\n                session.currentlyPlaying.metadata.transcoding.sourceVideoCodec\n                  ? `${session.currentlyPlaying.metadata.transcoding.sourceVideoCodec} ${session.currentlyPlaying.metadata.transcoding.sourceAudioCodec}`\n                  : undefined,\n            },\n            {\n              name: 'Target Codec',\n              value: `${session.currentlyPlaying.metadata.transcoding.videoCodec} ${session.currentlyPlaying.metadata.transcoding.audioCodec}`,\n            },\n          ],\n        },\n      ];\n    }\n  }\n\n  return (\n    <Card>\n      <Flex justify=\"space-between\" mb=\"xs\">\n        <Group>\n          <IconId size={16} />\n          <Text>ID</Text>\n        </Group>\n        <Text>{session.id}</Text>\n      </Flex>\n      <Flex justify=\"space-between\" mb=\"md\">\n        <Group>\n          <IconDeviceMobile size={16} />\n          <Text>Device</Text>\n        </Group>\n        <Text>{session.sessionName}</Text>\n      </Flex>\n      {details.length > 0 && (\n        <Divider label={'Stats for nerds'} labelPosition=\"center\" mt=\"lg\" mb=\"sm\" />\n      )}\n      <Group align=\"start\">\n        {details.map((detail, index) => (\n          <>\n            <Stack spacing={0} key={index}>\n              <Text weight=\"bold\">{detail.title}</Text>\n              {detail.metrics\n                .filter((x) => x.value !== undefined)\n                .map((metric, index2) => (\n                  <Group position=\"apart\" key={index2}>\n                    <Text>{metric.name}</Text>\n                    <Text>{metric.value}</Text>\n                  </Group>\n                ))}\n            </Stack>\n            {index < details.length - 1 && (\n              <Divider key={'divider' + index} orientation=\"vertical\" />\n            )}\n          </>\n        ))}\n      </Group>\n    </Card>\n  );\n};\n"
  },
  {
    "path": "src/widgets/media-server/MediaServerTile.tsx",
    "content": "import {\n  Avatar,\n  Center,\n  Group,\n  Loader,\n  ScrollArea,\n  Stack,\n  Table,\n  Text,\n  Title,\n} from '@mantine/core';\nimport { IconAlertTriangle, IconMovie } from '@tabler/icons-react';\nimport { useTranslation } from 'next-i18next';\nimport { AppAvatar } from '~/components/AppAvatar';\nimport { useConfigContext } from '~/config/provider';\n\nimport { defineWidget } from '../helper';\nimport { IWidget } from '../widgets';\nimport { TableRow } from './TableRow';\nimport { useGetMediaServers } from './useGetMediaServers';\n\nconst definition = defineWidget({\n  id: 'media-server',\n  icon: IconMovie,\n  options: {},\n  component: MediaServerTile,\n  gridstack: {\n    minWidth: 3,\n    minHeight: 2,\n    maxWidth: 12,\n    maxHeight: 12,\n  },\n});\n\nexport type MediaServerWidget = IWidget<(typeof definition)['id'], typeof definition>;\n\ninterface MediaServerWidgetProps {\n  widget: MediaServerWidget;\n}\n\nfunction MediaServerTile({ widget }: MediaServerWidgetProps) {\n  const { t } = useTranslation('modules/media-server');\n  const { config } = useConfigContext();\n\n  const { data, isError, isFetching, isInitialLoading } = useGetMediaServers({\n    enabled: config !== undefined,\n  });\n\n  if (isError) {\n    return (\n      <Center>\n        <Stack align=\"center\">\n          <IconAlertTriangle />\n          <Title order={6}>{t('card.errors.general.title')}</Title>\n          <Text>{t('card.errors.general.text')}</Text>\n        </Stack>\n      </Center>\n    );\n  }\n\n  if (isInitialLoading) {\n    return (\n      <Stack\n        align=\"center\"\n        justify=\"center\"\n        style={{\n          height: '100%',\n        }}\n      >\n        <Loader />\n        <Stack align=\"center\" spacing={0}>\n          <Text>{t('descriptor.name')}</Text>\n          <Text color=\"dimmed\">{t('loading')}</Text>\n        </Stack>\n      </Stack>\n    );\n  }\n\n  return (\n    <Stack h=\"100%\">\n      <ScrollArea offsetScrollbars h=\"100%\">\n        <Table highlightOnHover>\n          <thead>\n            <tr>\n              <th>{t('card.table.header.session')}</th>\n              <th>{t('card.table.header.user')}</th>\n              <th>{t('card.table.header.currentlyPlaying')}</th>\n            </tr>\n          </thead>\n          <tbody>\n            {data?.servers.map((server) => {\n              const app = config?.apps.find((x) => x.id === server.appId);\n              return server.sessions.map((session, index) => (\n                <TableRow session={session} app={app} key={index} />\n              ));\n            })}\n          </tbody>\n        </Table>\n      </ScrollArea>\n\n      <Group pos=\"absolute\" bottom=\"15\" right=\"15\" mt=\"auto\">\n        <Avatar.Group>\n          {data?.servers.map((server, index) => {\n            const app = config?.apps.find((x) => x.id === server.appId);\n\n            if (!app) {\n              return null;\n            }\n\n            return (\n              <AppAvatar\n                key={index}\n                iconUrl={app.appearance.iconUrl}\n                // If success, the color is undefined, otherwise it's red but if isFetching is true, it's yellow\n                color={server.success ? (isFetching ? 'yellow' : undefined) : 'red'}\n              />\n            );\n          })}\n        </Avatar.Group>\n      </Group>\n    </Stack>\n  );\n}\n\nexport default definition;\n"
  },
  {
    "path": "src/widgets/media-server/NowPlayingDisplay.tsx",
    "content": "import { Flex, Stack, Text } from '@mantine/core';\nimport {\n  IconDeviceTv,\n  IconHeadphones,\n  IconMovie,\n  IconQuestionMark,\n  IconVideo,\n} from '@tabler/icons-react';\nimport { GenericSessionInfo } from '~/types/api/media-server/session-info';\n\nexport const NowPlayingDisplay = ({ session }: { session: GenericSessionInfo }) => {\n  if (!session.currentlyPlaying) {\n    return null;\n  }\n\n  const IconSelector = () => {\n    switch (session.currentlyPlaying?.type) {\n      case 'audio':\n        return IconHeadphones;\n      case 'tv':\n        return IconDeviceTv;\n      case 'movie':\n        return IconMovie;\n      case 'video':\n        return IconVideo;\n      default:\n        return IconQuestionMark;\n    }\n  };\n\n  const Icon = IconSelector();\n\n  return (\n    <Flex wrap=\"nowrap\" gap=\"sm\" align=\"center\">\n      <Icon size={16} />\n      <Stack spacing={0}>\n        <Text lineClamp={1}>{session.currentlyPlaying.name}</Text>\n\n        {session.currentlyPlaying.albumName ? (\n          <Text lineClamp={1} color=\"dimmed\" size=\"xs\">\n            {session.currentlyPlaying.albumName}\n          </Text>\n        ) : (\n          session.currentlyPlaying.seasonName && (\n            <Text lineClamp={1} color=\"dimmed\" size=\"xs\">\n              {session.currentlyPlaying.seasonName} - {session.currentlyPlaying.episodeName}\n            </Text>\n          )\n        )}\n      </Stack>\n    </Flex>\n  );\n};\n"
  },
  {
    "path": "src/widgets/media-server/TableRow.tsx",
    "content": "import { Avatar, Flex, Popover, Text, createStyles } from '@mantine/core';\nimport { AppAvatar } from '~/components/AppAvatar';\nimport { GenericSessionInfo } from '~/types/api/media-server/session-info';\nimport { AppType } from '~/types/app';\n\nimport { DetailCollapseable } from './DetailCollapseable';\nimport { NowPlayingDisplay } from './NowPlayingDisplay';\n\ninterface TableRowProps {\n  session: GenericSessionInfo;\n  app: AppType | undefined;\n}\n\nexport const TableRow = ({ session, app }: TableRowProps) => {\n  const hasUserThumb = session.userProfilePicture !== undefined;\n  const { classes } = useStyles();\n  return (\n    <Popover\n      withArrow\n      withinPortal\n      radius=\"lg\"\n      shadow=\"sm\"\n      transitionProps={{\n        transition: 'pop',\n      }}\n    >\n      <Popover.Target>\n        <tr className={classes.dataRow}>\n          <td>\n            <Flex wrap=\"nowrap\" gap=\"xs\">\n              {app?.appearance.iconUrl && <AppAvatar iconUrl={app.appearance.iconUrl} />}\n              <Text lineClamp={1}>{session.sessionName}</Text>\n            </Flex>\n          </td>\n          <td>\n            <Flex wrap=\"nowrap\" gap=\"sm\">\n              {hasUserThumb ? (\n                <Avatar src={session.userProfilePicture} size=\"sm\" />\n              ) : (\n                <Avatar src={null} alt={session.username} size=\"sm\">\n                  {session.username?.at(0)?.toUpperCase()}\n                </Avatar>\n              )}\n              <Text style={{ whiteSpace: 'nowrap' }}>{session.username}</Text>\n            </Flex>\n          </td>\n          <td>\n            <NowPlayingDisplay session={session} />\n          </td>\n        </tr>\n      </Popover.Target>\n      <Popover.Dropdown>\n        <DetailCollapseable session={session} />\n      </Popover.Dropdown>\n    </Popover>\n  );\n};\n\nconst useStyles = createStyles(() => ({\n  dataRow: {\n    cursor: 'pointer',\n  },\n}));\n"
  },
  {
    "path": "src/widgets/media-server/useGetMediaServers.tsx",
    "content": "import { useConfigContext } from '~/config/provider';\nimport { api } from '~/utils/api';\n\ninterface GetMediaServersParams {\n  enabled: boolean;\n}\n\nexport const useGetMediaServers = ({ enabled }: GetMediaServersParams) => {\n  const { name: configName } = useConfigContext();\n\n  return api.mediaServer.all.useQuery(\n    {\n      configName: configName!,\n    },\n    {\n      enabled,\n      refetchInterval: 10 * 1000,\n    }\n  );\n};\n"
  },
  {
    "path": "src/widgets/media-transcoding/HealthCheckStatus.tsx",
    "content": "import {\n  Divider,\n  Group,\n  HoverCard,\n  Indicator,\n  MantineColor,\n  RingProgress,\n  Stack,\n  Text,\n} from '@mantine/core';\nimport { IconHeartbeat } from '@tabler/icons-react';\nimport { useTranslation } from 'next-i18next';\nimport { useColorScheme } from '~/hooks/use-colorscheme';\n\nimport { TdarrStatistics } from '~/types/api/tdarr';\n\ninterface StatisticsBadgeProps {\n  statistics?: TdarrStatistics;\n}\n\nexport function HealthCheckStatus(props: StatisticsBadgeProps) {\n  const { statistics } = props;\n\n  const { colorScheme } = useColorScheme();\n  const { t } = useTranslation('modules/media-transcoding');\n\n  if (!statistics) {\n    return <IconHeartbeat size={20} />;\n  }\n\n  const indicatorColor = statistics.failedHealthCheckCount\n    ? 'red'\n    : statistics.stagedHealthCheckCount\n      ? 'yellow'\n      : 'green';\n\n  return (\n    <HoverCard position=\"bottom\" width={250} shadow=\"sm\">\n      <HoverCard.Target>\n          <Indicator color={textColor(indicatorColor, colorScheme)} size={8} display=\"flex\">\n            <IconHeartbeat size={20} />\n          </Indicator>\n      </HoverCard.Target>\n      <HoverCard.Dropdown bg={colorScheme === 'light' ? 'gray.2' : 'dark.8'}>\n        <Stack spacing=\"sm\" align=\"center\">\n          <Group spacing=\"xs\">\n            <IconHeartbeat size={18} />\n            <Text size=\"sm\">{t(`healthCheckStatus.title`)}</Text>\n          </Group>\n          <Divider\n            style={{\n              alignSelf: 'stretch',\n            }}\n          />\n          <RingProgress\n            sections={[\n              { value: statistics.stagedHealthCheckCount, color: textColor('yellow', colorScheme) },\n              { value: statistics.totalHealthCheckCount, color: textColor('green', colorScheme) },\n              { value: statistics.failedHealthCheckCount, color: textColor('red', colorScheme) },\n            ]}\n          />\n          <Group display=\"flex\" w=\"100%\">\n            <Stack style={{ flex: 1 }} spacing={0} align=\"center\">\n              <Text size=\"xs\" color={textColor('yellow', colorScheme)}>\n                {statistics.stagedHealthCheckCount}\n              </Text>\n              <Text size=\"xs\">{t(`healthCheckStatus.queued`)}</Text>\n            </Stack>\n            <Stack style={{ flex: 1 }} spacing={0} align=\"center\">\n              <Text size=\"xs\" color={textColor('green', colorScheme)}>\n                {statistics.totalHealthCheckCount}\n              </Text>\n              <Text size=\"xs\">{t(`healthCheckStatus.healthy`)}</Text>\n            </Stack>\n            <Stack style={{ flex: 1 }} spacing={0} align=\"center\">\n              <Text size=\"xs\" color={textColor('red', colorScheme)}>\n                {statistics.failedHealthCheckCount}\n              </Text>\n              <Text size=\"xs\">{t(`healthCheckStatus.unhealthy`)}</Text>\n            </Stack>\n          </Group>\n        </Stack>\n      </HoverCard.Dropdown>\n    </HoverCard>\n  );\n}\n\nfunction textColor(color: MantineColor, theme: 'light' | 'dark') {\n  return `${color}.${theme === 'light' ? 8 : 5}`;\n}\n"
  },
  {
    "path": "src/widgets/media-transcoding/MediaTranscodingTile.tsx",
    "content": "import {\n  Alert,\n  Center,\n  Code,\n  Divider,\n  Group,\n  List,\n  Pagination,\n  SegmentedControl,\n  Stack,\n  Text,\n  Title,\n  Tooltip,\n} from '@mantine/core';\nimport {\n  IconAlertCircle,\n  IconClipboardList,\n  IconCpu2,\n  IconReportAnalytics, IconTransform,\n} from '@tabler/icons-react';\nimport { useTranslation } from 'next-i18next';\nimport { useState } from 'react';\nimport { z } from 'zod';\nimport { AppAvatar } from '~/components/AppAvatar';\nimport { useConfigContext } from '~/config/provider';\nimport { api } from '~/utils/api';\nimport { HealthCheckStatus } from '~/widgets/media-transcoding/HealthCheckStatus';\nimport { QueuePanel } from '~/widgets/media-transcoding/QueuePanel';\nimport { StatisticsPanel } from '~/widgets/media-transcoding/StatisticsPanel';\nimport { WorkersPanel } from '~/widgets/media-transcoding/WorkersPanel';\n\nimport { defineWidget } from '../helper';\nimport { IWidget } from '../widgets';\n\nconst definition = defineWidget({\n  id: 'media-transcoding',\n  icon: IconTransform,\n  options: {\n    defaultView: {\n      type: 'select',\n      data: [\n        {\n          value: 'workers',\n        },\n        {\n          value: 'queue',\n        },\n        {\n          value: 'statistics',\n        },\n      ],\n      defaultValue: 'workers',\n    },\n    showHealthCheck: {\n      type: 'switch',\n      defaultValue: true,\n    },\n    showHealthChecksInQueue: {\n      type: 'switch',\n      defaultValue: true,\n    },\n    queuePageSize: {\n      type: 'number',\n      defaultValue: 10,\n    },\n    showAppIcon: {\n      type: 'switch',\n      defaultValue: true,\n    },\n  },\n  gridstack: {\n    minWidth: 3,\n    minHeight: 2,\n    maxWidth: 12,\n    maxHeight: 6,\n  },\n  component: MediaTranscodingTile,\n});\n\nexport type TdarrWidget = IWidget<(typeof definition)['id'], typeof definition>;\n\ninterface TdarrQueueTileProps {\n  widget: TdarrWidget;\n}\n\nfunction MediaTranscodingTile({ widget }: TdarrQueueTileProps) {\n  const { t } = useTranslation('modules/media-transcoding');\n  const { config, name: configName } = useConfigContext();\n\n  const appId = config?.apps.find(\n    (app) => app.integration.type === 'tdarr',\n  )?.id;\n  const app = config?.apps.find((app) => app.id === appId);\n  const { defaultView, showHealthCheck, showHealthChecksInQueue, queuePageSize, showAppIcon } =\n    widget.properties;\n\n  const [view, setView] = useState<'workers' | 'queue' | 'statistics'>(\n    viewSchema.parse(defaultView)\n  );\n\n  const [queuePage, setQueuePage] = useState(1);\n\n  const workers = api.tdarr.workers.useQuery(\n    {\n      appId: app?.id!,\n      configName: configName!,\n    },\n    { enabled: !!app?.id && !!configName && view === 'workers', refetchInterval: 2000 }\n  );\n\n  const statistics = api.tdarr.statistics.useQuery(\n    {\n      appId: app?.id!,\n      configName: configName!,\n    },\n    { enabled: !!app?.id && !!configName, refetchInterval: 10000 }\n  );\n\n  const queue = api.tdarr.queue.useQuery(\n    {\n      appId: app?.id!,\n      configName: configName!,\n      pageSize: queuePageSize,\n      page: queuePage - 1,\n      showHealthChecksInQueue,\n    },\n    {\n      enabled: !!app?.id && !!configName && view === 'queue',\n      refetchInterval: 2000,\n    }\n  );\n\n  if (statistics.isError || workers.isError || queue.isError) {\n    return (\n      <Group position=\"center\">\n        <Alert\n          icon={<IconAlertCircle size={16} />}\n          my=\"lg\"\n          title={t('error.title')}\n          color=\"red\"\n          radius=\"md\"\n        >\n          {t('error.message')}\n          <List>\n            {statistics.isError && (\n              <Code mt=\"sm\" block>\n                {statistics.error.message}\n              </Code>\n            )}\n            {workers.isError && (\n              <Code mt=\"sm\" block>\n                {workers.error.message}\n              </Code>\n            )}\n            {queue.isError && (\n              <Code mt=\"sm\" block>\n                {queue.error.message}\n              </Code>\n            )}\n          </List>\n        </Alert>\n      </Group>\n    );\n  }\n\n  if (!app) {\n    return (\n      <Stack justify=\"center\" h=\"100%\">\n        <Center>\n          <Title order={3}>{t('noAppSelected')}</Title>\n        </Center>\n      </Stack>\n    );\n  }\n\n  const totalQueuePages = Math.ceil((queue.data?.totalCount || 1) / queuePageSize);\n\n  return (\n    <Stack spacing=\"xs\" h=\"100%\">\n      {view === 'workers' ? (\n        <WorkersPanel workers={workers.data} isLoading={workers.isLoading} />\n      ) : view === 'queue' ? (\n        <QueuePanel queue={queue.data} isLoading={queue.isLoading} />\n      ) : (\n        <StatisticsPanel statistics={statistics.data} isLoading={statistics.isLoading} />\n      )}\n      <Divider />\n      <Group spacing=\"xs\">\n        <SegmentedControl\n          data={[\n            {\n              label: (\n                <Center>\n                  <IconCpu2 size={18} />\n                  <Text size=\"xs\" ml={8}>\n                    {t('tabs.workers')}\n                  </Text>\n                </Center>\n              ),\n              value: 'workers',\n            },\n            {\n              label: (\n                <Center>\n                  <IconClipboardList size={18} />\n                  <Text size=\"xs\" ml={8}>\n                    {t('tabs.queue')}\n                  </Text>\n                </Center>\n              ),\n              value: 'queue',\n            },\n            {\n              label: (\n                <Center>\n                  <IconReportAnalytics size={18} />\n                  <Text size=\"xs\" ml={8}>\n                    {t('tabs.statistics')}\n                  </Text>\n                </Center>\n              ),\n              value: 'statistics',\n            },\n          ]}\n          value={view}\n          onChange={(value) => setView(viewSchema.parse(value))}\n          size=\"xs\"\n        />\n        {view === 'queue' && !!queue.data && (\n          <>\n            <Pagination.Root total={totalQueuePages} value={queuePage} onChange={setQueuePage} size=\"sm\">\n              <Group spacing={5} position=\"center\">\n                <Pagination.First disabled={queuePage === 1} />\n                <Pagination.Previous disabled={queuePage === 1} />\n                <Pagination.Next disabled={queuePage === totalQueuePages} />\n                <Pagination.Last disabled={queuePage === totalQueuePages} />\n              </Group>\n            </Pagination.Root>\n            <Text size=\"xs\">\n              {t('views.queue.table.footer.currentIndex', {\n                start: queue.data.startIndex + 1,\n                end: queue.data.endIndex + 1,\n                total: queue.data.totalCount,\n              })}\n            </Text>\n          </>\n        )}\n        <Group spacing=\"xs\" ml=\"auto\">\n          {showHealthCheck && statistics.data && <HealthCheckStatus statistics={statistics.data} />}\n          {showAppIcon && (\n            <Tooltip label={app.name}>\n              <div>\n                <AppAvatar iconUrl={app.appearance.iconUrl} />\n              </div>\n            </Tooltip>\n          )}\n        </Group>\n      </Group>\n    </Stack>\n  );\n}\n\nconst viewSchema = z.enum(['workers', 'queue', 'statistics']);\n\nexport default definition;\n"
  },
  {
    "path": "src/widgets/media-transcoding/QueuePanel.tsx",
    "content": "import { Center, Group, ScrollArea, Table, Text, Title, Tooltip } from '@mantine/core';\nimport { IconHeartbeat, IconTransform } from '@tabler/icons-react';\nimport { useTranslation } from 'next-i18next';\nimport { humanFileSize } from '~/tools/humanFileSize';\nimport { WidgetLoading } from '~/widgets/loading';\nimport { TdarrQueue } from '~/types/api/tdarr';\n\ninterface QueuePanelProps {\n  queue: TdarrQueue | undefined;\n  isLoading: boolean;\n}\n\nexport function QueuePanel(props: QueuePanelProps) {\n  const { queue, isLoading } = props;\n\n  const { t } = useTranslation('modules/media-transcoding');\n\n  if (isLoading) {\n    return <WidgetLoading />;\n  }\n\n  if (!queue?.array.length) {\n    return (\n      <Center\n        style={{ flex: '1' }}\n      >\n        <Title order={3}>{t('views.queue.table.empty')}</Title>\n      </Center>\n    );\n  }\n\n  return (\n    <ScrollArea style={{ flex: '1' }}>\n      <Table style={{ tableLayout: 'fixed' }}>\n        <thead>\n          <tr>\n            <th>{t('views.queue.table.header.name')}</th>\n            <th style={{ width: 80 }}>{t('views.queue.table.header.size')}</th>\n          </tr>\n        </thead>\n        <tbody>\n          {queue.array.map((item) => (\n            <tr key={item.id}>\n              <td>\n                <Group spacing=\"xs\" noWrap>\n                  <div>\n                    {item.type === 'transcode' ? (\n                      <Tooltip label={t('views.workers.table.tooltip.transcode')}>\n                        <IconTransform size={14} />\n                      </Tooltip>\n                    ) : (\n                      <Tooltip label={t('views.workers.table.tooltip.healthCheck')}>\n                        <IconHeartbeat size={14} />\n                      </Tooltip>\n                    )}\n                  </div>\n                  <Text lineClamp={1} size=\"xs\">{item.filePath.split('\\\\').pop()?.split('/').pop() ?? item.filePath}</Text>\n                </Group>\n              </td>\n              <td>\n                <Text size=\"xs\">{humanFileSize(item.fileSize)}</Text>\n              </td>\n            </tr>\n          ))}\n        </tbody>\n      </Table>\n    </ScrollArea>\n  );\n}\n"
  },
  {
    "path": "src/widgets/media-transcoding/StatisticsPanel.tsx",
    "content": "import {\n  Box,\n  Center,\n  Grid,\n  Group,\n  MantineColor,\n  RingProgress,\n  RingProgressProps,\n  Stack,\n  Text,\n  Title,\n} from '@mantine/core';\nimport {\n  IconDatabaseHeart,\n  IconFileDescription,\n  IconHeartbeat,\n  IconTransform,\n} from '@tabler/icons-react';\nimport { useTranslation } from 'next-i18next';\nimport { ReactNode } from 'react';\nimport { humanFileSize } from '~/tools/humanFileSize';\nimport { WidgetLoading } from '~/widgets/loading';\nimport { TdarrPieSegment, TdarrStatistics } from '~/types/api/tdarr';\n\nconst PIE_COLORS: MantineColor[] = ['cyan', 'grape', 'gray', 'orange', 'pink'];\n\ninterface StatisticsPanelProps {\n  statistics: TdarrStatistics | undefined;\n  isLoading: boolean;\n}\n\nexport function StatisticsPanel(props: StatisticsPanelProps) {\n  const { statistics, isLoading } = props;\n\n  const { t } = useTranslation('modules/media-transcoding');\n\n  if (isLoading) {\n    return <WidgetLoading />;\n  }\n\n  const allLibs = statistics?.pies.find((pie) => pie.libraryName === 'All');\n\n  if (!statistics || !allLibs) {\n    return (\n      <Center\n        style={{ flex: '1' }}\n      >\n        <Title order={3}>{t('views.statistics.empty')}</Title>\n      </Center>\n    );\n  }\n\n  return (\n    <Stack style={{ flex: '1' }} spacing=\"xs\">\n      <Group\n        style={{\n          flex: 1,\n        }}\n        position=\"apart\"\n        align=\"center\"\n        noWrap\n      >\n        <Stack align=\"center\" spacing={0}>\n          <RingProgress size={120} sections={toRingProgressSections(allLibs.transcodeStatus)} />\n          <Text size=\"xs\">{t('views.statistics.pies.transcodes')}</Text>\n        </Stack>\n        <Grid gutter=\"xs\">\n          <Grid.Col span={6}>\n            <StatBox\n              icon={<IconTransform size={18} />}\n              label={t('views.statistics.box.transcodes', {\n                value: statistics.totalTranscodeCount\n              })}\n            />\n          </Grid.Col>\n          <Grid.Col span={6}>\n            <StatBox\n              icon={<IconHeartbeat size={18} />}\n              label={t('views.statistics.box.healthChecks', {\n                value: statistics.totalHealthCheckCount\n              })}\n            />\n          </Grid.Col>\n          <Grid.Col span={6}>\n            <StatBox\n              icon={<IconFileDescription size={18} />}\n              label={t('views.statistics.box.files', {\n                value: statistics.totalFileCount\n              })}\n            />\n          </Grid.Col>\n          <Grid.Col span={6}>\n            <StatBox\n              icon={<IconDatabaseHeart size={18} />}\n              label={t('views.statistics.box.spaceSaved', {\n                value: allLibs?.savedSpace ? humanFileSize(allLibs.savedSpace) : '-'\n              })}\n            />\n          </Grid.Col>\n        </Grid>\n        <Stack align=\"center\" spacing={0}>\n          <RingProgress\n            size={120}\n            sections={toRingProgressSections(allLibs.healthCheckStatus)}\n          />\n          <Text size=\"xs\">{t('views.statistics.pies.healthChecks')}</Text>\n        </Stack>\n      </Group>\n      <Group\n        style={{\n          flex: 1,\n        }}\n        position=\"apart\"\n        align=\"center\"\n        noWrap\n      >\n        <Stack align=\"center\" spacing={0}>\n          <RingProgress size={120} sections={toRingProgressSections(allLibs.videoCodecs)} />\n          <Text size=\"xs\">{t('views.statistics.pies.videoCodecs')}</Text>\n        </Stack>\n        <Stack align=\"center\" spacing={0}>\n          <RingProgress size={120} sections={toRingProgressSections(allLibs.videoContainers)} />\n          <Text size=\"xs\">{t('views.statistics.pies.videoContainers')}</Text>\n        </Stack>\n        <Stack align=\"center\" spacing={0}>\n          <RingProgress size={120} sections={toRingProgressSections(allLibs.videoResolutions)} />\n          <Text size=\"xs\">{t('views.statistics.pies.videoResolutions')}</Text>\n        </Stack>\n      </Group>\n    </Stack>\n  );\n}\n\nfunction toRingProgressSections(segments: TdarrPieSegment[]): RingProgressProps['sections'] {\n  const total = segments.reduce((prev, curr) => prev + curr.value , 0);\n  return segments.map((segment, index) => ({\n    value: (segment.value * 100) / total,\n    tooltip: `${segment.name}: ${segment.value}`,\n    color: PIE_COLORS[index % PIE_COLORS.length], // Ensures a valid color in the case that index > PIE_COLORS.length\n  }));\n}\n\ntype StatBoxProps = {\n  icon: ReactNode;\n  label: string;\n};\n\nfunction StatBox(props: StatBoxProps) {\n  const { icon, label } = props;\n  return (\n    <Box\n      sx={(theme) => ({\n        padding: theme.spacing.xs,\n        border: '1px solid',\n        borderRadius: theme.radius.md,\n        borderColor: theme.colorScheme === 'dark' ? theme.colors.dark[3] : theme.colors.gray[1],\n      })}\n    >\n      <Stack spacing=\"xs\" align=\"center\">\n        {icon}\n        <Text size=\"xs\">\n          {label}\n        </Text>\n      </Stack>\n    </Box>\n  );\n}\n"
  },
  {
    "path": "src/widgets/media-transcoding/WorkersPanel.tsx",
    "content": "import {\n  Center,\n  Group,\n  Progress,\n  ScrollArea,\n  Table,\n  Text,\n  Title,\n  Tooltip,\n} from '@mantine/core';\nimport { IconHeartbeat, IconTransform } from '@tabler/icons-react';\nimport { useTranslation } from 'next-i18next';\nimport { WidgetLoading } from '~/widgets/loading';\nimport { TdarrWorker } from '~/types/api/tdarr';\n\ninterface WorkersPanelProps {\n  workers: TdarrWorker[] | undefined;\n  isLoading: boolean;\n}\n\nexport function WorkersPanel(props: WorkersPanelProps) {\n  const { workers, isLoading } = props;\n\n  const { t } = useTranslation('modules/media-transcoding');\n\n  if (isLoading) {\n    return <WidgetLoading />;\n  }\n\n  if (!workers?.length) {\n    return (\n      <Center\n        style={{ flex: '1' }}\n      >\n        <Title order={3}>{t('views.workers.table.empty')}</Title>\n      </Center>\n    );\n  }\n\n  return (\n    <ScrollArea style={{ flex: '1' }}>\n      <Table style={{ tableLayout: 'fixed' }}>\n        <thead>\n          <tr>\n            <th>{t('views.workers.table.header.name')}</th>\n            <th style={{ width: 60 }}>{t('views.workers.table.header.eta')}</th>\n            <th style={{ width: 175 }}>{t('views.workers.table.header.progress')}</th>\n          </tr>\n        </thead>\n        <tbody>\n          {workers.map((worker) => (\n            <tr key={worker.id}>\n              <td>\n                <Group spacing=\"xs\" noWrap>\n                  <div>\n                    {worker.jobType === 'transcode' ? (\n                      <Tooltip label={t('views.workers.table.tooltip.transcode')}>\n                        <IconTransform size={14} />\n                      </Tooltip>\n                    ) : (\n                      <Tooltip label={t('views.workers.table.tooltip.healthCheck')}>\n                        <IconHeartbeat size={14} />\n                      </Tooltip>\n                    )}\n                  </div>\n                  <Text lineClamp={1} size=\"xs\">{worker.filePath.split('\\\\').pop()?.split('/').pop() ?? worker.filePath}</Text>\n                </Group>\n              </td>\n              <td>\n                <Text size=\"xs\">\n                  {worker.ETA.startsWith('0:') ? worker.ETA.substring(2) : worker.ETA}\n                </Text>\n              </td>\n              <td>\n                <Group noWrap spacing=\"xs\">\n                  <Text size=\"xs\">{worker.step}</Text>\n                  <Progress\n                    value={worker.percentage}\n                    size=\"lg\"\n                    radius=\"xl\"\n                    style={{\n                      flex: 1,\n                    }}\n                  />\n                  <Text size=\"xs\">{Math.round(worker.percentage)}%</Text>\n                </Group>\n              </td>\n            </tr>\n          ))}\n        </tbody>\n      </Table>\n    </ScrollArea>\n  );\n}\n"
  },
  {
    "path": "src/widgets/notebook/NotebookEditor.tsx",
    "content": "import {\n  ActionIcon,\n  Button,\n  ColorPicker,\n  ColorSwatch,\n  Group,\n  NumberInput,\n  Popover,\n  ScrollArea,\n  Stack,\n  TextInput,\n  useMantineTheme,\n} from '@mantine/core';\nimport { useDisclosure, useInputState } from '@mantine/hooks';\nimport { Link, RichTextEditor, useRichTextEditorContext } from '@mantine/tiptap';\nimport {\n  IconCheck,\n  IconCircleOff,\n  IconColumnInsertLeft,\n  IconColumnInsertRight,\n  IconColumnRemove,\n  IconDeviceFloppy,\n  IconEdit,\n  IconHighlight,\n  IconIndentDecrease,\n  IconIndentIncrease,\n  IconLayoutGrid,\n  IconLetterA,\n  IconListCheck,\n  IconPhoto,\n  IconRowInsertBottom,\n  IconRowInsertTop,\n  IconRowRemove,\n  IconTableOff,\n  IconTablePlus,\n  IconX,\n} from '@tabler/icons-react';\nimport { Color } from '@tiptap/extension-color';\nimport Highlight from '@tiptap/extension-highlight';\nimport Image from '@tiptap/extension-image';\nimport Table from '@tiptap/extension-table';\nimport TableCell from '@tiptap/extension-table-cell';\nimport TableHeader from '@tiptap/extension-table-header';\nimport TableRow from '@tiptap/extension-table-row';\nimport TaskItem from '@tiptap/extension-task-item';\nimport TaskList from '@tiptap/extension-task-list';\nimport TextAlign from '@tiptap/extension-text-align';\nimport TextStyle from '@tiptap/extension-text-style';\nimport Underline from '@tiptap/extension-underline';\nimport { BubbleMenu, useEditor } from '@tiptap/react';\nimport StarterKit from '@tiptap/starter-kit';\nimport { useSession } from 'next-auth/react';\nimport { useTranslation } from 'next-i18next';\nimport { Dispatch, SetStateAction, useState } from 'react';\nimport { useEditModeStore } from '~/components/Dashboard/Views/useEditModeStore';\nimport { useConfigContext } from '~/config/provider';\nimport { useConfigStore } from '~/config/store';\nimport { api } from '~/utils/api';\n\nimport { WidgetLoading } from '../loading';\nimport { INotebookWidget } from './NotebookWidgetTile';\n\nexport function Editor({ widget }: { widget: INotebookWidget }) {\n  const [content, setContent] = useState(widget.properties.content);\n  const [toSaveContent, setToSaveContent] = useState(content);\n  const isEditMode = useEditModeStore((x) => x.enabled);\n\n  const { data: sessionData } = useSession();\n  const enabled = !!sessionData?.user.isAdmin && !isEditMode;\n  const [isEditing, setIsEditing] = useState(false);\n\n  const { config, name: configName } = useConfigContext();\n  const updateConfig = useConfigStore((x) => x.updateConfig);\n  const { primaryColor } = useMantineTheme();\n\n  const { mutateAsync } = api.notebook.update.useMutation();\n\n  const { t } = useTranslation(['modules/notebook', 'common']);\n\n  const editor = useEditor(\n    {\n      extensions: [\n        Color,\n        Highlight.configure({ multicolor: true }),\n        Image.extend({\n          addAttributes() {\n            return {\n              ...this.parent?.(),\n              width: { default: null },\n            };\n          },\n        }).configure({ inline: true }),\n        Link.configure({\n          openOnClick: true,\n          validate(url) {\n            return /^https?:\\/\\//.test(url);\n          },\n        }).extend({\n          addAttributes() {\n            return {\n              ...this.parent?.(),\n              target: { default: null }\n            }\n          }\n        }),\n        StarterKit,\n        Table.configure({\n          resizable: true,\n          lastColumnResizable: false,\n        }),\n        TableCell.extend({\n          addAttributes() {\n            return {\n              ...this.parent?.(),\n              backgroundColor: {\n                default: undefined,\n                renderHTML: (attributes) => ({\n                  style: attributes.backgroundColor\n                    ? `background-color: ${attributes.backgroundColor}`\n                    : undefined,\n                }),\n                parseHTML: (element) => element.style.backgroundColor || undefined,\n              },\n            };\n          },\n        }),\n        TableHeader,\n        TableRow,\n        TaskItem.configure({\n          nested: true,\n          onReadOnlyChecked: (node, checked) => {\n            if (widget.properties.allowReadOnlyCheck && enabled) {\n              const event = new CustomEvent('onReadOnlyCheck', { detail: { node, checked } });\n              dispatchEvent(event);\n              return true;\n            }\n            return false;\n          },\n        }),\n        TaskList.configure({ itemTypeName: 'taskItem' }),\n        TextAlign.configure({ types: ['heading', 'paragraph'] }),\n        TextStyle,\n        Underline,\n      ],\n      content,\n      onUpdate: (e) => {\n        setContent(e.editor.getHTML());\n      },\n      onCreate: (e) => {\n        e.editor.setEditable(false);\n      },\n    },\n    [toSaveContent]\n  );\n\n  const handleOnReadOnlyCheck = (event: CustomEventInit) => {\n    if (widget.properties.allowReadOnlyCheck && !!editor) {\n      editor.state.doc.descendants((subnode, pos) => {\n        if (subnode.eq(event.detail.node)) {\n          const { tr } = editor.state;\n          tr.setNodeMarkup(pos, undefined, {\n            ...event.detail.node.attrs,\n            checked: event.detail.checked,\n          });\n          editor.view.dispatch(tr);\n          setContent(editor.getHTML());\n          handleConfigUpdate(editor.getHTML());\n        }\n      });\n    }\n  };\n\n  addEventListener('onReadOnlyCheck', handleOnReadOnlyCheck);\n\n  const handleEditToggle = (previous: boolean) => {\n    const current = !previous;\n    if (!editor) return current;\n    editor.setEditable(current);\n\n    handleConfigUpdate(content);\n\n    return current;\n  };\n\n  const handleEditCancel = () => {\n    if (!editor) return false;\n    editor.setEditable(false);\n\n    setContent(toSaveContent);\n    editor.commands.setContent(toSaveContent);\n\n    return false;\n  };\n\n  const handleConfigUpdate = (contentUpdate: string) => {\n    setToSaveContent(contentUpdate);\n    updateConfig(\n      configName!,\n      (previous) => {\n        const currentWidget = previous.widgets.find((x) => x.id === widget.id);\n        currentWidget!.properties.content = contentUpdate;\n\n        return {\n          ...previous,\n          widgets: [\n            ...previous.widgets.filter((iterationWidget) => iterationWidget.id !== widget.id),\n            currentWidget!,\n          ],\n        };\n      },\n      true\n    );\n\n    void mutateAsync({\n      configName: configName!,\n      content: contentUpdate,\n      widgetId: widget.id,\n    });\n  };\n\n  if (!config || !configName) return <WidgetLoading />;\n\n  return (\n    <>\n      <RichTextEditor\n        p={0}\n        mt={0}\n        h=\"100%\"\n        editor={editor}\n        styles={(theme) => ({\n          root: {\n            '& .ProseMirror': {\n              padding: '0  !important',\n            },\n            backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[6] : 'white',\n            border: 'none',\n            borderRadius: '0.5rem',\n            display: 'flex',\n            flexDirection: 'column',\n          },\n          toolbar: {\n            backgroundColor: 'transparent',\n            padding: '0.5rem',\n          },\n          content: {\n            backgroundColor: 'transparent',\n            padding: '0.5rem',\n          },\n        })}\n      >\n        <RichTextEditor.Toolbar\n          style={{\n            display: isEditing && widget.properties.showToolbar === true ? 'flex' : 'none',\n          }}\n        >\n          <RichTextEditor.ControlsGroup>\n            <RichTextEditor.Bold title={t('card.controls.bold')!} />\n            <RichTextEditor.Italic title={t('card.controls.italic')!} />\n            <RichTextEditor.Strikethrough title={t('card.controls.strikethrough')!} />\n            <RichTextEditor.Underline title={t('card.controls.underline')!} />\n            <ColoredText />\n            <ColoredHighlight />\n            <RichTextEditor.Code title={t('card.controls.code')!} />\n            <RichTextEditor.ClearFormatting title={t('card.controls.clear')!} />\n          </RichTextEditor.ControlsGroup>\n\n          <RichTextEditor.ControlsGroup>\n            <RichTextEditor.H1 title={t('card.controls.heading', { level: '1' })!} />\n            <RichTextEditor.H2 title={t('card.controls.heading', { level: '2' })!} />\n            <RichTextEditor.H3 title={t('card.controls.heading', { level: '3' })!} />\n            <RichTextEditor.H4 title={t('card.controls.heading', { level: '4' })!} />\n          </RichTextEditor.ControlsGroup>\n\n          <RichTextEditor.ControlsGroup>\n            <RichTextEditor.AlignLeft\n              title={t('card.controls.align', { position: t('common:position.left') })!}\n            />\n            <RichTextEditor.AlignCenter\n              title={t('card.controls.align', { position: t('common:position.center') })!}\n            />\n            <RichTextEditor.AlignRight\n              title={t('card.controls.align', { position: t('common:position.right') })!}\n            />\n          </RichTextEditor.ControlsGroup>\n\n          <RichTextEditor.ControlsGroup>\n            <RichTextEditor.Blockquote title={t('card.controls.blockquote')!} />\n            <RichTextEditor.Hr title={t('card.controls.horizontalLine')!} />\n          </RichTextEditor.ControlsGroup>\n\n          <RichTextEditor.ControlsGroup>\n            <RichTextEditor.BulletList title={t('card.controls.bulletList')!} />\n            <RichTextEditor.OrderedList title={t('card.controls.orderedList')!} />\n            <TaskListToggle />\n            {(editor?.isActive('taskList') ||\n              editor?.isActive('bulletList') ||\n              editor?.isActive('orderedList')) && (\n              <>\n                <ListIndentIncrease />\n                <ListIndentDecrease />\n              </>\n            )}\n          </RichTextEditor.ControlsGroup>\n\n          <RichTextEditor.ControlsGroup>\n            <RichTextEditor.Link title={t('card.controls.link')!} />\n            <RichTextEditor.Unlink title={t('card.controls.unlink')!} />\n            <EmbedImage />\n          </RichTextEditor.ControlsGroup>\n\n          <RichTextEditor.ControlsGroup>\n            <TableToggle />\n            {editor?.isActive('table') && (\n              <>\n                <ColoredCell />\n                <TableToggleMerge />\n                <TableAddColumnBefore />\n                <TableAddColumnAfter />\n                <TableRemoveColumn />\n                <TableAddRowBefore />\n                <TableAddRowAfter />\n                <TableRemoveRow />\n              </>\n            )}\n          </RichTextEditor.ControlsGroup>\n        </RichTextEditor.Toolbar>\n        {editor && (\n          <BubbleMenu editor={editor}>\n            <RichTextEditor.ControlsGroup>\n              <RichTextEditor.Bold title={t('card.controls.bold')!} />\n              <RichTextEditor.Italic title={t('card.controls.italic')!} />\n              <RichTextEditor.Link title={t('card.controls.link')!} />\n            </RichTextEditor.ControlsGroup>\n          </BubbleMenu>\n        )}\n\n        <ScrollArea mih=\"4rem\" offsetScrollbars pl={12} pt={12}>\n          <RichTextEditor.Content />\n        </ScrollArea>\n      </RichTextEditor>\n      {enabled && (\n        <>\n          <ActionIcon\n            title={isEditing ? t('common:save') : t('common:edit')}\n            style={{\n              zIndex: 1,\n            }}\n            top={7}\n            right={7}\n            pos=\"absolute\"\n            color={primaryColor}\n            variant=\"light\"\n            size={30}\n            radius={'md'}\n            onClick={() => setIsEditing(handleEditToggle)}\n          >\n            {isEditing ? <IconDeviceFloppy size={20} /> : <IconEdit size={20} />}\n          </ActionIcon>\n          {isEditing && (\n            <ActionIcon\n              title={t('common:cancel')}\n              style={{\n                zIndex: 1,\n              }}\n              top={44}\n              right={7}\n              pos=\"absolute\"\n              color={primaryColor}\n              variant=\"light\"\n              size={30}\n              radius={'md'}\n              onClick={() => setIsEditing(handleEditCancel)}\n            >\n              <IconX size={20} />\n            </ActionIcon>\n          )}\n        </>\n      )}\n    </>\n  );\n}\n\nfunction ColoredHighlight() {\n  const { editor } = useRichTextEditorContext();\n  const defaultColor = 'transparent';\n  const [color, setColor] = useState<string>(defaultColor);\n\n  const { t } = useTranslation(['modules/notebook']);\n\n  return (\n    <ColoredControl\n      color={color}\n      setColor={setColor}\n      hoverText={t('card.controls.colorHighlight')}\n      icon={<IconHighlight stroke={1.5} size=\"1rem\" />}\n      selectionUpdate={() => {\n        setColor(editor.getAttributes('highlight').color ?? defaultColor);\n      }}\n      onSaveHandle={() => {\n        editor.chain().focus().setHighlight({ color: color }).run();\n      }}\n      onUnsetHandle={() => {\n        editor.chain().focus().unsetHighlight().run();\n        setColor(defaultColor);\n      }}\n    />\n  );\n}\n\nfunction ColoredText() {\n  const { editor } = useRichTextEditorContext();\n  const { black, colors, colorScheme } = useMantineTheme();\n  const defaultColor = colorScheme === 'dark' ? colors.dark[0] : black;\n  const [color, setColor] = useState<string>(defaultColor);\n\n  const { t } = useTranslation(['modules/notebook']);\n\n  return (\n    <ColoredControl\n      color={color}\n      setColor={setColor}\n      hoverText={t('card.controls.colorText')}\n      icon={<IconLetterA stroke={1.5} size=\"1rem\" />}\n      selectionUpdate={() => {\n        setColor(editor.getAttributes('textStyle').color ?? defaultColor);\n      }}\n      onSaveHandle={() => {\n        editor.chain().focus().setColor(color).run();\n      }}\n      onUnsetHandle={() => {\n        editor.chain().focus().unsetColor().run();\n        setColor(defaultColor);\n      }}\n    />\n  );\n}\n\nfunction ColoredCell() {\n  const { editor } = useRichTextEditorContext();\n  const defaultColor = 'transparent';\n  const [color, setColor] = useState<string>(defaultColor);\n\n  const { t } = useTranslation(['modules/notebook']);\n\n  return (\n    <ColoredControl\n      color={color}\n      setColor={setColor}\n      hoverText={t('card.controls.colorCell')}\n      icon={<IconLayoutGrid stroke={1.5} size=\"1.25rem\" />}\n      selectionUpdate={() => {\n        setColor(editor.getAttributes('tableCell').backgroundColor ?? defaultColor);\n      }}\n      onSaveHandle={() => {\n        editor.chain().focus().setCellAttribute('backgroundColor', color).run();\n      }}\n      onUnsetHandle={() => {\n        editor.chain().focus().setCellAttribute('backgroundColor', undefined).run();\n        setColor(defaultColor);\n      }}\n    />\n  );\n}\n\ninterface ColoredControlProps {\n  color: string;\n  setColor: Dispatch<SetStateAction<string>>;\n  hoverText: string;\n  icon: JSX.Element;\n  selectionUpdate: () => any;\n  onSaveHandle: () => any;\n  onUnsetHandle: () => any;\n}\n\nfunction ColoredControl({\n  color,\n  setColor,\n  hoverText,\n  icon,\n  selectionUpdate,\n  onSaveHandle,\n  onUnsetHandle,\n}: ColoredControlProps) {\n  const { editor } = useRichTextEditorContext();\n  const { colors, colorScheme, white } = useMantineTheme();\n  const [opened, { close, toggle }] = useDisclosure(false);\n\n  const { t } = useTranslation(['modules/notebook']);\n\n  const palette = [\n    '#000000',\n    colors.dark[9],\n    colors.dark[6],\n    colors.dark[3],\n    colors.dark[0],\n    '#FFFFFF',\n    colors.red[9],\n    colors.pink[7],\n    colors.grape[8],\n    colors.violet[9],\n    colors.indigo[9],\n    colors.blue[5],\n    colors.green[6],\n    '#09D630',\n    colors.lime[5],\n    colors.yellow[5],\n    '#EB8415',\n    colors.orange[9],\n  ];\n\n  editor?.on('selectionUpdate', selectionUpdate);\n\n  return (\n    <Popover\n      opened={opened}\n      onChange={toggle}\n      styles={{\n        dropdown: {\n          backgroundColor: colorScheme === 'dark' ? colors.dark[7] : white,\n        },\n      }}\n    >\n      <Popover.Target>\n        <RichTextEditor.Control onClick={toggle} title={hoverText}>\n          <Group spacing={3} px=\"0.2rem\">\n            {icon}\n            <ColorSwatch size={14} color={color} />\n          </Group>\n        </RichTextEditor.Control>\n      </Popover.Target>\n      <Popover.Dropdown>\n        <Stack spacing={8}>\n          <ColorPicker\n            value={color}\n            onChange={setColor}\n            format=\"hexa\"\n            swatches={palette}\n            swatchesPerRow={6}\n          />\n          <Group position=\"right\" spacing={8}>\n            <ActionIcon title={t('common:cancel')} variant=\"default\" onClick={close}>\n              <IconX stroke={1.5} size=\"1rem\" />\n            </ActionIcon>\n            <ActionIcon\n              title={t('common:apply')}\n              variant=\"default\"\n              onClick={() => {\n                onSaveHandle();\n                close();\n              }}\n            >\n              <IconCheck stroke={1.5} size=\"1rem\" />\n            </ActionIcon>\n            <ActionIcon\n              title={t('card.modals.clearColor')}\n              variant=\"default\"\n              onClick={() => {\n                onUnsetHandle();\n                close();\n              }}\n            >\n              <IconCircleOff stroke={1.5} size=\"1rem\" />\n            </ActionIcon>\n          </Group>\n        </Stack>\n      </Popover.Dropdown>\n    </Popover>\n  );\n}\n\nfunction EmbedImage() {\n  const { editor } = useRichTextEditorContext();\n  const { colors, colorScheme, white } = useMantineTheme();\n  const [opened, { open, close, toggle }] = useDisclosure(false);\n  const [src, setSrc] = useInputState<string>('');\n  const [width, setWidth] = useInputState<string>('');\n\n  const { t } = useTranslation(['modules/notebook']);\n\n  function setImage() {\n    editor.commands.insertContent({\n      type: 'paragraph',\n      content: [\n        {\n          type: 'image',\n          attrs: {\n            width: width,\n            src: src,\n          },\n        },\n      ],\n    });\n    close();\n  }\n\n  return (\n    <Popover\n      opened={opened}\n      onClose={() => {\n        close();\n        setSrc('');\n        setWidth('');\n      }}\n      onOpen={() => {\n        open();\n        setSrc(editor == null ? '' : editor.getAttributes('image').src);\n        setWidth(editor == null ? '' : editor.getAttributes('image').width);\n      }}\n      position=\"left\"\n      styles={{\n        dropdown: {\n          backgroundColor: colorScheme === 'dark' ? colors.dark[7] : white,\n        },\n      }}\n      trapFocus\n    >\n      <Popover.Target>\n        <RichTextEditor.Control\n          onClick={toggle}\n          title={t('card.controls.image')!}\n          active={editor?.isActive('image')}\n        >\n          <IconPhoto stroke={1.5} size=\"1rem\" />\n        </RichTextEditor.Control>\n      </Popover.Target>\n      <Popover.Dropdown>\n        <Stack spacing={5}>\n          <TextInput\n            label={t('card.modals.source')}\n            value={src || ''}\n            onChange={setSrc}\n            onKeyDown={(e) => {\n              if (e.key === 'Enter') {\n                e.preventDefault();\n                setImage();\n              }\n            }}\n            placeholder=\"https://example.com/\"\n          />\n          <TextInput\n            label={t('common:attributes.width')}\n            value={width || ''}\n            onChange={setWidth}\n            onKeyDown={(e) => {\n              if (e.key === 'Enter') {\n                e.preventDefault();\n                setImage();\n              }\n            }}\n            placeholder={t('card.modals.widthPlaceholder')!}\n          />\n          <Button children={t('common:save')} variant=\"default\" mt={10} mb={5} onClick={setImage} />\n        </Stack>\n      </Popover.Dropdown>\n    </Popover>\n  );\n}\n\nfunction TaskListToggle() {\n  const { editor } = useRichTextEditorContext();\n\n  const { t } = useTranslation(['modules/notebook']);\n\n  return (\n    <RichTextEditor.Control\n      title={t('card.controls.checkList')!}\n      onClick={() => editor.chain().focus().toggleTaskList().run()}\n      active={editor?.isActive('taskList')}\n    >\n      <IconListCheck stroke={1.5} size=\"1rem\" />\n    </RichTextEditor.Control>\n  );\n}\n\nfunction ListIndentIncrease() {\n  const { editor } = useRichTextEditorContext();\n  const [itemType, setItemType] = useState('listItem');\n\n  const { t } = useTranslation(['modules/notebook']);\n\n  editor?.on('selectionUpdate', ({ editor }) => {\n    setItemType(editor?.isActive('taskItem') ? 'taskItem' : 'listItem');\n  });\n\n  return (\n    <RichTextEditor.Control\n      title={t('card.controls.increaseIndent')!}\n      onClick={() => editor.chain().focus().sinkListItem(itemType).run()}\n      interactive={editor.can().sinkListItem(itemType)}\n    >\n      <IconIndentIncrease stroke={1.5} size=\"1rem\" />\n    </RichTextEditor.Control>\n  );\n}\n\nfunction ListIndentDecrease() {\n  const { editor } = useRichTextEditorContext();\n  const [itemType, setItemType] = useState('listItem');\n\n  const { t } = useTranslation(['modules/notebook']);\n\n  editor?.on('selectionUpdate', ({ editor }) => {\n    setItemType(editor?.isActive('taskItem') ? 'taskItem' : 'listItem');\n  });\n\n  return (\n    <RichTextEditor.Control\n      title={t('card.controls.decreaseIndent')!}\n      onClick={() => editor.chain().focus().liftListItem(itemType).run()}\n      interactive={editor.can().liftListItem(itemType)}\n    >\n      <IconIndentDecrease stroke={1.5} size=\"1rem\" />\n    </RichTextEditor.Control>\n  );\n}\n\nfunction TableAddColumnBefore() {\n  const { editor } = useRichTextEditorContext();\n\n  const { t } = useTranslation(['modules/notebook']);\n\n  return (\n    <RichTextEditor.Control\n      title={t('card.controls.addColumnLeft')!}\n      onClick={() => editor?.commands.addColumnBefore()}\n    >\n      <IconColumnInsertLeft stroke={1.5} size=\"1.25rem\" />\n    </RichTextEditor.Control>\n  );\n}\n\nfunction TableAddColumnAfter() {\n  const { editor } = useRichTextEditorContext();\n\n  const { t } = useTranslation(['modules/notebook']);\n\n  return (\n    <RichTextEditor.Control\n      title={t('card.controls.addColumnRight')!}\n      onClick={() => editor?.commands.addColumnAfter()}\n    >\n      <IconColumnInsertRight stroke={1.5} size=\"1.25rem\" />\n    </RichTextEditor.Control>\n  );\n}\n\nfunction TableRemoveColumn() {\n  const { editor } = useRichTextEditorContext();\n\n  const { t } = useTranslation(['modules/notebook']);\n\n  return (\n    <RichTextEditor.Control\n      title={t('card.controls.deleteColumn')!}\n      onClick={() => editor?.commands.deleteColumn()}\n    >\n      <IconColumnRemove stroke={1.5} size=\"1.25rem\" />\n    </RichTextEditor.Control>\n  );\n}\n\nfunction TableAddRowBefore() {\n  const { editor } = useRichTextEditorContext();\n\n  const { t } = useTranslation(['modules/notebook']);\n\n  return (\n    <RichTextEditor.Control\n      title={t('card.controls.addRowTop')!}\n      onClick={() => editor?.commands.addRowBefore()}\n    >\n      <IconRowInsertTop stroke={1.5} size=\"1.25rem\" />\n    </RichTextEditor.Control>\n  );\n}\n\nfunction TableAddRowAfter() {\n  const { editor } = useRichTextEditorContext();\n\n  const { t } = useTranslation(['modules/notebook']);\n\n  return (\n    <RichTextEditor.Control\n      title={t('card.controls.addRowBelow')!}\n      onClick={() => editor?.commands.addRowAfter()}\n    >\n      <IconRowInsertBottom stroke={1.5} size=\"1.25rem\" />\n    </RichTextEditor.Control>\n  );\n}\n\nfunction TableRemoveRow() {\n  const { editor } = useRichTextEditorContext();\n\n  const { t } = useTranslation(['modules/notebook']);\n\n  return (\n    <RichTextEditor.Control\n      title={t('card.controls.deleteRow')!}\n      onClick={() => editor?.commands.deleteRow()}\n    >\n      <IconRowRemove stroke={1.5} size=\"1.25rem\" />\n    </RichTextEditor.Control>\n  );\n}\n\nfunction TableToggleMerge() {\n  const { editor } = useRichTextEditorContext();\n\n  const { t } = useTranslation(['modules/notebook']);\n\n  return (\n    <RichTextEditor.Control\n      title={t('card.controls.mergeCell')!}\n      onClick={() => editor?.commands.mergeOrSplit()}\n      active={editor?.getAttributes('tableCell').colspan > 1}\n    >\n      <svg\n        height=\"1.25rem\"\n        width=\"1.25rem\"\n        strokeWidth=\"0.1\"\n        stroke=\"currentColor\"\n        viewBox=\"0 0 24 24\"\n        xmlns=\"http://www.w3.org/2000/svg\"\n      >\n        {/* No existing icon from tabler, taken from https://icon-sets.iconify.design/fluent/table-cells-merge-24-regular/ */}\n        <path\n          fill=\"currentColor\"\n          d=\"M15.58 11.25H8.42l.89-1.002a.75.75 0 0 0-1.12-.996l-2 2.25a.75.75 0 0 0 0 .996l2 2.25a.75.75 0 1 0 1.12-.996l-.89-1.002h7.16l-.89 1.002a.75.75 0 0 0 1.12.996l2-2.25l.011-.012a.746.746 0 0 0-.013-.987l-1.997-2.247a.75.75 0 0 0-1.121.996l.89 1.002ZM6.25 3A3.25 3.25 0 0 0 3 6.25v11.5A3.25 3.25 0 0 0 6.25 21h11.5A3.25 3.25 0 0 0 21 17.75V6.25A3.25 3.25 0 0 0 17.75 3H6.25ZM4.5 6.25c0-.966.784-1.75 1.75-1.75h11.5c.966 0 1.75.784 1.75 1.75v.25h-15v-.25ZM4.5 8h15v8h-15V8Zm15 9.5v.25a1.75 1.75 0 0 1-1.75 1.75H6.25a1.75 1.75 0 0 1-1.75-1.75v-.25h15Z\"\n        />\n      </svg>\n    </RichTextEditor.Control>\n  );\n}\n\nfunction TableToggle() {\n  const { editor } = useRichTextEditorContext();\n  const isActive = editor?.isActive('table');\n\n  const { colors, colorScheme, white } = useMantineTheme();\n\n  const [opened, { open, close, toggle }] = useDisclosure(false);\n\n  const defaultCols = 3;\n  const [cols, setCols] = useState<number>(defaultCols);\n  const defaultRows = 3;\n  const [rows, setRows] = useState<number>(defaultRows);\n\n  const { t } = useTranslation(['modules/notebook']);\n\n  function InsertTable(cols: number, rows: number) {\n    editor?.commands.insertTable({ rows, cols, withHeaderRow: false });\n    close();\n  }\n\n  return (\n    <Popover\n      opened={opened}\n      onOpen={() => {\n        open();\n        setCols(defaultCols);\n        setRows(defaultRows);\n      }}\n      onClose={close}\n      styles={{\n        dropdown: {\n          backgroundColor: colorScheme === 'dark' ? colors.dark[7] : white,\n        },\n      }}\n      trapFocus\n    >\n      <Popover.Target>\n        <RichTextEditor.Control\n          title={t(`card.controls.${isActive ? 'deleteTable' : 'addTable'}`)!}\n          active={isActive}\n          onClick={isActive ? () => editor.commands.deleteTable() : () => toggle()}\n        >\n          {isActive ? (\n            <IconTableOff stroke={1.5} size=\"1rem\" />\n          ) : (\n            <IconTablePlus stroke={1.5} size=\"1rem\" />\n          )}\n        </RichTextEditor.Control>\n      </Popover.Target>\n      <Popover.Dropdown>\n        <Stack spacing={5}>\n          <NumberInput\n            label={t('card.modals.columns')}\n            min={1}\n            value={cols}\n            onChange={(e) => {\n              if (e !== '') {\n                setCols(e);\n              } else {\n                setCols(0);\n              }\n            }}\n            onKeyDown={(e) => {\n              if (e.key === 'Enter') {\n                e.preventDefault();\n                InsertTable(cols, rows);\n              }\n            }}\n          />\n          <NumberInput\n            label={t('card.modals.rows')}\n            min={1}\n            value={rows}\n            onChange={(e) => {\n              if (e !== '') {\n                setRows(e);\n              } else {\n                setRows(0);\n              }\n            }}\n            onKeyDown={(e) => {\n              if (e.key === 'Enter') {\n                e.preventDefault();\n                InsertTable(cols, rows);\n              }\n            }}\n          />\n          <Button\n            children={t('common:insert')}\n            variant=\"default\"\n            mt={10}\n            mb={5}\n            onClick={() => InsertTable(cols, rows)}\n          />\n        </Stack>\n      </Popover.Dropdown>\n    </Popover>\n  );\n}\n"
  },
  {
    "path": "src/widgets/notebook/NotebookWidgetTile.tsx",
    "content": "import { IconNotes } from '@tabler/icons-react';\nimport dynamic from 'next/dynamic';\n\nimport { defineWidget } from '../helper';\nimport { IWidget } from '../widgets';\n\nconst Editor = dynamic(() => import('./NotebookEditor').then((module) => module.Editor), {\n  ssr: false,\n});\n\nconst definition = defineWidget({\n  id: 'notebook',\n  icon: IconNotes,\n  options: {\n    showToolbar: {\n      type: 'switch',\n      defaultValue: true,\n    },\n    allowReadOnlyCheck: {\n      type: 'switch',\n      defaultValue: true,\n    },\n    content: {\n      type: 'text',\n      hide: true,\n      defaultValue: `<p style=\\\"text-align: center\\\"><img src=\\\"/imgs/logo/logo.png\\\" width=\\\"25%\\\"></p><h2>Welcome to <strong><span style=\\\"color: rgb(250, 82, 82)\\\">Homarr</span>'s</strong> notebook widget</h2><p>The <code>notebook</code> widget focuses on usability and is designed to be as simple as possible to bring a familiar editing experience to regular users, be it markdown or office type editors. It is based on <a target=\\\"_blank\\\" rel=\\\"noopener noreferrer nofollow\\\" href=\\\"https://tiptap.dev/\\\">Tiptap.dev</a> and supports most of its features:</p><table><tbody><tr><td colspan=\\\"3\\\" rowspan=\\\"1\\\" style=\\\"background-color: rgba(95, 95, 95, 0.5)\\\"><h4 style=\\\"text-align: center\\\">General text formatting</h4></td></tr><tr><td colspan=\\\"1\\\" rowspan=\\\"1\\\"><p><strong>Bold</strong></p></td><td colspan=\\\"1\\\" rowspan=\\\"1\\\"><p style=\\\"text-align: center\\\"><em>Italic</em></p></td><td colspan=\\\"1\\\" rowspan=\\\"1\\\"><p style=\\\"text-align: right\\\"><u>Underline</u></p></td></tr><tr><td colspan=\\\"1\\\" rowspan=\\\"1\\\"><p><s>Strike-through</s></p></td><td colspan=\\\"1\\\" rowspan=\\\"1\\\"><p style=\\\"text-align: center\\\">Text alignment</p></td><td colspan=\\\"1\\\" rowspan=\\\"1\\\"><p style=\\\"text-align: right\\\">Headings</p></td></tr></tbody></table><table><tbody><tr><td colspan=\\\"3\\\" rowspan=\\\"1\\\" style=\\\"background-color: rgba(95, 95, 95, 0.5)\\\"><h4 style=\\\"text-align: center\\\">Lists</h4></td></tr><tr><td colspan=\\\"1\\\" rowspan=\\\"1\\\"><ol><li><p>Ordered</p></li></ol></td><td colspan=\\\"1\\\" rowspan=\\\"1\\\"><ul><li><p>Bullet</p></li></ul></td><td colspan=\\\"1\\\" rowspan=\\\"1\\\"><ul data-type=\\\"taskList\\\"><li data-checked=\\\"true\\\" data-type=\\\"taskItem\\\"><label><input type=\\\"checkbox\\\" checked=\\\"checked\\\"><span></span></label><div><p>Check</p></div></li></ul></td></tr></tbody></table><table><tbody><tr><td colspan=\\\"3\\\" rowspan=\\\"1\\\" style=\\\"background-color: rgba(95, 95, 95, 0.5)\\\"><h4 style=\\\"text-align: center\\\">Coloring</h4></td></tr><tr><td colspan=\\\"1\\\" rowspan=\\\"1\\\"><p><span style=\\\"color: rgb(250, 82, 82)\\\">Text coloring</span></p></td><td colspan=\\\"1\\\" rowspan=\\\"1\\\"><p style=\\\"text-align: center\\\"><mark data-color=\\\"#FA5252\\\" style=\\\"background-color: #FA5252; color: inherit\\\">highlighting</mark></p></td><td colspan=\\\"1\\\" rowspan=\\\"1\\\" style=\\\"background-color: rgb(250, 82, 82)\\\"><p style=\\\"text-align: right\\\">Table cells</p></td></tr></tbody></table><table><tbody><tr><td colspan=\\\"3\\\" rowspan=\\\"1\\\" style=\\\"background-color: rgba(95, 95, 95, 0.5)\\\"><h4 style=\\\"text-align: center\\\">Inserts</h4></td></tr><tr><td colspan=\\\"1\\\" rowspan=\\\"1\\\"><p>Links</p></td><td colspan=\\\"1\\\" rowspan=\\\"1\\\"><p style=\\\"text-align: center\\\">Images</p></td><td colspan=\\\"1\\\" rowspan=\\\"1\\\"><p style=\\\"text-align: right\\\">Tables</p></td></tr></tbody></table><hr><blockquote><h4>Widget options</h4><ul><li><p>Show the toolbar to help you write markdown:</p><p>The toolbar at the top that helps with controls, some not available in markdown.</p></li><li><p>Allow check in read only mode:</p><p>Check boxes usable outside of editing, also allows anonymous checks.</p></li></ul></blockquote>`,\n    },\n  },\n  gridstack: {\n    minWidth: 1,\n    minHeight: 1,\n    maxWidth: 12,\n    maxHeight: 12,\n  },\n  component: NotebookWidget,\n});\n\nexport default definition;\n\nexport type INotebookWidget = IWidget<(typeof definition)['id'], typeof definition>;\n\ninterface NotebookWidgetProps {\n  widget: INotebookWidget;\n}\n\nfunction NotebookWidget(props: NotebookWidgetProps) {\n  return <Editor widget={props.widget} />;\n}\n"
  },
  {
    "path": "src/widgets/rss/RssWidgetTile.tsx",
    "content": "import {\n  ActionIcon,\n  Badge,\n  Card,\n  Center,\n  Flex,\n  Group,\n  Image,\n  Loader,\n  MediaQuery,\n  ScrollArea,\n  Stack,\n  Text,\n  Title,\n  createStyles,\n} from '@mantine/core';\nimport { IconClock, IconRefresh, IconRss } from '@tabler/icons-react';\nimport dayjs from 'dayjs';\nimport { useTranslation } from 'next-i18next';\nimport Link from 'next/link';\nimport { useConfigContext } from '~/config/provider';\nimport { api } from '~/utils/api';\n\nimport { defineWidget } from '../helper';\nimport { IWidget } from '../widgets';\n\nconst definition = defineWidget({\n  id: 'rss',\n  icon: IconRss,\n  options: {\n    rssFeedUrl: {\n      type: 'multiple-text',\n      defaultValue: ['https://noted.lol/rss'],\n    },\n    refreshInterval: {\n      type: 'slider',\n      defaultValue: 30,\n      min: 15,\n      max: 300,\n      step: 15,\n    },\n    dangerousAllowSanitizedItemContent: {\n      type: 'switch',\n      defaultValue: false,\n      info: true,\n    },\n    textLinesClamp: {\n      type: 'slider',\n      defaultValue: 5,\n      min: 1,\n      max: 50,\n      step: 1,\n    },\n    sortByPublishDateAscending: {\n      type: 'switch',\n      defaultValue: true,\n    },\n    sortPostsWithoutPublishDateToTheTop: {\n      type: 'switch',\n      defaultValue: false\n    },\n    maximumAmountOfPosts: {\n      type: 'slider',\n      defaultValue: 20,\n      min: 1,\n      max: 350,\n      step: 1\n    }\n  },\n  gridstack: {\n    minWidth: 2,\n    minHeight: 2,\n    maxWidth: 12,\n    maxHeight: 12,\n  },\n  component: RssTile,\n});\n\nexport type IRssWidget = IWidget<(typeof definition)['id'], typeof definition>;\n\ninterface RssTileProps {\n  widget: IRssWidget;\n}\n\nfunction RssTile({ widget }: RssTileProps) {\n  const { t } = useTranslation('modules/rss');\n  const { name: configName } = useConfigContext();\n  const { data, isLoading, isFetching, isError, refetch } = useGetRssFeeds(\n    configName,\n    widget.properties.rssFeedUrl,\n    widget.properties.refreshInterval,\n    widget.id,\n  );\n  const { classes } = useStyles();\n\n  function formatDate(input: string): string {\n    // Parse the input date as a local date\n    try {\n      const inputDate = dayjs(new Date(input));\n      const now = dayjs(); // Current date and time\n      const difference = now.diff(inputDate, 'ms');\n      const duration = dayjs.duration(difference, 'ms');\n      const humanizedDuration = duration.humanize();\n      return `${humanizedDuration} ago`;\n    } catch (e) {\n      return 'Error';\n    }\n  }\n\n  if (isLoading) {\n    return (\n      <Center h=\"100%\">\n        <Loader />\n      </Center>\n    );\n  }\n\n  if (!data || data.length < 1 || isError) {\n    return (\n      <Center h=\"100%\">\n        <Stack align=\"center\">\n          <IconRss size={25} strokeWidth={1} />\n          <Title order={5}>{t('descriptor.card.errors.general.title')}</Title>\n          <Text align=\"center\">{t('descriptor.card.errors.general.text')}</Text>\n        </Stack>\n        <RefetchButton refetch={refetch} isFetching={isFetching} />\n      </Center>\n    );\n  }\n\n  const flatFeeds = data.filter(feed => feed.success).flatMap(feed => feed.feed);\n  const flatFeedItems = flatFeeds.flatMap(feed => feed!.items);\n  const orderedFeedItems = widget.properties.sortByPublishDateAscending ?\n    flatFeedItems.sort((item1, item2) =>\n      (item2.pubDate?.getTime() as number) - (item1.pubDate?.getTime() as number)) : flatFeedItems;\n\n  return (\n    <Stack h=\"100%\">\n      <ScrollArea className=\"scroll-area-w100\" w=\"100%\" mt=\"sm\" mb=\"sm\">\n        <Stack w=\"100%\" spacing=\"xs\">\n          {orderedFeedItems.slice(0, widget.properties.maximumAmountOfPosts).map((item: any, index: number) => (\n            <Card\n              key={index}\n              withBorder\n              component={Link ?? 'div'}\n              href={item.link}\n              radius=\"md\"\n              target=\"_blank\"\n              w=\"100%\"\n            >\n              {item.enclosure && (\n                // eslint-disable-next-line @next/next/no-img-element\n                <img\n                  className={classes.backgroundImage}\n                  src={item.enclosure.url ?? undefined}\n                  alt=\"backdrop\"\n                />\n              )}\n\n              <Flex gap=\"xs\">\n                {item.enclosure && item.enclosure.url && (\n                  <MediaQuery query=\"(max-width: 1200px)\" styles={{ display: 'none' }}>\n                    <Image\n                      src={item.enclosure.url ?? undefined}\n                      width={140}\n                      height={140}\n                      radius=\"md\"\n                      withPlaceholder\n                    />\n                  </MediaQuery>\n                )}\n                <Flex gap={2} direction=\"column\" w=\"100%\">\n                  {item.categories && (\n                    <Flex gap=\"xs\" wrap=\"wrap\" h={20} style={{ overflow: 'hidden' }}>\n                      {item.categories.map((category: any, categoryIndex: number) => (\n                        <Badge key={categoryIndex}>{category}</Badge>\n                      ))}\n                    </Flex>\n                  )}\n\n                  <Text lineClamp={2}>{item.title}</Text>\n                  <Text\n                    className={classes.itemContent}\n                    color=\"dimmed\"\n                    size=\"xs\"\n                    lineClamp={widget.properties.textLinesClamp}\n                    dangerouslySetInnerHTML={{ __html: item.content }}\n                  />\n\n                  {item.pubDate && (\n                    <InfoDisplay title={item.title} date={formatDate(item.pubDate)} />\n                  )}\n                </Flex>\n              </Flex>\n            </Card>\n          ))}\n        </Stack>\n      </ScrollArea>\n\n      <RefetchButton refetch={refetch} isFetching={isFetching} />\n    </Stack>\n  );\n}\n\nexport const useGetRssFeeds = (\n  configName: string | undefined,\n  feedUrls: string[],\n  refreshInterval: number,\n  widgetId: string,\n) =>\n  api.rss.all.useQuery(\n    {\n      configName: configName ?? '',\n      feedUrls,\n      widgetId,\n    },\n    {\n      // Cache the results for 24 hours\n      cacheTime: 1000 * 60 * 60 * 24,\n      staleTime: 1000 * 60 * refreshInterval,\n      enabled: !!configName,\n    },\n  );\n\ninterface RefetchButtonProps {\n  refetch: () => void;\n  isFetching: boolean;\n}\n\nconst RefetchButton = ({ isFetching, refetch }: RefetchButtonProps) => (\n  <ActionIcon\n    size=\"sm\"\n    radius=\"xl\"\n    pos=\"absolute\"\n    right={10}\n    onClick={() => refetch()}\n    bottom={10}\n    styles={{\n      root: {\n        borderColor: 'red',\n      },\n    }}\n  >\n    {isFetching ? <Loader /> : <IconRefresh />}\n  </ActionIcon>\n);\n\nconst InfoDisplay = ({ date, title }: { date: string; title: string | undefined }) => (\n  <Group mt=\"auto\" spacing=\"xs\">\n    <IconClock size={14} />\n    <Text size=\"xs\" color=\"dimmed\">\n      {date}\n    </Text>\n    {title && (\n      <Badge variant=\"outline\" size=\"xs\">\n        {title}\n      </Badge>\n    )}\n  </Group>\n);\n\nconst useStyles = createStyles(({ colorScheme, colors, radius, spacing }) => ({\n  backgroundImage: {\n    position: 'absolute',\n    width: '100%',\n    height: '100%',\n    filter: colorScheme === 'dark' ? 'blur(5px)' : 'blur(5px)',\n    transform: 'scaleX(-1)',\n    opacity: colorScheme === 'dark' ? 0.3 : 0.2,\n    transition: 'ease-in-out 0.2s',\n\n    '&:hover': {\n      opacity: colorScheme === 'dark' ? 0.4 : 0.3,\n      filter: 'blur(40px) brightness(0.7)',\n    },\n  },\n  itemContent: {\n    img: {\n      height: 100,\n      width: 'auto',\n      borderRadius: radius.sm,\n    },\n    blockquote: {\n      marginLeft: 10,\n      marginRight: 10,\n      paddingLeft: spacing.xs,\n      paddingRight: spacing.xs,\n      paddingTop: 1,\n      paddingBottom: 1,\n      borderLeftWidth: 4,\n      borderLeftStyle: 'solid',\n      borderLeftColor: colors.red[5],\n      borderRadius: radius.sm,\n      backgroundColor: colorScheme === 'dark' ? colors.dark[4] : '',\n    },\n  },\n}));\n\nexport default definition;\n"
  },
  {
    "path": "src/widgets/smart-home/entity-state/entity-state.widget.tsx",
    "content": "import { Center, Loader, Stack, Text, Tooltip } from '@mantine/core';\nimport { IconAlertHexagon, IconBinaryTree, IconExclamationMark } from '@tabler/icons-react';\nimport { useTranslation } from 'react-i18next';\nimport { useConfigContext } from '~/config/provider';\nimport { api } from '~/utils/api';\nimport { defineWidget } from '~/widgets/helper';\nimport { WidgetLoading } from '~/widgets/loading';\nimport { IWidget } from '~/widgets/widgets';\n\nconst definition = defineWidget({\n  id: 'smart-home/entity-state',\n  icon: IconBinaryTree,\n  options: {\n    entityId: {\n      type: 'text',\n      defaultValue: 'sun.sun',\n      info: true,\n    },\n    appendUnit: {\n      type: 'switch',\n      defaultValue: false,\n      info: true,\n    },\n    genericToggle: {\n      type: 'switch',\n      defaultValue: false,\n      info: true,\n    },\n    automationId: {\n      type: 'text',\n      info: true,\n      defaultValue: '',\n    },\n    displayName: {\n      type: 'text',\n      defaultValue: 'Sun',\n    },\n    displayFriendlyName: {\n      type: 'switch',\n      defaultValue: false,\n      info: true,\n    },\n  },\n  gridstack: {\n    minWidth: 1,\n    minHeight: 1,\n    maxWidth: 12,\n    maxHeight: 12,\n  },\n  component: EntityStateTile,\n});\n\nexport type ISmartHomeEntityStateWidget = IWidget<(typeof definition)['id'], typeof definition>;\n\ninterface SmartHomeEntityStateWidgetProps {\n  widget: ISmartHomeEntityStateWidget;\n}\n\nfunction EntityStateTile({ widget }: SmartHomeEntityStateWidgetProps) {\n  const { t } = useTranslation('modules/smart-home/entity-state');\n  const { name: configName } = useConfigContext();\n  const utils = api.useUtils();\n\n  const { data, isInitialLoading, isLoading, isError, error } =\n    api.smartHomeEntityState.retrieveStatus.useQuery(\n      {\n        configName: configName!,\n        entityId: widget.properties.entityId,\n      },\n      {\n        enabled: !!configName,\n        refetchInterval: 2 * 60 * 1000,\n      },\n    );\n\n  const attribute = (widget.properties.appendUnit && data?.attributes.unit_of_measurement ?\n    \" \" + data?.attributes.unit_of_measurement : \"\"\n  )\n\n  const displayName = (widget.properties.displayFriendlyName && data?.attributes.friendly_name ?\n    data?.attributes.friendly_name : widget.properties.displayName\n  )\n\n  const { mutateAsync: mutateTriggerAutomationAsync } = api.smartHomeEntityState.triggerAutomation.useMutation({\n    onSuccess: () => {\n      void utils.smartHomeEntityState.invalidate();\n    },\n  });\n\n  const { mutateAsync: mutateTriggerToggleSync } = api.smartHomeEntityState.triggerToggle.useMutation({\n    onSuccess: () => {\n      void utils.smartHomeEntityState.invalidate();\n    },\n  });\n\n  const handleClick = async () => {\n    if (widget.properties.genericToggle) {\n      await mutateTriggerToggleSync({\n        configName: configName as string,\n        widgetId: widget.id,\n      });\n    } \n    \n    if (widget.properties.automationId) {\n      await mutateTriggerAutomationAsync({\n        configName: configName as string,\n        widgetId: widget.id,\n      });\n    }\n  };\n\n  let dataComponent = null;\n\n  if (isError) {\n    dataComponent = (\n      <Tooltip label={error.message} withArrow withinPortal>\n        <IconAlertHexagon color=\"red\" />\n      </Tooltip>\n    );\n  }\n\n  if (!dataComponent && isInitialLoading) {\n    dataComponent = <WidgetLoading />;\n  }\n\n  if (!dataComponent && !data) {\n    dataComponent = (\n      <Tooltip label={t('entityNotFound')} withArrow withinPortal>\n        <IconExclamationMark color=\"red\" />\n      </Tooltip>\n    );\n  }\n\n  if (!dataComponent) {\n    dataComponent = (\n      <Text align=\"center\">\n        {data?.state}\n        {attribute}\n        {isLoading && <Loader ml=\"xs\" size={10} />}\n      </Text>\n    );\n  }\n\n  return (\n    <Center\n      onClick={handleClick}\n      sx={() => {\n        return {\n          cursor: widget.properties.automationId?.length > 0 ? 'pointer' : undefined,\n        };\n      }}\n      h=\"100%\"\n      w=\"100%\">\n      <Stack align=\"center\" spacing={3}>\n        <Text align=\"center\" weight=\"bold\" size=\"lg\">\n          {displayName}\n        </Text>\n        {dataComponent}\n      </Stack>\n    </Center>\n  );\n}\n\nexport default definition;\n"
  },
  {
    "path": "src/widgets/smart-home/trigger-automation/trigger-automation.widget.tsx",
    "content": "import { defineWidget } from '~/widgets/helper';\nimport { IconSettingsAutomation } from '@tabler/icons-react';\nimport { IWidget } from '~/widgets/widgets';\nimport { useConfigContext } from '~/config/provider';\nimport { api } from '~/utils/api';\nimport { Center, Stack, Text } from '@mantine/core';\n\nconst definition = defineWidget({\n  id: 'smart-home/trigger-automation',\n  icon: IconSettingsAutomation,\n  options: {\n    automationId: {\n      type: 'text',\n      info: true,\n      defaultValue: ''\n    },\n    displayName: {\n      type: 'text',\n      defaultValue: 'Sun',\n    },\n  },\n  gridstack: {\n    minWidth: 1,\n    minHeight: 1,\n    maxWidth: 12,\n    maxHeight: 12,\n  },\n  component: TriggerAutomationTile,\n});\n\nexport type ISmartHomeTriggerAutomationWidget = IWidget<(typeof definition)['id'], typeof definition>;\n\ninterface SmartHomeTriggerAutomationWidgetProps {\n  widget: ISmartHomeTriggerAutomationWidget;\n}\n\nfunction TriggerAutomationTile({ widget }: SmartHomeTriggerAutomationWidgetProps) {\n  const { name: configName } = useConfigContext();\n  const utils = api.useUtils();\n\n  const { mutateAsync: mutateTriggerAutomationAsync } = api.smartHomeEntityState.triggerAutomation.useMutation({\n    onSuccess: () => {\n      void utils.smartHomeEntityState.invalidate();\n    }\n  });\n\n  const handleClick = async () => {\n    await mutateTriggerAutomationAsync({\n      configName: configName as string,\n      widgetId: widget.id\n    });\n  }\n\n  return (\n    <Center onClick={handleClick} style={{ cursor: 'pointer' }} h=\"100%\" w=\"100%\">\n      <Stack align=\"center\" spacing={3}>\n        <Text align=\"center\" weight=\"bold\" size=\"lg\">\n          {widget.properties.displayName}\n        </Text>\n      </Stack>\n    </Center>\n  );\n}\n\nexport default definition;"
  },
  {
    "path": "src/widgets/torrent/TorrentQueueItem.tsx",
    "content": "/* eslint-disable @next/next/no-img-element */\nimport {\n  Badge,\n  Flex,\n  Group,\n  List,\n  MantineColor,\n  Progress,\n  Stack,\n  Text,\n  useMantineTheme\n} from '@mantine/core';\nimport {\n  IconAffiliate,\n  IconDatabase,\n  IconDownload,\n  IconFileInfo,\n  IconInfoCircle,\n  IconPercentage,\n  IconSortDescending,\n  IconUpload,\n} from '@tabler/icons-react';\nimport { useTranslation } from 'next-i18next';\nimport { humanFileSize } from '~/tools/humanFileSize';\nimport { AppType } from '~/types/app';\nimport { TorrentTotalDownload } from '~/types/api/downloads/queue/NormalizedDownloadQueueResponse';\n\ninterface TorrentQueueItemProps {\n  torrent: TorrentTotalDownload['torrents'][0];\n  app?: AppType;\n  width: number;\n}\n\nexport const TorrentQueuePopover = ({ torrent, app }: Omit<TorrentQueueItemProps, 'width'>) => {\n  const { t } = useTranslation('modules/torrents-status');\n  const { colors } = useMantineTheme();\n\n  const RatioMetric = () => {\n    const color = (): MantineColor => {\n      if (torrent.ratio < 1) {\n        return colors.red[7];\n      }\n\n      if (torrent.ratio < 1.15) {\n        return colors.orange[7];\n      }\n\n      return colors.green[7];\n    };\n    return (\n      <Group spacing=\"xs\">\n        <Group spacing={3}>\n          <Text>{t('card.popover.metrics.ratio')}</Text>\n\n          <Text color={color()} weight=\"bold\">\n            {torrent.ratio.toFixed(2)}\n          </Text>\n        </Group>\n      </Group>\n    );\n  };\n\n  return (\n    <Stack spacing=\"xs\">\n      {app && (\n        <Group spacing={3}>\n          <Text size=\"xs\" color=\"dimmed\">\n            {t('card.popover.introductionPrefix')}\n          </Text>\n          <img src={app.appearance.iconUrl} alt=\"download client logo\" width={15} height={15} />\n          <Text size=\"xs\" color=\"dimmed\">\n            {app.name}\n          </Text>\n        </Group>\n      )}\n\n      <List>\n        <List.Item icon={<IconFileInfo size={16} />}>\n          <Text\n            style={{\n              display: 'inline-block',\n              wordBreak: 'break-word',\n            }}\n          >\n            {torrent.name}\n          </Text>\n        </List.Item>\n        <List.Item icon={<IconAffiliate size={16} />}>\n          <RatioMetric />\n        </List.Item>\n        <List.Item icon={<IconSortDescending size={16} />}>\n          <Group spacing=\"xs\">\n            <Text>\n              {t('card.popover.metrics.queuePosition', { position: torrent.queuePosition })}\n            </Text>\n          </Group>\n        </List.Item>\n        <List.Item icon={<IconPercentage size={16} />}>\n          <Group spacing=\"xs\">\n            <Text>\n              {t('card.popover.metrics.progress', {\n                progress: (torrent.progress * 100).toFixed(2),\n              })}\n              <Progress\n                color={\n                  torrent.progress === 1 ? 'green' : torrent.state === 'paused' ? 'yellow' : 'blue'\n                }\n                radius=\"md\"\n                size=\"sm\"\n                value={torrent.progress * 100}\n                animate={torrent.state !== 'paused'}\n              />\n            </Text>\n          </Group>\n        </List.Item>\n        <List.Item icon={<IconDatabase size={16} />}>\n          <Text>\n            {t('card.popover.metrics.totalSelectedSize', {\n              totalSize: humanFileSize(torrent.totalSelected, false),\n            })}\n          </Text>\n        </List.Item>\n        <List.Item icon={<IconDownload size={16} />}>\n          <Group spacing=\"xs\">\n            <Text>{humanFileSize(torrent.totalDownloaded, false)}</Text>\n            <IconUpload size={16} />\n            <Text>{humanFileSize(torrent.totalUploaded, false)}</Text>\n          </Group>\n        </List.Item>\n        <List.Item icon={<IconInfoCircle size={16} />}>\n          <Text>\n            {t('card.popover.metrics.state', {\n              state: torrent.stateMessage !== '' ? torrent.stateMessage : torrent.state,\n            })}\n          </Text>\n        </List.Item>\n        <Flex gap=\"sm\" mt=\"md\">\n          {torrent.label && <Badge variant=\"outline\">{torrent.label}</Badge>}\n          {torrent.isCompleted && (\n            <Badge variant=\"dot\" color=\"green\">\n              {t('card.popover.metrics.completed')}\n            </Badge>\n          )}\n        </Flex>\n      </List>\n    </Stack>\n  );\n};\n"
  },
  {
    "path": "src/widgets/torrent/TorrentTile.spec.ts",
    "content": "import { NormalizedTorrent, TorrentState } from '@ctrl/shared-torrent';\nimport { describe, expect, it } from 'vitest';\n\nimport { ITorrent, filterTorrents, getTorrentsRatio } from './TorrentTile';\n\ndescribe('TorrentTile', () => {\n  it('filter torrents when stale', () => {\n    // arrange\n    const widget: ITorrent = {\n      id: 'abc',\n      area: {\n        type: 'sidebar',\n        properties: {\n          location: 'left',\n        },\n      },\n      shape: {},\n      type: 'torrents-status',\n      properties: {\n        labelFilter: [],\n        labelFilterIsWhitelist: false,\n        displayCompletedTorrents: true,\n        displayActiveTorrents: true,\n        speedLimitOfActiveTorrents: 10,\n        displayStaleTorrents: false,\n        displayRatioWithFilter: false,\n        columns: [],\n        nameColumnSize: 0,\n      },\n    };\n    const torrents: NormalizedTorrent[] = [\n      constructTorrent('ABC', 'Nice Torrent', false, 672, 672),\n      constructTorrent('HH', 'I am completed', true, 0, 0),\n      constructTorrent('HH', 'I am stale', false, 0, 0),\n    ];\n\n    // act\n    const filtered = filterTorrents(widget, torrents);\n\n    // assert\n    expect(filtered.length).toBe(2);\n    expect(filtered.includes(torrents[0])).toBe(true);\n    expect(filtered.includes(torrents[1])).toBe(true);\n    expect(filtered.includes(torrents[2])).toBe(false);\n  });\n\n  it('not filter torrents when stale', () => {\n    // arrange\n    const widget: ITorrent = {\n      id: 'abc',\n      area: {\n        type: 'sidebar',\n        properties: {\n          location: 'left',\n        },\n      },\n      shape: {},\n      type: 'torrents-status',\n      properties: {\n        labelFilter: [],\n        labelFilterIsWhitelist: false,\n        displayCompletedTorrents: true,\n        displayActiveTorrents: true,\n        speedLimitOfActiveTorrents: 10,\n        displayStaleTorrents: true,\n        displayRatioWithFilter: false,\n        columns: [],\n        nameColumnSize: 0,\n      },\n    };\n    const torrents: NormalizedTorrent[] = [\n      constructTorrent('ABC', 'Nice Torrent', false, 672, 672),\n      constructTorrent('HH', 'I am completed', true, 0, 0),\n      constructTorrent('HH', 'I am stale', false, 0, 0),\n    ];\n\n    // act\n    const filtered = filterTorrents(widget, torrents);\n\n    // assert\n    expect(filtered.length).toBe(3);\n    expect(filtered.includes(torrents[0])).toBe(true);\n    expect(filtered.includes(torrents[1])).toBe(true);\n    expect(filtered.includes(torrents[2])).toBe(true);\n  });\n\n  it('filter when completed without active torrent', () => {\n    // arrange\n    const widget: ITorrent = {\n      id: 'abc',\n      area: {\n        type: 'sidebar',\n        properties: {\n          location: 'left',\n        },\n      },\n      shape: {},\n      type: 'torrents-status',\n      properties: {\n        labelFilter: [],\n        labelFilterIsWhitelist: false,\n        displayCompletedTorrents: false,\n        displayActiveTorrents: false,\n        speedLimitOfActiveTorrents: 10,\n        displayStaleTorrents: true,\n        displayRatioWithFilter: false,\n        columns: [],\n        nameColumnSize: 0,\n      },\n    };\n    const torrents: NormalizedTorrent[] = [\n      constructTorrent('ABC', 'Nice Torrent', false, 672, 672),\n      constructTorrent('HH', 'I am completed', true, 0, 672),\n      constructTorrent('HH', 'I am stale', false, 0, 0),\n    ];\n\n    // act\n    const filtered = filterTorrents(widget, torrents);\n\n    // assert\n    expect(filtered.length).toBe(2);\n    expect(filtered.at(0)).toBe(torrents[0]);\n    expect(filtered.includes(torrents[1])).toBe(false);\n    expect(filtered.at(1)).toBe(torrents[2]);\n  });\n\n  it('filter when completed with active torrent', () => {\n    // arrange\n    const widget: ITorrent = {\n      id: 'abc',\n      area: {\n        type: 'sidebar',\n        properties: {\n          location: 'left',\n        },\n      },\n      shape: {},\n      type: 'torrents-status',\n      properties: {\n        labelFilter: [],\n        labelFilterIsWhitelist: false,\n        displayCompletedTorrents: false,\n        displayActiveTorrents: true,\n        speedLimitOfActiveTorrents: 10,\n        displayStaleTorrents: true,\n        displayRatioWithFilter: false,\n        columns: [],\n        nameColumnSize: 0,\n      },\n    };\n    const torrents: NormalizedTorrent[] = [\n      constructTorrent('ABC', 'Nice Torrent', false, 672, 672),\n      constructTorrent(\n        'HH',\n        'I am completed and uploading less than 10 ko/s (10239 ≈ 9.99ko/s)',\n        true,\n        0,\n        10239\n      ),\n      constructTorrent(\n        'HH',\n        'I am completed and uploading more than 10 ko/s (10241 ≈ 10.01ko/s)',\n        true,\n        0,\n        10241\n      ),\n      constructTorrent('HH', 'I am completed', true, 0, 0),\n      constructTorrent('HH', 'I am stale', false, 0, 0),\n    ];\n\n    // act\n    const filtered = filterTorrents(widget, torrents);\n\n    // assert\n    expect(filtered.length).toBe(3);\n    expect(filtered.at(0)).toBe(torrents[0]);\n    expect(filtered.includes(torrents[1])).toBe(false);\n    expect(filtered.at(1)).toBe(torrents[2]);\n    expect(filtered.includes(torrents[3])).toBe(false);\n    expect(filtered.at(2)).toBe(torrents[4]);\n  });\n\n  it('filter by label when whitelist', () => {\n    // arrange\n    const widget: ITorrent = {\n      id: 'abc',\n      area: {\n        type: 'sidebar',\n        properties: {\n          location: 'left',\n        },\n      },\n      shape: {},\n      type: 'torrents-status',\n      properties: {\n        labelFilter: ['music', 'movie'],\n        labelFilterIsWhitelist: true,\n        displayCompletedTorrents: true,\n        displayActiveTorrents: true,\n        speedLimitOfActiveTorrents: 10,\n        displayStaleTorrents: true,\n        displayRatioWithFilter: false,\n        columns: [],\n        nameColumnSize: 0,\n      },\n    };\n    const torrents: NormalizedTorrent[] = [\n      constructTorrent('1', 'A sick drop', false, 672, 672, 'music'),\n      constructTorrent('2', 'I cried', true, 0, 0, 'movie'),\n      constructTorrent('3', 'Great Animations', false, 0, 0, 'anime'),\n    ];\n\n    // act\n    const filtered = filterTorrents(widget, torrents);\n\n    // assert\n    expect(filtered.length).toBe(2);\n    expect(filtered.at(0)).toBe(torrents[0]);\n    expect(filtered.at(1)).toBe(torrents[1]);\n    expect(filtered.includes(torrents[2])).toBe(false);\n  });\n\n  it('filter by label when blacklist', () => {\n    // arrange\n    const widget: ITorrent = {\n      id: 'abc',\n      area: {\n        type: 'sidebar',\n        properties: {\n          location: 'left',\n        },\n      },\n      shape: {},\n      type: 'torrents-status',\n      properties: {\n        labelFilter: ['music', 'movie'],\n        labelFilterIsWhitelist: false,\n        displayCompletedTorrents: false,\n        displayActiveTorrents: false,\n        speedLimitOfActiveTorrents: 10,\n        displayStaleTorrents: true,\n        displayRatioWithFilter: false,\n        columns: [],\n        nameColumnSize: 0,\n      },\n    };\n    const torrents: NormalizedTorrent[] = [\n      constructTorrent('ABC', 'Nice Torrent', false, 672, 672, 'anime'),\n      constructTorrent('HH', 'I am completed', true, 0, 0, 'movie'),\n      constructTorrent('HH', 'I am stale', false, 0, 0, 'tv'),\n    ];\n\n    // act\n    const filtered = filterTorrents(widget, torrents);\n\n    // assert\n    expect(filtered.length).toBe(2);\n    expect(filtered.at(0)).toBe(torrents[0]);\n    expect(filtered.includes(torrents[1])).toBe(false);\n    expect(filtered.at(1)).toBe(torrents[2]);\n  });\n\n  it('calcul ratio', () => {\n    // arrange\n    const widget: ITorrent = {\n      id: 'abc',\n      area: {\n        type: 'sidebar',\n        properties: {\n          location: 'left',\n        },\n      },\n      shape: {},\n      type: 'torrents-status',\n      properties: {\n        labelFilter: [],\n        labelFilterIsWhitelist: false,\n        displayCompletedTorrents: false,\n        displayActiveTorrents: false,\n        speedLimitOfActiveTorrents: 10,\n        displayStaleTorrents: true,\n        displayRatioWithFilter: false,\n        columns: [],\n        nameColumnSize: 0,\n      },\n    };\n    const torrents: NormalizedTorrent[] = [constructTorrent('HH', 'I am completed', true, 0, 0)];\n\n    // act\n    const filtered = filterTorrents(widget, torrents);\n    const ratioGlobal = getTorrentsRatio(widget, torrents, false);\n    const ratioWithFilter = getTorrentsRatio(widget, torrents, true);\n\n    // assert\n    expect(filtered.length).toBe(0);\n    expect(filtered.includes(torrents[1])).toBe(false);\n    expect(ratioGlobal).toBe(378535535 / 23024335);\n    expect(ratioWithFilter).toBe(-1); //infinite ratio\n  });\n});\n\nconst constructTorrent = (\n  id: string,\n  name: string,\n  isCompleted: boolean,\n  downloadSpeed: number, // Bytes per second in @ctrl/shared-torrent\n  uploadSpeed: number, // Bytes per second in @ctrl/shared-torrent\n  label?: string\n): NormalizedTorrent => ({\n  id,\n  name,\n  connectedPeers: 1,\n  connectedSeeds: 4,\n  dateAdded: '0',\n  downloadSpeed,\n  eta: 500,\n  isCompleted,\n  progress: 50,\n  queuePosition: 1,\n  ratio: 5.6,\n  raw: false,\n  savePath: '/downloads',\n  state: TorrentState.downloading,\n  stateMessage: 'Downloading',\n  totalDownloaded: 23024335,\n  totalPeers: 10,\n  totalSeeds: 450,\n  totalSize: 839539535,\n  totalSelected: 0,\n  totalUploaded: 378535535,\n  uploadSpeed,\n  label,\n});\n"
  },
  {
    "path": "src/widgets/torrent/TorrentTile.tsx",
    "content": "import {\n  Badge,\n  Center,\n  Flex,\n  Group,\n  Popover,\n  Progress,\n  Stack,\n  Text,\n  Title,\n  createStyles,\n} from '@mantine/core';\nimport { useElementSize } from '@mantine/hooks';\nimport { IconFileDownload } from '@tabler/icons-react';\nimport dayjs from 'dayjs';\nimport duration from 'dayjs/plugin/duration';\nimport relativeTime from 'dayjs/plugin/relativeTime';\nimport { type MRT_ColumnDef, MRT_TableContainer, useMantineReactTable } from 'mantine-react-table';\nimport { useTranslation } from 'next-i18next';\nimport { useMemo, useState } from 'react';\nimport { MIN_WIDTH_MOBILE } from '~/constants/constants';\nimport { calculateETA } from '~/tools/client/calculateEta';\nimport { humanFileSize } from '~/tools/humanFileSize';\nimport {\n  NormalizedDownloadQueueResponse,\n  TorrentTotalDownload,\n} from '~/types/api/downloads/queue/NormalizedDownloadQueueResponse';\n\nimport { useGetDownloadClientsQueue } from '../download-speed/useGetNetworkSpeed';\nimport { defineWidget } from '../helper';\nimport { WidgetLoading } from '../loading';\nimport { IWidget } from '../widgets';\nimport { TorrentQueuePopover } from './TorrentQueueItem';\n\ndayjs.extend(duration);\ndayjs.extend(relativeTime);\n\nconst definition = defineWidget({\n  id: 'torrents-status',\n  icon: IconFileDownload,\n  options: {\n    displayCompletedTorrents: {\n      type: 'switch',\n      defaultValue: true,\n    },\n    displayActiveTorrents: {\n      type: 'switch',\n      defaultValue: true,\n    },\n    speedLimitOfActiveTorrents: {\n      // Unit : kB/s\n      type: 'number',\n      defaultValue: 10,\n    },\n    displayStaleTorrents: {\n      type: 'switch',\n      defaultValue: true,\n    },\n    labelFilterIsWhitelist: {\n      type: 'switch',\n      defaultValue: true,\n    },\n    labelFilter: {\n      type: 'multiple-text',\n      defaultValue: [] as string[],\n    },\n    displayRatioWithFilter: {\n      type: 'switch',\n      defaultValue: true,\n      info: true,\n    },\n    columnOrdering: {\n      type: 'switch',\n      defaultValue: true,\n    },\n    rowSorting: {\n      type: 'switch',\n      defaultValue: true,\n    },\n    columns: {\n      type: 'multi-select',\n      defaultValue: ['up', 'down', 'eta', 'progress'],\n      data: [\n        { value: 'up' },\n        { value: 'down' },\n        { value: 'eta' },\n        { value: 'progress' },\n        { value: 'date' },\n      ],\n    },\n    nameColumnSize: {\n      type: 'slider',\n      defaultValue: 2,\n      min: 1,\n      max: 4,\n      step: 1,\n    },\n  },\n  gridstack: {\n    minWidth: 2,\n    minHeight: 2,\n    maxWidth: 12,\n    maxHeight: 14,\n  },\n  component: TorrentTile,\n});\n\nexport type ITorrent = IWidget<(typeof definition)['id'], typeof definition>;\n\ninterface TorrentTileProps {\n  widget: ITorrent;\n}\n\nfunction TorrentTile({ widget }: TorrentTileProps) {\n  const { t } = useTranslation('modules/torrents-status');\n  const { width, ref } = useElementSize();\n\n  const {\n    data,\n    isError,\n    isInitialLoading,\n    dataUpdatedAt,\n  }: {\n    data: NormalizedDownloadQueueResponse | undefined;\n    isError: boolean;\n    isInitialLoading: boolean;\n    dataUpdatedAt: number;\n  } = useGetDownloadClientsQueue();\n\n  let torrents: TorrentTotalDownload['torrents'] = [];\n  if (!(isError || !data || data.apps.length === 0 || Object.values(data.apps).length < 1)) {\n    torrents = data.apps.flatMap((app) => (app.type === 'torrent' ? app.torrents : []));\n  }\n\n  const filteredTorrents = filterTorrents(widget, torrents);\n\n  const difference = new Date().getTime() - dataUpdatedAt;\n  const duration = dayjs.duration(difference, 'ms');\n  const humanizedDuration = duration.humanize();\n\n  const ratioGlobal = getTorrentsRatio(widget, torrents, false);\n  const ratioWithFilter = getTorrentsRatio(widget, torrents, true);\n\n  const [opened, setOpened] = useState<number>(-1);\n\n  const columns = useMemo<MRT_ColumnDef<TorrentTotalDownload['torrents'][0]>[]>(\n    () => [\n      {\n        id: 'dateAdded',\n        accessorFn: (row) => new Date(row.dateAdded),\n        Cell: ({ cell }) => (\n          <Stack spacing={0}>\n            <Text>{dayjs(cell.getValue() as Date).format('YYYY/MM/DD')}</Text>\n            <Text>{dayjs(cell.getValue() as Date).format('HH:mm')}</Text>\n          </Stack>\n        ),\n        header: t('card.table.header.dateAdded'),\n        maxSize: 1,\n      },\n      {\n        accessorKey: 'name',\n        header: t('card.table.header.name'),\n        Cell: ({ cell, row }) => (\n          <Popover\n            withArrow\n            withinPortal\n            radius=\"lg\"\n            shadow=\"sm\"\n            transitionProps={{\n              transition: 'pop',\n            }}\n            opened={opened === row.index}\n            onChange={(o) => setOpened(() => (o ? row.index : -1))}\n          >\n            <Popover.Target>\n              <Text maw={'30vw'} size=\"xs\" lineClamp={1}>\n                {String(cell.getValue())}\n              </Text>\n            </Popover.Target>\n            <Popover.Dropdown>\n              <TorrentQueuePopover torrent={row.original} app={undefined} />\n            </Popover.Dropdown>\n          </Popover>\n        ),\n        maxSize: widget.properties.nameColumnSize,\n      },\n      {\n        accessorKey: 'totalSelected',\n        header: t('card.table.header.size'),\n        Cell: ({ cell }) => formatSize(Number(cell.getValue())),\n        sortDescFirst: true,\n        maxSize: 1,\n      },\n      {\n        accessorKey: 'uploadSpeed',\n        header: t('card.table.header.upload'),\n        Cell: ({ cell }) => formatSpeed(Number(cell.getValue())),\n        sortDescFirst: true,\n        maxSize: 1,\n      },\n      {\n        accessorKey: 'downloadSpeed',\n        header: t('card.table.header.download'),\n        Cell: ({ cell }) => formatSpeed(Number(cell.getValue())),\n        sortDescFirst: true,\n        maxSize: 1,\n      },\n      {\n        accessorKey: 'eta',\n        header: t('card.table.header.estimatedTimeOfArrival'),\n        Cell: ({ cell }) => formatETA(Number(cell.getValue())),\n        sortDescFirst: true,\n        maxSize: 1,\n      },\n      {\n        accessorKey: 'progress',\n        header: t('card.table.header.progress'),\n        maxSize: 1,\n        Cell: ({ cell, row }) => (\n          <Flex direction=\"column\" w=\"100%\">\n            <Text className={useStyles().classes.noTextBreak}>\n              {(Number(cell.getValue()) * 100).toPrecision(3)}%\n            </Text>\n            <Progress\n              radius=\"lg\"\n              color={\n                Number(cell.getValue()) === 1\n                  ? 'green'\n                  : row.original.state === 'paused'\n                    ? 'yellow'\n                    : 'blue'\n              }\n              value={Number(cell.getValue()) * 100}\n              size=\"md\"\n            />\n          </Flex>\n        ),\n        sortDescFirst: true,\n      },\n    ],\n    [opened]\n  );\n\n  const torrentsTable = useMantineReactTable({\n    columns,\n    data: filteredTorrents,\n    enablePagination: false,\n    enableBottomToolbar: false,\n    enableMultiSort: true,\n    enableColumnActions: false,\n    enableColumnFilters: false,\n    enableRowVirtualization: true,\n    rowVirtualizerProps: { overscan: 20 },\n    mantineTableContainerProps: { sx: { scrollbarWidth: 'none', flex: '1', borderRadius: '0.5rem' } },\n    mantineTableBodyCellProps: { style: { background: 'transparent' } },\n    mantineTableHeadCellProps: {\n      style: { borderTopLeftRadius: '0.5rem', borderTopRightRadius: '0.5rem' },\n    },\n    mantineTableHeadRowProps: {\n      style: { borderTopLeftRadius: '0.5rem', borderTopRightRadius: '0.5rem' },\n    },\n    mantineTableBodyRowProps: ({ row }) => ({\n      onClick: () => setOpened((o) => (o === row.index ? -1 : row.index)),\n    }),\n    enableColumnOrdering: widget.properties.columnOrdering,\n    enableSorting: widget.properties.rowSorting,\n    initialState: {\n      showColumnFilters: false,\n      showGlobalFilter: false,\n      density: 'xs',\n      sorting: [{ id: 'dateAdded', desc: true }],\n      columnVisibility: {\n        isCompleted: false,\n        dateAdded: false,\n        uploadSpeed: false,\n        downloadSpeed: false,\n        eta: false,\n      },\n    },\n    state: {\n      showColumnFilters: false,\n      showGlobalFilter: false,\n      density: 'xs',\n      columnVisibility: {\n        isCompleted: false,\n        dateAdded: widget.properties.columns.includes('date') && width > MIN_WIDTH_MOBILE,\n        uploadSpeed: widget.properties.columns.includes('up') && width > MIN_WIDTH_MOBILE,\n        downloadSpeed: widget.properties.columns.includes('down') && width > MIN_WIDTH_MOBILE,\n        eta: widget.properties.columns.includes('eta') && width > MIN_WIDTH_MOBILE,\n        progress: widget.properties.columns.includes('progress'),\n      },\n    },\n  });\n\n  if (isError) {\n    return (\n      <Stack>\n        <Title order={3}>{t('card.errors.generic.title')}</Title>\n        <Group>\n          <Text>{t('card.errors.generic.text')}</Text>\n        </Group>\n      </Stack>\n    );\n  }\n\n  if (isInitialLoading || !data) {\n    return <WidgetLoading />;\n  }\n\n  if (data.apps.length === 0) {\n    return (\n      <Stack>\n        <Title order={3}>{t('card.errors.noDownloadClients.title')}</Title>\n        <Group>\n          <Text>{t('card.errors.noDownloadClients.text')}</Text>\n        </Group>\n      </Stack>\n    );\n  }\n\n  if (!data || Object.values(data.apps).length < 1) {\n    return (\n      <Center style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n        <Title order={3}>{t('card.table.body.nothingFound')}</Title>\n      </Center>\n    );\n  }\n\n  return (\n    <Flex direction=\"column\" sx={{ height: '100%', isolation: 'isolate' }} ref={ref}>\n      <MRT_TableContainer table={torrentsTable} />\n      <Group spacing=\"sm\">\n        {data.apps.some((x) => !x.success) && (\n          <Badge variant=\"dot\" color=\"red\">\n            {t('card.footer.error')}\n          </Badge>\n        )}\n        <Text color=\"dimmed\" size=\"xs\">\n          {t('card.footer.lastUpdated', { time: humanizedDuration })}\n          {` - ${t('card.footer.ratioGlobal')} : ${\n            ratioGlobal === -1 ? '∞' : ratioGlobal.toFixed(2)\n          }`}\n          {widget.properties.displayRatioWithFilter &&\n            ` - ${t('card.footer.ratioWithFilter')} : ${\n              ratioWithFilter === -1 ? '∞' : ratioWithFilter.toFixed(2)\n            }`}\n        </Text>\n      </Group>\n    </Flex>\n  );\n}\n\nexport const filterTorrents = (widget: ITorrent, torrents: TorrentTotalDownload['torrents']) => {\n  let result = torrents;\n  if (!widget.properties.displayCompletedTorrents) {\n    result = result.filter(\n      (torrent) =>\n        !torrent.isCompleted ||\n        (widget.properties.displayActiveTorrents &&\n          torrent.uploadSpeed > widget.properties.speedLimitOfActiveTorrents * 1024)\n    );\n  }\n\n  if (widget.properties.labelFilter.length > 0) {\n    result = filterTorrentsByLabels(\n      result,\n      widget.properties.labelFilter,\n      widget.properties.labelFilterIsWhitelist\n    );\n  }\n\n  result = filterStaleTorrent(widget, result);\n\n  return result;\n};\n\nconst filterStaleTorrent = (widget: ITorrent, torrents: TorrentTotalDownload['torrents']) => {\n  if (widget.properties.displayStaleTorrents) {\n    return torrents;\n  }\n\n  return torrents.filter((torrent) => torrent.isCompleted || torrent.downloadSpeed > 0);\n};\n\nconst filterTorrentsByLabels = (\n  torrents: TorrentTotalDownload['torrents'],\n  labels: string[],\n  isWhitelist: boolean\n) => {\n  if (isWhitelist) {\n    return torrents.filter((torrent) => torrent.label && labels.includes(torrent.label));\n  }\n\n  return torrents.filter((torrent) => !labels.includes(torrent.label as string));\n};\n\nexport const getTorrentsRatio = (\n  widget: ITorrent,\n  torrents: TorrentTotalDownload['torrents'],\n  applyAllFilter: boolean\n) => {\n  if (applyAllFilter) {\n    torrents = filterTorrents(widget, torrents);\n  } else if (widget.properties.labelFilter.length > 0) {\n    torrents = filterTorrentsByLabels(\n      torrents,\n      widget.properties.labelFilter,\n      widget.properties.labelFilterIsWhitelist\n    );\n  }\n\n  let totalDownloadedSum = torrents.reduce((sum, torrent) => sum + torrent.totalDownloaded, 0);\n\n  return totalDownloadedSum > 0\n    ? torrents.reduce((sum, torrent) => sum + torrent.totalUploaded, 0) / totalDownloadedSum\n    : -1;\n};\n\nconst formatSize = (sizeInBytes: number) => {\n  return humanFileSize(sizeInBytes, false);\n};\n\nconst formatSpeed = (speedInBytesPerSecond: number) => {\n  return `${humanFileSize(speedInBytesPerSecond, false)}/s`;\n};\n\nconst formatETA = (seconds: number) => {\n  return calculateETA(seconds);\n};\n\nconst useStyles = createStyles(() => ({\n  noTextBreak: {\n    whiteSpace: 'nowrap',\n  },\n}));\n\nexport default definition;\n"
  },
  {
    "path": "src/widgets/useNet/UseNetTile.tsx",
    "content": "import { Badge, Button, Group, Select, Stack, Tabs, Text, Title } from '@mantine/core';\nimport { useElementSize } from '@mantine/hooks';\nimport { IconFileDownload, IconPlayerPause, IconPlayerPlay } from '@tabler/icons-react';\nimport dayjs from 'dayjs';\nimport duration from 'dayjs/plugin/duration';\nimport { useSession } from 'next-auth/react';\nimport { useTranslation } from 'next-i18next';\nimport { useEffect, useState } from 'react';\nimport { useConfigContext } from '~/config/provider';\nimport { MIN_WIDTH_MOBILE } from '~/constants/constants';\nimport { humanFileSize } from '~/tools/humanFileSize';\nimport { AppIntegrationType } from '~/types/app';\n\nimport {\n  useGetUsenetInfo,\n  usePauseUsenetQueueMutation,\n  useResumeUsenetQueueMutation,\n} from '../dashDot/api';\nimport { defineWidget } from '../helper';\nimport { IWidget } from '../widgets';\nimport { UsenetHistoryList } from './UsenetHistoryList';\nimport { UsenetQueueList } from './UsenetQueueList';\n\ndayjs.extend(duration);\n\nconst downloadAppTypes: AppIntegrationType['type'][] = ['sabnzbd', 'nzbGet'];\n\nconst definition = defineWidget({\n  id: 'usenet',\n  icon: IconFileDownload,\n  options: {},\n  component: UseNetTile,\n  gridstack: {\n    minWidth: 2,\n    minHeight: 3,\n    maxWidth: 12,\n    maxHeight: 12,\n  },\n});\n\nexport type IUsenetWidget = IWidget<(typeof definition)['id'], typeof definition>;\n\ninterface UseNetTileProps {\n  widget: IUsenetWidget;\n}\n\nfunction UseNetTile({ widget }: UseNetTileProps) {\n  const { t } = useTranslation('modules/usenet');\n  const { config } = useConfigContext();\n  const downloadApps =\n    config?.apps.filter((x) => x.integration && downloadAppTypes.includes(x.integration.type)) ??\n    [];\n  const { ref, width } = useElementSize();\n  const { data: sessionData } = useSession();\n\n  const [selectedAppId, setSelectedApp] = useState<string | null>(downloadApps[0]?.id);\n  const { data } = useGetUsenetInfo({ appId: selectedAppId! });\n\n  useEffect(() => {\n    if (!selectedAppId && downloadApps.length) {\n      setSelectedApp(downloadApps[0].id);\n    }\n  }, [downloadApps, selectedAppId]);\n\n  const pauseAsync = usePauseUsenetQueueMutation({ appId: selectedAppId! });\n  const resumeAsync = useResumeUsenetQueueMutation({ appId: selectedAppId! });\n\n  if (downloadApps.length === 0) {\n    return (\n      <Stack>\n        <Title order={3}>{t('card.errors.noDownloadClients.title')}</Title>\n        <Group>\n          <Text>{t('card.errors.noDownloadClients.text')}</Text>\n        </Group>\n      </Stack>\n    );\n  }\n\n  if (!selectedAppId) {\n    return null;\n  }\n\n  return (\n    <Tabs keepMounted={false} defaultValue=\"queue\">\n      <Tabs.List ref={ref} mb=\"md\" style={{ flex: 1 }} grow>\n        <Tabs.Tab value=\"queue\">{t('tabs.queue')}</Tabs.Tab>\n        <Tabs.Tab value=\"history\">{t('tabs.history')}</Tabs.Tab>\n        {data && (\n          <Group position=\"right\" ml=\"auto\">\n            {width > MIN_WIDTH_MOBILE && (\n              <>\n                <Badge>{humanFileSize(data?.speed)}/s</Badge>\n                <Badge>\n                  {t('info.sizeLeft')}: {humanFileSize(data?.sizeLeft)}\n                </Badge>\n              </>\n            )}\n          </Group>\n        )}\n      </Tabs.List>\n      {downloadApps.length > 1 && (\n        <Select\n          value={selectedAppId}\n          onChange={setSelectedApp}\n          ml=\"xs\"\n          data={downloadApps.map((app) => ({ value: app.id, label: app.name }))}\n        />\n      )}\n      <Tabs.Panel value=\"queue\">\n        <UsenetQueueList appId={selectedAppId} />\n        {sessionData?.user?.isAdmin &&\n          (!data ? null : data.paused ? (\n            <Button\n              uppercase\n              onClick={async () => resumeAsync({ appId: selectedAppId })}\n              radius=\"xl\"\n              size=\"xs\"\n              fullWidth\n              mt=\"sm\"\n            >\n              <IconPlayerPlay size={12} style={{ marginRight: 5 }} /> {t('info.paused')}\n            </Button>\n          ) : (\n            <Button\n              uppercase\n              onClick={async () => pauseAsync({ appId: selectedAppId })}\n              radius=\"xl\"\n              size=\"xs\"\n              fullWidth\n              mt=\"sm\"\n            >\n              <IconPlayerPause size={12} style={{ marginRight: 5 }} />{' '}\n              {dayjs.duration(data.eta, 's').format('HH:mm')}\n            </Button>\n          ))}\n      </Tabs.Panel>\n      <Tabs.Panel value=\"history\" style={{ display: 'flex', flexDirection: 'column' }}>\n        <UsenetHistoryList appId={selectedAppId} />\n      </Tabs.Panel>\n    </Tabs>\n  );\n}\n\nexport default definition;\n"
  },
  {
    "path": "src/widgets/useNet/UsenetHistoryList.tsx",
    "content": "import {\n  Alert,\n  Center,\n  Code,\n  Group,\n  List,\n  Pagination,\n  Popover,\n  Skeleton,\n  Stack,\n  Table,\n  Text,\n  Title,\n} from '@mantine/core';\nimport { useElementSize } from '@mantine/hooks';\nimport { IconAlertCircle, IconClock, IconFileDownload, IconFileInfo } from '@tabler/icons-react';\nimport dayjs from 'dayjs';\nimport duration from 'dayjs/plugin/duration';\nimport { useTranslation } from 'next-i18next';\nimport { FunctionComponent, useState } from 'react';\nimport { parseDuration } from '~/tools/client/parseDuration';\nimport { humanFileSize } from '~/tools/humanFileSize';\n\nimport { useGetUsenetHistory } from '../dashDot/api';\n\ndayjs.extend(duration);\n\ninterface UsenetHistoryListProps {\n  appId: string;\n}\n\nconst PAGE_SIZE = 13;\n\nexport const UsenetHistoryList: FunctionComponent<UsenetHistoryListProps> = ({ appId }) => {\n  const [page, setPage] = useState(1);\n  const { t } = useTranslation(['modules/usenet', 'common']);\n\n  const { ref, width, height } = useElementSize();\n  const durationBreakpoint = 400;\n  const { data, isLoading, isError, error } = useGetUsenetHistory({\n    limit: PAGE_SIZE,\n    offset: (page - 1) * PAGE_SIZE,\n    appId,\n  });\n  const totalPages = Math.ceil((data?.total || 1) / PAGE_SIZE);\n\n  if (isLoading) {\n    return (\n      <>\n        <Skeleton height={40} mt={10} />\n        <Skeleton height={40} mt={10} />\n        <Skeleton height={40} mt={10} />\n      </>\n    );\n  }\n\n  if (isError) {\n    return (\n      <Group position=\"center\">\n        <Alert\n          icon={<IconAlertCircle size={16} />}\n          my=\"lg\"\n          title={t('modules/usenet:history.error.title')}\n          color=\"red\"\n          radius=\"md\"\n        >\n          {t('modules/usenet:history.error.message')}\n          <Code mt=\"sm\" block>\n            {error.message}\n          </Code>\n        </Alert>\n      </Group>\n    );\n  }\n\n  if (!data || data.items.length <= 0) {\n    return (\n      <Center style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n        <Title order={3}>{t('modules/usenet:history.empty')}</Title>\n      </Center>\n    );\n  }\n\n  return (\n    <Stack justify=\"space-around\" spacing=\"xs\">\n      <Table highlightOnHover style={{ tableLayout: 'fixed' }} ref={ref}>\n        <thead>\n          <tr>\n            <th>{t('modules/usenet:history.header.name')}</th>\n            <th style={{ width: 100 }}>{t('modules/usenet:history.header.size')}</th>\n            {durationBreakpoint < width && (\n              <th style={{ width: 200 }}>{t('modules/usenet:history.header.duration')}</th>\n            )}\n          </tr>\n        </thead>\n        <tbody>\n          {data.items.map((history) => (\n            <Popover\n              withArrow\n              withinPortal\n              radius=\"lg\"\n              shadow=\"sm\"\n              transitionProps={{\n                transition: 'pop',\n              }}\n            >\n              <Popover.Target>\n                <tr key={history.id}>\n                  <td>\n                    <Text\n                      size=\"xs\"\n                      style={{\n                        whiteSpace: 'nowrap',\n                        overflow: 'hidden',\n                        textOverflow: 'ellipsis',\n                      }}\n                    >\n                      {history.name}\n                    </Text>\n                  </td>\n                  <td>\n                    <Text size=\"xs\">{humanFileSize(history.size)}</Text>\n                  </td>\n                  {durationBreakpoint < width && (\n                    <td>\n                      <Text size=\"xs\">{parseDuration(history.time, t)}</Text>\n                    </td>\n                  )}\n                </tr>\n              </Popover.Target>\n              <Popover.Dropdown>\n                <List>\n                  <List.Item icon={<IconFileInfo size={16} />}>{history.name}</List.Item>\n                  <List.Item icon={<IconClock size={16} />}>\n                    {parseDuration(history.time, t)}\n                  </List.Item>\n                  <List.Item icon={<IconFileDownload size={16} />}>\n                    {humanFileSize(history.size)}\n                  </List.Item>\n                </List>\n              </Popover.Dropdown>\n            </Popover>\n          ))}\n        </tbody>\n      </Table>\n      {totalPages > 1 && (\n        <Pagination\n          noWrap\n          size=\"sm\"\n          position=\"center\"\n          mt=\"md\"\n          total={totalPages}\n          value={page}\n          onChange={setPage}\n        />\n      )}\n    </Stack>\n  );\n};\n"
  },
  {
    "path": "src/widgets/useNet/UsenetQueueList.tsx",
    "content": "import {\n  Alert,\n  Center,\n  Code,\n  Group,\n  List,\n  Pagination,\n  Popover,\n  Progress,\n  Skeleton,\n  Stack,\n  Table,\n  Text,\n  Title,\n  useMantineTheme,\n} from '@mantine/core';\nimport { useElementSize } from '@mantine/hooks';\nimport {\n  IconAlertCircle,\n  IconClock,\n  IconClockPause,\n  IconFileDownload,\n  IconFileInfo,\n  IconPercentage,\n} from '@tabler/icons-react';\nimport dayjs from 'dayjs';\nimport duration from 'dayjs/plugin/duration';\nimport { useTranslation } from 'next-i18next';\nimport { FunctionComponent, useState } from 'react';\nimport { parseDuration } from '~/tools/client/parseDuration';\nimport { humanFileSize } from '~/tools/humanFileSize';\n\nimport { useGetUsenetDownloads } from '../dashDot/api';\n\ndayjs.extend(duration);\n\ninterface UsenetQueueListProps {\n  appId: string;\n}\n\nconst PAGE_SIZE = 13;\n\nexport const UsenetQueueList: FunctionComponent<UsenetQueueListProps> = ({ appId }) => {\n  const theme = useMantineTheme();\n  const { t } = useTranslation('modules/usenet');\n  const progressbarBreakpoint = parseInt(theme.breakpoints.xs, 10);\n  const progressBreakpoint = 400;\n  const sizeBreakpoint = 300;\n  const { ref, width } = useElementSize();\n\n  const [page, setPage] = useState(1);\n  const { data, isLoading, isError, error } = useGetUsenetDownloads({\n    limit: PAGE_SIZE,\n    offset: (page - 1) * PAGE_SIZE,\n    appId,\n  });\n  const totalPages = Math.ceil((data?.total || 1) / PAGE_SIZE);\n\n  if (isLoading) {\n    return (\n      <>\n        <Skeleton height={40} mt={10} />\n        <Skeleton height={40} mt={10} />\n        <Skeleton height={40} mt={10} />\n      </>\n    );\n  }\n\n  if (isError) {\n    return (\n      <Group position=\"center\">\n        <Alert\n          icon={<IconAlertCircle size={16} />}\n          my=\"lg\"\n          title={t('queue.error.title')}\n          color=\"red\"\n          radius=\"md\"\n        >\n          {t('queue.error.message')}\n          <Code mt=\"sm\" block>\n            {error.message}\n          </Code>\n        </Alert>\n      </Group>\n    );\n  }\n\n  if (!data || data.items.length <= 0) {\n    return (\n      <Center style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n        <Title order={3}>{t('queue.empty')}</Title>\n      </Center>\n    );\n  }\n\n  // TODO: Set ScollArea dynamic height based on the widget size\n  return (\n    <Stack justify=\"space-around\" spacing=\"xs\">\n      <Table highlightOnHover style={{ tableLayout: 'fixed' }} ref={ref}>\n        <thead>\n          <tr>\n            <th style={{ width: '75%' }}>{t('queue.header.name')}</th>\n            {sizeBreakpoint < width ? (\n              <th style={{ width: 100 }}>{t('queue.header.size')}</th>\n            ) : null}\n            <th style={{ width: 60 }}>{t('queue.header.eta')}</th>\n            {progressBreakpoint < width ? (\n              <th style={{ width: progressbarBreakpoint > width ? 100 : 200 }}>\n                {t('queue.header.progress')}\n              </th>\n            ) : null}\n          </tr>\n        </thead>\n        <tbody>\n          {data.items.map((nzb) => (\n            <Popover\n              withArrow\n              withinPortal\n              radius=\"lg\"\n              shadow=\"sm\"\n              transitionProps={{\n                transition: 'pop',\n              }}\n            >\n              <Popover.Target>\n                <tr key={nzb.id}>\n                  <td>\n                    <Text\n                      style={{\n                        whiteSpace: 'nowrap',\n                        overflow: 'hidden',\n                        textOverflow: 'ellipsis',\n                      }}\n                      size=\"xs\"\n                      color={nzb.state === 'paused' ? 'dimmed' : undefined}\n                    >\n                      {nzb.name}\n                    </Text>\n                  </td>\n                  {sizeBreakpoint < width ? (\n                    <td>\n                      <Text size=\"xs\">{humanFileSize(nzb.size)}</Text>\n                    </td>\n                  ) : null}\n                  <td>\n                    {nzb.eta <= 0 ? (\n                      <Text size=\"xs\" color=\"dimmed\">\n                        {t('queue.paused')}\n                      </Text>\n                    ) : (\n                      <Text size=\"xs\">{dayjs.duration(nzb.eta, 's').format('H:mm:ss')}</Text>\n                    )}\n                  </td>\n                  {progressBreakpoint < width ? (\n                    <td style={{ display: 'flex', alignItems: 'center' }}>\n                      <Text mr=\"sm\" style={{ whiteSpace: 'nowrap' }}>\n                        {nzb.progress.toFixed(1)}%\n                      </Text>\n                      {width > progressbarBreakpoint ? (\n                        <Progress\n                          radius=\"lg\"\n                          color={nzb.eta > 0 ? theme.primaryColor : 'lightgrey'}\n                          value={nzb.progress}\n                          size=\"lg\"\n                          style={{ width: '100%' }}\n                        />\n                      ) : null}\n                    </td>\n                  ) : null}\n                </tr>\n              </Popover.Target>\n              <Popover.Dropdown>\n                <List>\n                  <List.Item icon={<IconFileInfo size={16} />}>{nzb.name}</List.Item>\n                  <List.Item icon={<IconPercentage size={16} />}>\n                    {nzb.progress.toFixed(1)}%\n                  </List.Item>\n                  {nzb.state === 'downloading' ? (\n                    <List.Item icon={<IconClock size={16} />}>\n                      {parseDuration(nzb.eta, t)}\n                    </List.Item>\n                  ) : (\n                    <List.Item icon={<IconClockPause size={16} />}>{t('queue.paused')}</List.Item>\n                  )}\n                  <List.Item icon={<IconFileDownload size={16} />}>\n                    {humanFileSize(nzb.size)}\n                  </List.Item>\n                </List>\n              </Popover.Dropdown>\n            </Popover>\n          ))}\n        </tbody>\n      </Table>\n      {totalPages > 1 && (\n        <Pagination\n          noWrap\n          size=\"sm\"\n          position=\"center\"\n          total={totalPages}\n          value={page}\n          onChange={setPage}\n        />\n      )}\n    </Stack>\n  );\n};\n"
  },
  {
    "path": "src/widgets/useNet/types.ts",
    "content": "export interface UsenetQueueItem {\n  name: string;\n  progress: number;\n  /**\n   * Size in bytes\n   */\n  size: number;\n  id: string;\n  state: 'paused' | 'downloading' | 'queued';\n  eta: number;\n}\nexport interface UsenetHistoryItem {\n  name: string;\n  /**\n   * Size in bytes\n   */\n  size: number;\n  id: string;\n  time: number;\n}\n\nexport interface UsenetHistoryRequestParams {\n  appId: string;\n  offset: number;\n  limit: number;\n}\n\nexport interface UsenetHistoryResponse {\n  items: UsenetHistoryItem[];\n  total: number;\n}\n\nexport interface UsenetInfoRequestParams {\n  appId: string;\n}\n\nexport interface UsenetInfoResponse {\n  paused: boolean;\n  sizeLeft: number;\n  speed: number;\n  eta: number;\n}\n\nexport interface UsenetPauseRequestParams {\n  appId: string;\n}\n\nexport interface UsenetQueueRequestParams {\n  appId: string;\n  offset: number;\n  limit: number;\n}\n\nexport interface UsenetQueueResponse {\n  items: UsenetQueueItem[];\n  total: number;\n}\n\nexport interface UsenetResumeRequestParams {\n  appId: string;\n  nzbId?: string;\n}\n"
  },
  {
    "path": "src/widgets/video/VideoFeed.tsx",
    "content": "import { LoadingOverlay, createStyles } from '@mantine/core';\nimport { useEffect, useRef, useState } from 'react';\nimport videojs from 'video.js';\nimport 'video.js/dist/video-js.css';\n\ninterface VideoFeedProps {\n  source: string;\n  muted: boolean;\n  autoPlay: boolean;\n  controls: boolean;\n}\n\nconst VideoFeed = ({ source, controls, autoPlay, muted }: VideoFeedProps) => {\n  const videoRef = useRef(null);\n  const [player, setPlayer] = useState<ReturnType<typeof videojs>>();\n\n  const { classes, cx } = useStyles();\n  useEffect(() => {\n    // make sure Video.js player is only initialized once\n    if (player) {\n      return;\n    }\n\n    const videoElement = videoRef.current;\n    if (!videoElement) {\n      return;\n    }\n\n    setPlayer(videojs(videoElement, { autoplay: autoPlay, muted, controls }, () => {}));\n  }, [videoRef]);\n\n  useEffect(\n    () => () => {\n      if (!player) {\n        return;\n      }\n\n      if (player.isDisposed()) {\n        return;\n      }\n\n      player.dispose();\n    },\n    [player]\n  );\n\n  return (\n    <>\n      <LoadingOverlay visible={player === undefined} />\n      {/* eslint-disable-next-line jsx-a11y/media-has-caption */}\n      <video className={cx('video-js', classes.video)} ref={videoRef}>\n        <source src={source} />\n      </video>\n    </>\n  );\n};\n\nconst useStyles = createStyles(({ radius }) => ({\n  video: {\n    height: '100%',\n    width: '100%',\n    borderRadius: radius.md,\n    overflow: 'hidden',\n  },\n}));\n\nexport default VideoFeed;\n"
  },
  {
    "path": "src/widgets/video/VideoStreamTile.tsx",
    "content": "import { Center, Group, Stack, Title } from '@mantine/core';\nimport { IconDeviceCctv, IconHeartBroken } from '@tabler/icons-react';\nimport { useTranslation } from 'next-i18next';\nimport dynamic from 'next/dynamic';\n\nimport { defineWidget } from '../helper';\nimport { IWidget } from '../widgets';\n\nconst VideoFeed = dynamic(() => import('./VideoFeed'), { ssr: false });\n\nconst definition = defineWidget({\n  id: 'video-stream',\n  icon: IconDeviceCctv,\n  options: {\n    FeedUrl: {\n      type: 'text',\n      defaultValue: '',\n    },\n    autoPlay: {\n      type: 'switch',\n      defaultValue: true,\n    },\n    muted: {\n      type: 'switch',\n      defaultValue: true,\n    },\n    controls: {\n      type: 'switch',\n      defaultValue: false,\n    },\n  },\n  gridstack: {\n    minWidth: 1,\n    minHeight: 1,\n    maxWidth: 12,\n    maxHeight: 12,\n  },\n  component: VideoStreamWidget,\n});\n\nexport type VideoStreamWidget = IWidget<(typeof definition)['id'], typeof definition>;\n\ninterface VideoStreamWidgetProps {\n  widget: VideoStreamWidget;\n}\n\nfunction VideoStreamWidget({ widget }: VideoStreamWidgetProps) {\n  const { t } = useTranslation('modules/video-stream');\n  if (!widget.properties.FeedUrl) {\n    return (\n      <Center h=\"100%\">\n        <Stack align=\"center\">\n          <IconHeartBroken />\n          <Title order={4}>{t('errors.invalidStream')}</Title>\n        </Stack>\n      </Center>\n    );\n  }\n  return (\n    <Group position=\"center\" w=\"100%\" h=\"100%\">\n      <VideoFeed\n        source={widget?.properties.FeedUrl}\n        muted={widget?.properties.muted}\n        autoPlay={widget?.properties.autoPlay}\n        controls={widget?.properties.controls}\n      />\n    </Group>\n  );\n}\n\nexport default definition;\n"
  },
  {
    "path": "src/widgets/weather/WeatherIcon.tsx",
    "content": "import { Box, Tooltip } from '@mantine/core';\nimport {\n  Icon,\n  IconCloud,\n  IconCloudFog,\n  IconCloudRain,\n  IconCloudSnow,\n  IconCloudStorm,\n  IconQuestionMark,\n  IconSnowflake,\n  IconSun,\n} from '@tabler/icons-react';\nimport { useTranslation } from 'next-i18next';\n\ninterface WeatherIconProps {\n  code: number;\n  size?: number;\n}\n\n/**\n * Icon which should be displayed when specific code is defined\n * @param code weather code from api\n * @returns weather tile component\n */\nexport const WeatherIcon = ({ code, size = 50 }: WeatherIconProps) => {\n  const { t } = useTranslation('modules/weather');\n\n  const { icon: Icon, name } =\n    weatherDefinitions.find((wd) => wd.codes.includes(code)) ?? unknownWeather;\n\n  return (\n    <Tooltip withinPortal withArrow label={t(`card.weatherDescriptions.${name}`)}>\n      <Box>\n        <Icon style={{ float: 'left' }} size={size} />\n      </Box>\n    </Tooltip>\n  );\n};\n\ntype WeatherDefinitionType = { icon: Icon; name: string; codes: number[] };\n\n// 0 Clear sky\n// 1, 2, 3 Mainly clear, partly cloudy, and overcast\n// 45, 48 Fog and depositing rime fog\n// 51, 53, 55 Drizzle: Light, moderate, and dense intensity\n// 56, 57 Freezing Drizzle: Light and dense intensity\n// 61, 63, 65 Rain: Slight, moderate and heavy intensity\n// 66, 67 Freezing Rain: Light and heavy intensity\n// 71, 73, 75 Snow fall: Slight, moderate, and heavy intensity\n// 77 Snow grains\n// 80, 81, 82 Rain showers: Slight, moderate, and violent\n// 85, 86Snow showers slight and heavy\n// 95 *Thunderstorm: Slight or moderate\n// 96, 99 *Thunderstorm with slight and heavy hail\nconst weatherDefinitions: WeatherDefinitionType[] = [\n  { icon: IconSun, name: 'clear', codes: [0] },\n  { icon: IconCloud, name: 'mainlyClear', codes: [1, 2, 3] },\n  { icon: IconCloudFog, name: 'fog', codes: [45, 48] },\n  { icon: IconCloud, name: 'drizzle', codes: [51, 53, 55] },\n  { icon: IconSnowflake, name: 'freezingDrizzle', codes: [56, 57] },\n  { icon: IconCloudRain, name: 'rain', codes: [61, 63, 65] },\n  { icon: IconCloudRain, name: 'freezingRain', codes: [66, 67] },\n  { icon: IconCloudSnow, name: 'snowFall', codes: [71, 73, 75] },\n  { icon: IconCloudSnow, name: 'snowGrains', codes: [77] },\n  { icon: IconCloudRain, name: 'rainShowers', codes: [80, 81, 82] },\n  { icon: IconCloudSnow, name: 'snowShowers', codes: [85, 86] },\n  { icon: IconCloudStorm, name: 'thunderstorm', codes: [95] },\n  { icon: IconCloudStorm, name: 'thunderstormWithHail', codes: [96, 99] },\n];\n\nconst unknownWeather: Omit<WeatherDefinitionType, 'codes'> = {\n  icon: IconQuestionMark,\n  name: 'unknown',\n};\n"
  },
  {
    "path": "src/widgets/weather/WeatherTile.tsx",
    "content": "import { Card, Center, Flex, Group, Stack, Text, Title } from '@mantine/core';\nimport { useElementSize } from '@mantine/hooks';\nimport {\n  IconArrowDownRight,\n  IconArrowUpRight,\n  IconCloudRain,\n  IconMapPin,\n} from '@tabler/icons-react';\nimport { useTranslation } from 'react-i18next';\nimport { Weather } from '~/server/api/routers/weather';\nimport { api } from '~/utils/api';\n\nimport { defineWidget } from '../helper';\nimport { WidgetLoading } from '../loading';\nimport { IWidget } from '../widgets';\nimport { WeatherIcon } from './WeatherIcon';\n\nconst definition = defineWidget({\n  id: 'weather',\n  icon: IconCloudRain,\n  options: {\n    displayInFahrenheit: {\n      type: 'switch',\n      defaultValue: false,\n    },\n    displayCityName: {\n      type: 'switch',\n      defaultValue: false,\n    },\n    displayWeekly: {\n      type: 'switch',\n      defaultValue: false,\n    },\n    forecastDays: {\n      type: 'slider',\n      defaultValue: 5,\n      min: 1,\n      max: 7,\n      step: 1,\n    },\n    location: {\n      type: 'location',\n      defaultValue: {\n        name: 'Paris',\n        latitude: 48.85341,\n        longitude: 2.3488,\n      },\n    },\n  },\n  gridstack: {\n    minWidth: 1,\n    minHeight: 1,\n    maxWidth: 12,\n    maxHeight: 12,\n  },\n  component: WeatherTile,\n});\n\nexport type IWeatherWidget = IWidget<(typeof definition)['id'], typeof definition>;\n\ninterface WeatherTileProps {\n  widget: IWeatherWidget;\n}\n\nfunction WeatherTile({ widget }: WeatherTileProps) {\n  const {\n    data: weather,\n    isLoading,\n    isError,\n  } = api.weather.at.useQuery(widget.properties.location, { refetchInterval: 1000 * 60 * 30 });\n  const { width, ref } = useElementSize();\n  const { t } = useTranslation('modules/weather');\n\n  if (isLoading) {\n    return <WidgetLoading />;\n  }\n\n  if (isError) {\n    return (\n      <Center>\n        <Text weight={500}>{t('error')}</Text>\n      </Center>\n    );\n  }\n\n  return (\n    <Stack w=\"100%\" h=\"100%\" justify=\"space-around\" ref={ref} spacing={0} align=\"center\">\n      {(widget?.properties.displayWeekly && (\n        <>\n          <Flex\n            align=\"center\"\n            gap={width < 120 ? '0.25rem' : 'xs'}\n            justify={'center'}\n            direction={'row'}\n          >\n            {widget.properties.displayCityName && (\n              <Group noWrap spacing={5} align=\"center\">\n                <IconMapPin color=\"blue\" size={30} />\n                <Text size={25} style={{ whiteSpace: 'nowrap' }}>\n                  {widget.properties.location.name}\n                </Text>\n              </Group>\n            )}\n            <WeatherIcon size={width < 300 ? 30 : 50} code={weather.current_weather.weathercode} />\n            <Title size={'h2'} color={weather.current_weather.temperature > 20 ? 'red' : 'blue'}>\n              {getPreferredUnit(\n                weather.current_weather.temperature,\n                widget.properties.displayInFahrenheit\n              )}\n            </Title>\n          </Flex>\n          <Forecast weather={weather} widget={widget} />\n        </>\n      )) || (\n        <>\n          <Flex\n            align=\"center\"\n            gap={width < 120 ? '0.25rem' : 'xs'}\n            justify={'center'}\n            direction={width < 200 ? 'column' : 'row'}\n          >\n            <WeatherIcon size={width < 300 ? 30 : 50} code={weather.current_weather.weathercode} />\n            <Title size={'h2'}>\n              {getPreferredUnit(\n                weather.current_weather.temperature,\n                widget.properties.displayInFahrenheit\n              )}\n            </Title>\n          </Flex>\n\n          {width > 200 && (\n            <Group noWrap spacing=\"xs\">\n              <IconArrowUpRight />\n              {getPreferredUnit(\n                weather.daily.temperature_2m_max[0],\n                widget.properties.displayInFahrenheit\n              )}\n              <IconArrowDownRight />\n              {getPreferredUnit(\n                weather.daily.temperature_2m_min[0],\n                widget.properties.displayInFahrenheit\n              )}\n            </Group>\n          )}\n\n          {widget.properties.displayCityName && (\n            <Group noWrap spacing={5} align=\"center\">\n              <IconMapPin height={15} width={15} />\n              <Text style={{ whiteSpace: 'nowrap' }}>{widget.properties.location.name}</Text>\n            </Group>\n          )}\n        </>\n      )}\n    </Stack>\n  );\n}\n\nconst getPreferredUnit = (value: number, isFahrenheit = false): string =>\n  isFahrenheit ? `${(value * (9 / 5) + 32).toFixed(1)}°F` : `${value.toFixed(1)}°C`;\n\ninterface ForecastProps {\n  weather: Weather;\n  widget: IWeatherWidget;\n}\n\nfunction Forecast({ weather: { daily }, widget }: ForecastProps) {\n  const { width } = useElementSize();\n  return (\n    <Flex align=\"center\" direction=\"row\" justify=\"space-between\" w=\"100%\" px=\"sm\">\n      {daily.time.slice(0, widget.properties.forecastDays).map((time: any, index: number) => (\n        <Card key={index} padding=\"0.25rem\">\n          <Flex direction=\"column\" align=\"center\">\n            <Text fw={700} lh=\"1.25rem\">\n              {time.split('-')[2]}\n            </Text>\n            <WeatherIcon size={width < 300 ? 30 : 50} code={daily.weathercode[index]} />\n            <Text fz=\"sm\" lh=\"1rem\">\n              {getPreferredUnit(\n                daily.temperature_2m_max[index],\n                widget.properties.displayInFahrenheit\n              )}\n            </Text>\n            <Text fz=\"sm\" lh=\"1rem\" color=\"grey\">\n              {getPreferredUnit(\n                daily.temperature_2m_min[index],\n                widget.properties.displayInFahrenheit\n              )}\n            </Text>\n          </Flex>\n        </Card>\n      ))}\n    </Flex>\n  );\n}\n\nexport default definition;\n"
  },
  {
    "path": "src/widgets/widgets.ts",
    "content": "import {\n  MultiSelectProps,\n  NumberInputProps,\n  SelectProps,\n  SliderProps,\n  SwitchProps,\n  TextInputProps,\n} from '@mantine/core';\nimport { Icon } from '@tabler/icons-react';\nimport React from 'react';\nimport { IntegrationType } from '~/types/app';\nimport { AreaType } from '~/types/area';\nimport { ShapeType } from '~/types/shape';\n\n// Type of widgets which are saved to config\nexport type IWidget<TKey extends string, TDefinition extends IWidgetDefinition> = {\n  id: string;\n  type: TKey;\n  properties: {\n    [key in keyof TDefinition['options']]: MakeLessSpecific<\n      TDefinition['options'][key]['defaultValue']\n    >;\n  };\n  area: AreaType;\n  shape: ShapeType;\n};\n\n// Makes the type less specific\n// For example when the type true is used as input the result is boolean\n// By not using this type the definition would always be { property: true }\ntype MakeLessSpecific<T> = T extends boolean ? boolean : T;\n\n// Types of options that can be specified for the widget edit modal\nexport type IWidgetOptionValue = (\n  | IMultiSelectOptionValue\n  | ISwitchOptionValue\n  | ITextInputOptionValue\n  | ISliderInputOptionValue\n  | ISelectOptionValue\n  | INumberInputOptionValue\n  | IDraggableListInputValue\n  | IDraggableEditableListInputValue<any>\n  | IMultipleTextInputOptionValue\n  | ILocationOptionValue\n) &\n  ICommonWidgetOptions;\n\n// Interface for data type\ninterface DataType {\n  label?: string;\n  value: string;\n}\n\ninterface ICommonWidgetOptions {\n  info?: boolean;\n  hide?: boolean;\n  infoLink?: string;\n}\n\n// will show a multi-select with specified data\nexport type IMultiSelectOptionValue = {\n  type: 'multi-select';\n  defaultValue: string[];\n  data: DataType[] | (() => DataType[]);\n  inputProps?: Partial<MultiSelectProps>;\n};\n\n// will show a select with specified data\nexport type ISelectOptionValue = {\n  type: 'select';\n  defaultValue: string;\n  data: DataType[] | (() => DataType[]);\n  inputProps?: Partial<SelectProps>;\n};\n\n// will show a switch\nexport type ISwitchOptionValue = {\n  type: 'switch';\n  defaultValue: boolean;\n  inputProps?: Partial<SwitchProps>;\n};\n\n// will show a text-input\nexport type ITextInputOptionValue = {\n  type: 'text';\n  defaultValue: string;\n  inputProps?: Partial<TextInputProps>;\n};\n\n// will show a number-input\nexport type INumberInputOptionValue = {\n  type: 'number';\n  defaultValue: number;\n  inputProps?: Partial<NumberInputProps>;\n};\n\n// will show a slider-input\nexport type ISliderInputOptionValue = {\n  type: 'slider';\n  defaultValue: number;\n  min: number;\n  max: number;\n  step: number;\n  inputProps?: Partial<SliderProps>;\n};\n\n// will show a custom location selector\ntype ILocationOptionValue = {\n  type: 'location';\n  defaultValue: { latitude: number; longitude: number };\n};\n\n// will show a sortable list that can have sub settings\nexport type IDraggableListInputValue = {\n  type: 'draggable-list';\n  defaultValue: {\n    key: string;\n    subValues?: Record<string, any>;\n  }[];\n  items: Record<\n    string,\n    Record<string, Omit<Exclude<IWidgetOptionValue, IDraggableListInputValue>, 'defaultValue'>>\n  >;\n};\n\nexport type IDraggableEditableListInputValue<TData extends { id: string }> = {\n  type: 'draggable-editable-list';\n  defaultValue: TData[];\n  create: () => TData;\n  getLabel: (data: TData) => string | JSX.Element;\n  itemComponent: (props: {\n    data: TData;\n    onChange: (data: TData) => void;\n    delete: () => void;\n  }) => JSX.Element;\n};\n\n// will show a text-input with a button to add a new line\nexport type IMultipleTextInputOptionValue = {\n  type: 'multiple-text';\n  defaultValue: string[];\n  inputProps?: Partial<TextInputProps>;\n};\n\n// is used to type the widget definitions which will be used to display all widgets\nexport type IWidgetDefinition<TKey extends string = string> = {\n  id: TKey;\n  icon: Icon | string;\n  options: {\n    [key: string]: IWidgetOptionValue;\n  };\n  gridstack: {\n    minWidth: number;\n    minHeight: number;\n    maxWidth: number;\n    maxHeight: number;\n  };\n  component: React.ComponentType<any>;\n};\n"
  },
  {
    "path": "tests/pages/auth/login.spec.ts",
    "content": "import { IncomingMessage, ServerResponse } from 'http';\nimport { GetServerSidePropsContext } from 'next';\nimport { SSRConfig } from 'next-i18next';\nimport { ParsedUrlQuery } from 'querystring';\nimport { describe, expect, it, vitest } from 'vitest';\nimport { getServerSideProps } from '~/pages/auth/login';\nimport * as serverAuthModule from '~/server/auth';\n\nimport * as getServerSideTranslationsModule from '../../../src/tools/server/getServerSideTranslations';\n\nvitest.mock('./../../server/auth.ts', () => ({\n  getServerAuthSession: () => null,\n}));\n\nvitest.mock('./../../tools/server/getServerSideTranslations.ts', () => ({\n  getServerSideTranslations: () => null,\n}));\n\ndescribe('login page', () => {\n  it('getServerSideProps should return null redirectAfterLogin when no query value', async () => {\n    // arrange\n    vitest.spyOn(serverAuthModule, 'getServerAuthSession').mockReturnValue(Promise.resolve(null));\n    vitest\n      .spyOn(getServerSideTranslationsModule, 'getServerSideTranslations')\n      .mockReturnValue(Promise.resolve({ _i18Next: 'hello' } as unknown as SSRConfig));\n\n    // act\n    const response = await getServerSideProps({\n      query: {},\n      locale: 'de-DE',\n      req: {},\n      res: {},\n    } as GetServerSidePropsContext<ParsedUrlQuery>);\n\n    // assert\n    expect(response).toStrictEqual({\n      props: {\n        redirectAfterLogin: null,\n        isDemo: false,\n        _i18Next: 'hello',\n        oidcAutoLogin: null,\n        oidcProviderName: null,\n        providers: undefined\n      },\n    });\n\n    expect(serverAuthModule.getServerAuthSession).toHaveBeenCalledOnce();\n    expect(getServerSideTranslationsModule.getServerSideTranslations).toHaveBeenCalledOnce();\n    expect(getServerSideTranslationsModule.getServerSideTranslations).toHaveBeenCalledWith(\n      ['authentication/login'],\n      'de-DE',\n      {},\n      {}\n    );\n  });\n\n  it('getServerSideProps should return url when redirectAfterLogin is local and valid', async () => {\n    // arrange\n    vitest.spyOn(serverAuthModule, 'getServerAuthSession').mockReturnValue(Promise.resolve(null));\n    vitest\n      .spyOn(getServerSideTranslationsModule, 'getServerSideTranslations')\n      .mockReturnValue(Promise.resolve({ _i18Next: 'hello' } as unknown as SSRConfig));\n\n    // act\n    const response = await getServerSideProps({\n      query: {\n        redirectAfterLogin: '/manage/users/create',\n      },\n      locale: 'de-DE',\n      req: {} as IncomingMessage & { cookies: Partial<{ [key: string]: string }> },\n      res: {} as ServerResponse<IncomingMessage>,\n      resolvedUrl: '/auth/login',\n    } as GetServerSidePropsContext<ParsedUrlQuery>);\n\n    // assert\n    expect(response).toStrictEqual({\n      props: {\n        redirectAfterLogin: '/manage/users/create',\n        isDemo: false,\n        _i18Next: 'hello',\n        oidcAutoLogin: null,\n        oidcProviderName: null,\n        providers: undefined\n      },\n    });\n\n    expect(serverAuthModule.getServerAuthSession).toHaveBeenCalledOnce();\n    expect(getServerSideTranslationsModule.getServerSideTranslations).toHaveBeenCalledOnce();\n    expect(getServerSideTranslationsModule.getServerSideTranslations).toHaveBeenCalledWith(\n      ['authentication/login'],\n      'de-DE',\n      {},\n      {}\n    );\n  });\n\n  it('getServerSideProps should return null when url does not match regex', async () => {\n    // arrange\n    vitest.spyOn(serverAuthModule, 'getServerAuthSession').mockReturnValue(Promise.resolve(null));\n    vitest\n      .spyOn(getServerSideTranslationsModule, 'getServerSideTranslations')\n      .mockReturnValue(Promise.resolve({ _i18Next: 'hello' } as unknown as SSRConfig));\n\n    // act\n    const response = await getServerSideProps({\n      query: {\n        redirectAfterLogin: \"data:text/html,<script>alert('hi');</script>\",\n      },\n      locale: 'de-DE',\n      req: {} as IncomingMessage & { cookies: Partial<{ [key: string]: string }> },\n      res: {} as ServerResponse<IncomingMessage>,\n      resolvedUrl: '/auth/login',\n    } as GetServerSidePropsContext<ParsedUrlQuery>);\n\n    // assert\n    expect(response).toStrictEqual({\n      props: {\n        redirectAfterLogin: null,\n        isDemo: false,\n        _i18Next: 'hello',\n        oidcAutoLogin: null,\n        oidcProviderName: null,\n        providers: undefined\n      },\n    });\n\n    expect(serverAuthModule.getServerAuthSession).toHaveBeenCalledOnce();\n    expect(getServerSideTranslationsModule.getServerSideTranslations).toHaveBeenCalledOnce();\n    expect(getServerSideTranslationsModule.getServerSideTranslations).toHaveBeenCalledWith(\n      ['authentication/login'],\n      'de-DE',\n      {},\n      {}\n    );\n  });\n});\n"
  },
  {
    "path": "tests/pages/board/[slug].spec.ts",
    "content": "import { NextApiRequest, NextApiResponse } from 'next';\nimport { SSRConfig } from 'next-i18next';\nimport { ParsedUrlQuery } from 'querystring';\nimport { describe, expect, it, vitest } from 'vitest';\nimport * as serverAuthModule from '~/server/auth';\nimport { ConfigType } from '~/types/config';\n\nimport { getServerSideProps } from '../../../src/pages/board/[slug]';\nimport * as configExistsModule from '../../../src/tools/config/configExists';\nimport * as getFrontendConfigModule from '../../../src/tools/config/getFrontendConfig';\nimport * as getServerSideTranslationsModule from '../../../src/tools/server/getServerSideTranslations';\n\nvitest.mock('./../../server/auth.ts', () => ({\n  getServerAuthSession: () => null,\n}));\n\nvitest.mock('./../../tools/config/getFrontendConfig.ts', () => ({\n  getFrontendConfig: (board: string) => null,\n}));\n\nvitest.mock('./../../tools/config/configExists.ts', () => ({\n  configExists: (board: string) => null,\n}));\n\nvitest.mock('./../../env.js', () => import.meta);\n\nvitest.mock('./../../tools/server/getServerSideTranslations.ts', () => ({\n  getServerSideTranslations: () => null,\n}));\n\nvitest.mock('../../../src/server/api/routers/docker/router.ts', () => ({\n  dockerRouter: () => null,\n}));\n\ndescribe('[slug] page', () => {\n  it('getServerSideProps should return not found when no params', async () => {\n    // arrange\n    vitest.spyOn(configExistsModule, 'configExists').mockReturnValue(false);\n    vitest\n      .spyOn(getFrontendConfigModule, 'getFrontendConfig')\n      .mockReturnValue(Promise.resolve(null as unknown as ConfigType));\n    vitest\n      .spyOn(getServerSideTranslationsModule, 'getServerSideTranslations')\n      .mockReturnValue(Promise.resolve(null as unknown as SSRConfig));\n    vitest.spyOn(serverAuthModule, 'getServerAuthSession').mockReturnValue(Promise.resolve(null));\n\n    // act\n    const response = await getServerSideProps({\n      req: {} as NextApiRequest,\n      res: {} as NextApiResponse,\n      query: {} as ParsedUrlQuery,\n      resolvedUrl: '/board/testing-board',\n    });\n\n    // assert\n    expect(response).toStrictEqual({\n      notFound: true,\n    });\n    expect(configExistsModule.configExists).not.toHaveBeenCalled();\n    expect(getFrontendConfigModule.getFrontendConfig).not.toHaveBeenCalled();\n  });\n\n  it('getServerSideProps should return not found when invalid params', async () => {\n    // arrange\n    vitest.spyOn(configExistsModule, 'configExists').mockReturnValue(false);\n    vitest\n      .spyOn(getFrontendConfigModule, 'getFrontendConfig')\n      .mockReturnValue(Promise.resolve(null as unknown as ConfigType));\n    vitest\n      .spyOn(getServerSideTranslationsModule, 'getServerSideTranslations')\n      .mockReturnValue(Promise.resolve(null as unknown as SSRConfig));\n    vitest.spyOn(serverAuthModule, 'getServerAuthSession').mockReturnValue(Promise.resolve(null));\n\n    // act\n    const response = await getServerSideProps({\n      req: {} as NextApiRequest,\n      res: {} as NextApiResponse,\n      query: {\n        test: 'test',\n      },\n      resolvedUrl: '/board/testing-board',\n    });\n\n    expect(response).toStrictEqual({\n      notFound: true,\n    });\n    expect(configExistsModule.configExists).not.toHaveBeenCalled();\n    expect(getFrontendConfigModule.getFrontendConfig).not.toHaveBeenCalled();\n  });\n\n  it('getServerSideProps should return not found when valid params but no config with said name', async () => {\n    // arrange\n    vitest.spyOn(configExistsModule, 'configExists').mockReturnValue(false);\n    vitest\n      .spyOn(getFrontendConfigModule, 'getFrontendConfig')\n      .mockReturnValueOnce(Promise.resolve(null as unknown as ConfigType));\n    vitest\n      .spyOn(getServerSideTranslationsModule, 'getServerSideTranslations')\n      .mockReturnValue(Promise.resolve(null as unknown as SSRConfig));\n    vitest.spyOn(serverAuthModule, 'getServerAuthSession').mockReturnValue(Promise.resolve(null));\n\n    // act\n    const response = await getServerSideProps({\n      req: {} as NextApiRequest,\n      res: {} as NextApiResponse,\n      query: {},\n      params: {\n        slug: 'testing-board',\n      },\n      resolvedUrl: '/board/testing-board',\n    });\n\n    // assert\n    expect(response).toStrictEqual({\n      notFound: true,\n    });\n    expect(configExistsModule.configExists).toHaveBeenCalledOnce();\n    expect(getFrontendConfigModule.getFrontendConfig).not.toHaveBeenCalled();\n  });\n\n  it('getServerSideProps should return when valid params and config', async () => {\n    // arrange\n    vitest.spyOn(configExistsModule, 'configExists').mockReturnValue(true);\n    vitest.spyOn(getFrontendConfigModule, 'getFrontendConfig').mockReturnValueOnce(\n      Promise.resolve({\n        settings: {\n          access: {\n            allowGuests: false,\n          },\n          customization: {\n            colors: {\n              primary: 'red',\n              secondary: 'blue',\n              shade: 'green',\n            },\n          },\n        },\n      } as unknown as ConfigType)\n    );\n    vitest\n      .spyOn(serverAuthModule, 'getServerAuthSession')\n      .mockReturnValueOnce(Promise.resolve(null));\n    vitest\n      .spyOn(getServerSideTranslationsModule, 'getServerSideTranslations')\n      .mockReturnValue(Promise.resolve(null as unknown as SSRConfig));\n\n    // act\n    const response = await getServerSideProps({\n      req: {} as NextApiRequest,\n      res: {} as NextApiResponse,\n      query: {},\n      params: {\n        slug: 'my-authentication-board',\n      },\n      resolvedUrl: '/board/my-authentication-board',\n    });\n\n    // assert\n    expect(response).toEqual({\n      redirect: {\n        destination: '/auth/login?redirectAfterLogin=/board/my-authentication-board',\n        permanent: false,\n      },\n    });\n    expect(serverAuthModule.getServerAuthSession).toHaveBeenCalledOnce();\n    expect(configExistsModule.configExists).toHaveBeenCalledOnce();\n    expect(getFrontendConfigModule.getFrontendConfig).toHaveBeenCalledOnce();\n  });\n});\n"
  },
  {
    "path": "tests/setupVitest.ts",
    "content": "//setupVitest.js or similar file\nimport { vi } from 'vitest';\nimport createFetchMock from 'vitest-fetch-mock';\n\nconst fetchMocker = createFetchMock(vi);\n\n// sets globalThis.fetch and globalThis.fetchMock to our mocked version\nfetchMocker.enableMocks();\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"es2017\",\n    \"lib\": [\n      \"dom\",\n      \"dom.iterable\",\n      \"esnext\"\n    ],\n    \"allowJs\": true,\n    \"skipLibCheck\": true,\n    \"strict\": true,\n    \"forceConsistentCasingInFileNames\": false,\n    \"noEmit\": true,\n    \"esModuleInterop\": true,\n    \"module\": \"esnext\",\n    \"moduleResolution\": \"node\",\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"jsx\": \"preserve\",\n    \"incremental\": true,\n    \"plugins\": [\n      {\n        \"name\": \"next\"\n      }\n    ],\n    \"paths\": {\n      \"~/*\": [\"./src/*\"]\n    },\n  },\n  \"include\": [\n    \"next-env.d.ts\",\n    \"**/*.ts\",\n    \"**/*.tsx\",\n    \"next.config.js\",\n    \".next/types/**/*.ts\"\n  ],\n  \"exclude\": [\n    \"node_modules\"\n  ],\n  \"ts-node\": {\n    \"compilerOptions\": {\n      \"module\": \"nodenext\",\n    },\n  },\n}\n"
  },
  {
    "path": "turbo.json",
    "content": "{\n\t\"$schema\": \"https://turbo.build/schema.json\",\n\t\"pipeline\": {\n\t\t\"build\": {\n\t\t\t\"outputs\": [\n\t\t\t\t\".next/**\",\n\t\t\t\t\"!.next/cache/**\"\n\t\t\t]\n\t\t}\n\t}\n}"
  },
  {
    "path": "vitest.config.ts",
    "content": "import react from '@vitejs/plugin-react';\nimport tsconfigPaths from 'vite-tsconfig-paths';\nimport { configDefaults, defineConfig } from 'vitest/config';\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n  plugins: [react(), tsconfigPaths()],\n  test: {\n    environment: 'happy-dom',\n    coverage: {\n      provider: 'v8',\n      reporter: ['html', 'json-summary', 'json'],\n      all: true,\n      exclude: ['.next/', '.yarn/', 'data/'],\n    },\n    setupFiles: ['./tests/setupVitest.ts'],\n    exclude: [...configDefaults.exclude, '.next'],\n  },\n});\n"
  }
]